Андроид клик ефект

На всеки Android разработчик се е случвало да след като направи custom бутон или примерно ред от лист, да изчезне click ефекта, показващ че елемента е натиснат.
За да имате пълен контрол върху това Android предлага XML инструмент, с който може да се настройва в кой момент от действията какво събитие да се случва. Направете един .xml файл във Вашия проект (примерно click.xml в директорията drawable) със следния код в него:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_pressed="true"
android:drawable="@drawable/back_button_click" />
<item
android:drawable="@drawable/back_button_normal" />
</selector>

back_button_click и back_button_normal са картинки поставени в директорията drawable.

При натиснато положение на визуалния елемент  ще се покаже първата картинка след което ако елемента се пусне ще се покаже втората картинка, която ще бъде и тази виждащата се при нормално положение на елемента (View-то).

Сега ако зададете на Вашия визуален елемент, за който контролирате действията около click събитието следния ред код:

android:background="@drawable/click"

,където click e името на файла който създадохме и в който сме описали какво кога се случва.

Ами това е много е лесно да се контролира всеки един етап от случващото се във Вашия елемент (View). Разбира се има и други XML атрибути, повече за които може да научите ето от тук Color State List Resource

Андроид стартиране на Activity

Обикновенно създаваните от Вас приложения ще съдържат няколко Activity, които ще имат нужда от предаване на данни по между си с цел визуализиране на някакви резултати.

Следващите редове код показват как става това.
Нека имаме два класа, които наследяват класа Activity – Activity1 и Activity2 т.е. имаме две отделни Activity. Всяко от тях има свой собствен layout (изглед) създаден в .xml файл. Чрез натискането на бутон намиращ се в класа Activity1 искаме да повикаме класа Activity2.
За да направим това, в метода onCreate() на Activity1 трябва да създадем listener, който да следи за onClick() събитието на нашия бутон (next).

next.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

Intent myIntent = new Intent(Activity1.this, Activity2.class);

Activity1.this.startActivity(myIntent);

}

});

Необходимо е да се съдаде нов обект Intent с два параметъра, който да се подаде като параметър на метода startActivity(). Ако искате да знаете кога Activity2 е затворено (унищожено) вместо startActivity() може да използвате startActivityForResult(), който метод обаче изисква и втори параметър – очаквания върнат резултат като int число (може да зададете 0).

Този код ще бъде достатъчен да извика Activity2 и то ще бъде поставено най-отгоре в стека с всички Activity-та на Android операционната система. Ако не Ви е ясно какво точно представлява този Activity стек може да прочетета тази документация.

Андроид предоставя възможност да се подават някакви необходими данни (променливи от прост тип  или обекти) между отделните Activity. Това нещо става като на създадения Intent обект се използва методa putExtra().

String value = "My Name";
myIntent.putExtra("key", value);

В кода на класа Activity2 и по-специално в метода onCreate()  за да използваме подаваните данни ние трябва да напишем:

@Override protected void onCreate(Bundle savedInstanceState) { 
Intent intent = getIntent();
String v = intent.getStringExtra("key");
Log.v("tag","value = "+v);
}
Последната стъпка е да се добави Activity2 в файла AndroidManifest.xml
<activity 
android:label="@string/app_name" 
android:name="Activity2"/>
След като напреднете в правенето на Андроид приложения може би ще Ви се
наложи да разменяте Ваши собствени обкети между отделните Activity.
Към момента демонстрирах как се подава обикновен String обект.
Ако искате да подадете, от едно Activity на друго, Ваш обект е необходимо
Вашият обект да имплементира интерфайса Serializable.
Ето как може да изглежда началото на Вашия клас описващ Вашия обект (MyObject).
@SuppressWarnings("serial")
//Това е анотация казваща да не се покава грешка при имплементирането 
//Serializable
class Deneme implements Serializable {
........
........
}
Подаването на Вашия обект в метода putExtra("key",myVariableForMyObject) остава
 същото както беше и за String-а.
Разликата тук обаче идва при опита да се вземе стойността на Вашия обект
в Activity2. За да получите стойността трябва да използвате
следния код:
MyObject obj = (MyObject) intent.
getSerializableExtra("key");
Реално трябва да се направи кастване до Вашия клас на обекта върнат
 от метода getSerializable().
Дано да съм бил полезен и коректен в обяснението. Моля коментирайте!!!

Андроид използване на SharedPreferences данни

SharedPreferences като може да се досетите от името на Java класа, представлява клас (интерфейс) с помощта на който може да се споделят данни между отделните Activity и класове  изграждащи дадено приложение.

SharedPreferences представлява двойка  име->стойност, т.е. с дадено име може да се достъпи дадена стойност.

За да се вземат всички стойности в SharedPreferences зададени за дадено приложение трябва да се напише следния код:

SharedPreferences myP = Context.getSharedPreferences(“myPrefs”,MODE_WORLD_READABLE);

– “myPrefs” е името с което може да се открият всички зададени данни отнасящи се за дадено приложение.

– MODE_WORLD_READABLE е режима в който ще се използват данните. Може също да се използва и друг режим например MODE_PRIVATE

Сега обекта myP ще съдържа всички данни споделени за приложението.

За да се вземат точно определени данни (например String зададен с “myName”) от SharedPreferences  се пише:

String name = myP.getString(“myName”, “nothing”);

Първия параметър на getString() е зададеното име за данните, а втория е каква стойност да се върне ако не бъдат открити данни за “myName”.

В SharedPreferences  могат да се задават освен String данни и данни от тип boolean, int и float. Не е възможно да се задават double данни.

Една добра практика при използването на SharedPreferences  е да се направи проверка за липса на стойност за желаните данни т.е. дали данните съществуват в SharedPreferences. Ето как може да стане това:

String name = myP.getString(“myName”, null);
 if ( name ==  null ) {
SharedPreferences.Editor prefEditor = myP.edit();
prefEditor.putString(“myName”, “Nikolay”);
prefEditor.commit();
name = myP.getString(“myName”, null);
}
В if условието е показано как може да се запишат промени за конкретни данни. По този начин могат да се създават нови записи в SharedPreferences.
Трябва да се извика SharedPreferences.Editor като целта му е да се променят данните за обекта myP. След което чрез putString(name,value) се задава стойността за “myName”.
Чрез prefEditor.commit() се запомнят промените в SharedPreferences.
Ами в общи линии това са трите операции (четене, записване и проверка) около SharedPreferences обекта. Моля коментирайте и помогнете да направим разработването на приложение по-добро.

Андроид създаване на табове (TabLayout)

 

Всяко едно приложение изглежда много добре, когато е изпълнено с табове. Тук ще ви покажа как в действителност да направите това. На снимката е показано как би могло да изглежда приложението. Разбира се Вашите табове могат да бъдат с текст не с икони, но това е въпрос на избор.

Първото нещо което трябва да направите е да поставите иконите (картинките) за отделните табове в директорията res\drawable от Вашия проект.  Размерите могат да бъдат различни , например 32×32 или 48×48, това е също въпрос на преценка.

Второто нещо което трябва да се направи е отново в същата директория да се създадат 4 нови xml файла, които ще указват на табовете да използват иконите. Ако не желаете да използвате икони може да пропуснете тази стъпка. Ето и съдържанието на всеки един от четирите файла.

Файл: icon_android_config.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item 
android:drawable="@drawable/ic_tab_android"
android:state_selected="true" />
<item android:drawable="@drawable/ic_tab_android" />
</selector>

Файл: icon_apple_config.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<item 
android:drawable="@drawable/ic_tab_apple" android:state_selected="true" /> 
<item  
android:drawable="@drawable/ic_tab_apple" /> 
</selector>
 Файл: icon_blackberry_config.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item 
android:drawable="@drawable/ic_tab_blackberry" 
android:state_selected="true" /> 
<item 
android:drawable="@drawable/ic_tab_blackberry" />
</selector>
Файл: icon_windows_config.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_tab_windows"
          android:state_selected="true" />
    <item android:drawable="@drawable/ic_tab_windows" />
</selector>

Следващата стъпка е да се създадат 4 класа, които ще представляват Activity-тата за всеки един от табовете. Ето как може да изглеждат тези класове:

Файл: AndroidActivity.java

package com.sniper.android; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class AndroidActivity extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView textview = new TextView(this); textview.setText("This is Android tab"); setContentView(textview); } }

Файл: AppleActivity.java


package com.sniper.android; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class AppleActivity extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView textview = new TextView(this); textview.setText("This is Apple tab"); setContentView(textview); } }

Файл: BlackBerryActivity.java


package com.sniper.android; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class BlackBerryActivity extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView textview = new TextView(this); textview.setText("This is BlackBerry tab"); setContentView(textview); } }

Файл: WindowsActivity.java

package com.sniper.android; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class WindowsActivity extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView textview = new TextView(this); textview.setText("This is Windows mobile tab"); setContentView(textview); } }

Основното Activity т.е. Activity което се стартира при пускане на програмата, трябва да бъде наследник на класа TabActivity. В него ще се свързват класовете на всички отделни табове. Ето как може да изглежда този файл:

Файл: MainActivity.java

package com.sniper.android; import android.app.TabActivity; import android.content.Intent; import android.content.res.Resources; import android.os.Bundle; import android.widget.TabHost; import android.widget.TabHost.TabSpec; public class MainActivity extends TabActivity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Resources ressources = getResources(); TabHost tabHost = getTabHost(); // Кода за Android tab Intent intentAndroid = new Intent().setClass(this, AndroidActivity.class); TabSpec tabSpecAndroid = tabHost .newTabSpec("Android") .setIndicator("", ressources.getDrawable(R.drawable.icon_android_config)) .setContent(intentAndroid); // Кода за Apple tab Intent intentApple = new Intent().setClass(this, AppleActivity.class); TabSpec tabSpecApple = tabHost .newTabSpec("Apple") .setIndicator("", ressources.getDrawable(R.drawable.icon_apple_config)) .setContent(intentApple); // Кода за Windows tab Intent intentWindows = new Intent().setClass(this, WindowsActivity.class); TabSpec tabSpecWindows = tabHost .newTabSpec("Windows") .setIndicator("", ressources.getDrawable(R.drawable.icon_windows_config)) .setContent(intentWindows); // Кода за Blackberry tab Intent intentBerry = new Intent().setClass(this, BlackBerryActivity.class); TabSpec tabSpecBerry = tabHost .newTabSpec("Berry") .setIndicator("", ressources.getDrawable(R.drawable.icon_blackberry_config)) .setContent(intentBerry); // вмъкваме всички tabs в обекта TabHost tabHost.addTab(tabSpecAndroid); tabHost.addTab(tabSpecApple); tabHost.addTab(tabSpecWindows); tabHost.addTab(tabSpecBerry); //задаваме таб по подразбиране (броенето е от 0) tabHost.setCurrentTab(2); } }

Предпоследната стъпка от нашата програма е да се създаде Layout-та за MainActivity-то. Ето как би могъл да изглежда той:

Файл: res/layout/main.xml

<?xml version=”1.0″ encoding=”utf-8″?>
<TabHost xmlns:android=”http://schemas.android.com/apk/res/android”

android:id=”@android:id/tabhost”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”>

<LinearLayout

android:orientation=”vertical”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:padding=”5dp”>

<TabWidget

android:id=”@android:id/tabs”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content” />

<FrameLayout

android:id=”@android:id/tabcontent”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:padding=”5dp” />

</LinearLayout>

</TabHost>

Последното действие е да се направят корекциите в Manifest файла на приложението, където трябва да се декларират новите Activity-та и да се зададе началния изглед. Ето как трябва да изглежда Вашия файл:

Файл: AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.sniper.android" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".AndroidActivity" /> <activity android:name=".WindowsActivity" /> <activity android:name=".AppleActivity" /> <activity android:name=".BlackBerryActivity" /> <activity android:label="@string/app_name" android:name=".MainActivity" android:theme="@android:style/Theme.NoTitleBar" > <intent-filter > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>

 

Като допълнение към този пост искам да Ви покажа, как може да споделяте общи променливи (данни) между отделните табове, без да има нужда всеки път явно да създавате Bundle и Intent обекти.

Нека да споделим две променливи между всички Activity съставящи табовете. Едната променлива да бъде от тип int, а другата от тип String. За целта първото нещо което трябва да направим е да дефинираме в класа MainActivity нашите две променливи като public final static. Сега трябва малко да променим началото на класа MainActivity като той трябва да изглежда така:

public class MainActivity extends TabActivity {
public final static int age;
public final static String name;
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
MainActivity.age = 15;
MainActivity.name = "Ivan Stankov";
.......
остава си стария код
.......
}
}

Сега ако искаме да използваме стойностите на тези две променливи някъде в кода, примерно в AndroidActivity класа, може просто да напишем MainActivity.name и MainActivity.age. По този начин могат да се предават всякакви обекти между отделните табове изграждащи приложението ни.

Другата особеност е, че във всяко едно от четирите Activity изграждащи MainActivity могат да се зададат нови стойности за age и name (примерно MainActivity.age = 100😉  ) след което новата стойност може да бъде използвана отново от всички.

Поста е реализиран със съдействието на www.mkyong.com

Надявам се всичко е ясно и добре описано. Благодаря за вниманието, коментирайте моля!!!

Използване на include XML при Android приложения

Здравейте,

В следващия пост ще покажа как и в кои случаи е добре да се използва include атрибута от XML layout файловете.

Предполагам знаете, че XML layout файловете (т.е. файловете в които се описва графичната част на Вашите приложения) се намират в директорията layout. Много често може да се случи даден компонент да се повтаря няколко пъти в приложението. Например искаме да имаме брояч с бутони нагоре надолу и този брояч да се показва в няколко Activity.

Както при писането на код (чрез методи – функции) така и тук при изработването на изгледите (layouts) има начин повтарящите се кодове да се преизползват. Този начин е чрез използването на  include.

За целта ще създадем нов XML файл (numeric_stepper.xml)  в директорията layout  като този файл ще съдържа само елементи необходими за построяване на брояч (numeric_stepper). Ето как може да изглежда един такъв брояч.

numeric stepper

 

 

 

 

 

 

За да построим този брояч в нашия layout, ще ни трябват следните стандартни Android елементи: 1 елемент EditText  и 2 елемента Button. Ето и кода на numeric_stepper.xml:

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizonal" />
<EditText
android:id="@+id/stepper_value"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.6"
android:hint="Enter value"
android:inputType="number"
</EditText>
<TableLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.4">
<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:id=@+id/up
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</Button>
</TableRow>
<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:id=@+id/down
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</Button>
</TableRow>
</TableLayout>
</LinearLayout>

За да използваме този създаден от нас графичен компонент, в
изглед (например mainlayout.xml) на едно Activity (например за MainActivity.java), може да напишем в layout файла mainlayout.xml :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width=”match_parent” 
android:layout_height=”match_parent” 
android:gravity="center_horizontal">
<include 
android:id=”@+id/numeric_stepper” 
android:layout_width=”match_parent” 
android:layout_height=”match_parent” 
layout=”@layout/numeric_stepper”/>
 <TextView 
android:layout_width=”match_parent” 
android:layout_height="wrap_content"
android:text="@string/hello"
android:padding="10dp" /> 
...
</LinearLayout>

По този начин на мястото на include тага Android ще постави всички
компонентите дефинирани в numeric_stepper.xml. Ако желаем същия този
наш компонент може да бъде използван и в други Activity
изграждащи приложението, а дори нещо повече може да бъде използван
и в същото Activity, но на друго място.
 И накрая искам да Ви покажа как да достъпвате елементите
изграждащи нашият компонент. Например за да достъпим и инициализираме
бутона с id = "up", в кода на Activity-то, което го използва
трябва да се напише:
View includeView = findViewById(R.id.numeric_stepper);
Button up = (Button) includeView.findViewById(R.id.up);
 Първо се инициализира обекта съдържащ нашия компонент и след това с
негова помощ се инициализира бутона "up".
Надявам се съм бил полезен и съм дал поводи за коментари!!!

Android кастване на променливи

Принципно тази тема не е в частност само за Android платформата, тя е основна за Java като език за програмиране. Въпреки това считам, че следващите няколко реда код ще бъдат много полезни за всеки Android програмист, който не само разработва приложения, но и държи същите да използват по-малко ресурси от тяхното мобилно устройство.
Може би на всеки Java програмист се е случвало, всичко в кода му да изглежда наред, а при компилацията приложението да не се стартира (“гърми”) давайки някаква грешка. В много от случайте, това може би се дължи на неправилно кастване (превръщане на данните от един тип в друг). Съществуват каствания само между примитивни типове данни (byte,short,int,float), само между обекти (String, View и т.н.) и такива между премитивни типове данни и обекти.
Ще Ви покажа няколко от по-често използваните варианти на cast като искам да отбележа, че съществуват и много други.

1. Кастване от int към byte

int iNum = 123;

byte num = (byte) iNum;

2. Кастване от byte към int

byte num = 127;
int iNum= (int)num & 0xff;

3. Кастване от int към float

int xNum = 5;

int yNum = 9;

float xy  = (float) x/y;

4. Кастване от float към  int

float fNum = “23.50”;

int iNum = (intMath.round(fNum);

5. Кастване от String към int

String str = “100”;

int iNum = Integer.parseInt(str);

6. Кастване от String към byte

String str = “100”;

byte num = (byte) Integer.parseInt(str);

7. Кастване от String към float

String str = “120.56”;

float fNum = Float.valueOf(str);

8. Кастване от Ваш Обект към String

Ако Вашия обект няма правилното представяне като String е необходимо метода toString(), който е метод на Object обекта,  да бъде предефиниран (Override) в класа на Вашия обект. Пример:

Нека имаме собствен клас Person изглеждащ така –

public class Person{

private firstName = “Иван”;

private lastName = “Иванов”;

@Override

toString(){

return (“Човека се казва “+this.firstName+” “+this.lastName());

}

}

Сега вече във Вашия код може да се използва  –

Person pr= new Person();

String prName = pr.toString();

 9.  Кастване от един Обект към друг Обект

View mybutton = viewFindViewById(R.id.mybutton);

Button bt = (Button) mybutton;

Забележка: Кастване от един обект към друг обект не във всички случаи е възможно.

Качване на проложение в Android Market (Google Play)

Всички разработчици за Android рано или късно ще трябва да качат (upload) своите Android Application в магазина(Google Play) за такива приложения. Ето как става това стъпка по стъпка с помощта на Eclipse.

  • В Eclipse отворете проекта, който искате да качите.
  • Натиснете десен бутон на мишката върху папката на проекта и изберете Export ->Export Android Application.
  • В новоотворения прозорец ще имате възможност да избирате keystore.
    Това е един вид Вашия личен ключ за заключване на съответното приложение.image keystore creationАко качвате за пръв път приложение и изберете “use existing keystore” Eclipse, ще предложи един вариант за keystore, който е създаден по default. Паролата за default keystore е “android”.  Не е добре да се използва той, защото Google Play няма да разреши качването на приложение създадено от debugging key-я по подразбиране. Затова ако това е първото Ви проложение и нямате собствен  keystore, изберете “create new keystore” опцията.

    Ако вече имате създаден keystore естествено избирате “use existing keystore” след което задавате Вашия ключ.

    Лично аз си мисля, че ако имате собствен keystore Вие няма да четете този пост, поради тази причина продължавам обясненията с това как да създадем собствен ключ.

    В прозореца Key Creation всички полета трябва да се попълнят, но най-важни са полета password и validity (years)

    create new keystore

     

     

     

     

     

     

     

     

     

     

     

    Паролата трябва да бъде минимум 6 знака, аз за годините може да зададете 50.

  • След като всички полета са попълнени преминете нататък.
  • В последната стъпка от подготовката на Вашето приложение, за качване в Google Play Store, укажете на Eclipse къде да запази новосъздаденият .apk файл. Съветът ми тук е да запазвате приложенията си в отделна директория, за която ще знаете че съдържа само подготвените .apk файлове за Android Store.  В последствие в тази директория може да съхранявате и screenshot-овете  за всяко приложение.
  • Следващата стъпка е да влезете (login) във Вашия Google акаунт. Ако нямате създаден такъв (в което аз се съмнявам) е необходимо да си направите gmail поща, след което да влезете от тук http://market.android.com/publish.
  • Целта е да сте регистриран в Google Android market като разработчик на приложения. След като настройте Вашия профил там и приемете  Android Market Developer Distribution Agreement, ще трябва да заплатите (еднократно) сумата от 25$. Парите могат да бъдат платени с кредитна или дебитна карта като това е единствената сума необходима за качвате на Вашите приложения в Android Market.
  • Последната стъпка от целия процес е да качите реално приложението в Android Market-a. Тук вече трябва да се намирате в началната страница на Вашия профил в Google и да изберете бутона  “Upload an Application”. Следва стъпка в която трябва да настойте всичко около Вашето приложение. Нещата са доста и Google ще Ви връща ако нещо не е както трябва.

Ще Ви дам списък с предварителните неща който трябва да подготвите за  настройките на приложението:

  1.  Пътя до .apk файла създаден с keystore;
  2. Минимум два screenshot-a на Вашето приложение в PNG и JPEG формати със следните размери(320×480, 480×800, 480×854, 1280×720, 1280×800);
  3. Задължителна икона (PNG формат) с висика резолюция (512×512) на Вашето приложение;
  4. Текст съдържащ описанието на приложението

Разбира се има още доста настройки, но това са тези, които е добре предварително да сте подготвили. Не се притеснявайте по всяко време може да се правят промени на настройките.

Благодаря за вниманието, моля коментирайте!!!

Филтър за търсене в сайт (PHP и JavaScript)

В този пост ще Ви покажа как да направите филтър за търсене на информация във Вашия сайт. Първото нещо което трябва да направите е си създадете Вашата HTML форма, в която да заложите всички критерии, с които ще се извършва търсенето. Ето една примерна форма:

<form id=”searchingFilter”>

<label for=”criteri_1″>Критерийй 1:</label>
<select name=”criteri_1″ class=”srcr”>

<option value=”0″>All</option>
<option value=”1″>Option 1</option>
<option value=”2″>Option 2</option>

</select>
<label for=”criteri_2″>Критерийй 2:</label>
<select name=”criteri_2″ class=”srcr”

<option value=”0″>All</option>
<option value=”1″>Option 1</option>
<option value=”2″>Option 2</option>

</select>
<label for=”criteri_3″>Критерийй 3:</label>
<select name=”criteri_3″ class=”srcr”>

<option value=”0″>All</option>
<option value=”1″>Option 1</option>
<option value=”2″>Option 2</option>

</select>

<input type=”submit” value=”изпрати” />

</form>

Имаме 3 select елемента чрез които ще се задават нашите критерии за търсене.

Следващото нещо което ни е необходимо това е JavaScript кода, който ще събира всички зададени критерии от нашите select елементи, ще ги поставя в един JavaScript обект и последствие ще ги изпраща чрез Ajax заявка към скрипт намиращ се на сървъра. Ето и необходимия ни код:

<script type=”text/javascript”>

$(‘#searchingFilter’).submit(function($e){

$e.preventDefault();

//създаваме собствен обект
var myobj = new Object();

//вземаме стойностите на всички select елементи

$(‘select.srcr’).each(function(){

myobj[($(this).attr(“name”))] =$(this).val();

});

var json = JSON.stringify(myobj);

//извършваме Ajax заявка към serverScript.php
$.post(“serverScript.php”,{‘myobj’:json},function(returned_data){

eval(“var data =”+returned_data);

console.log(data.result);

});

});

</script>

Разбира се във филтъра за търсене може да се включат и други HTML елементи за входни данни. За някои от тях, които приемат текст набран от клавиатурата може да се наложи да направите верификация.

Последната част от филтъра ни за търсене е PHP частта (т.е. съдържанието на файла serverScript.php).

<?php

require_once ‘DBConnection.php’;

//вземаме нашия обект изпратен от JS
$result = jsonString2Object($_POST[‘myobj’]);

$query =”SELECT * FROM table WHERE

field1 LIKE ‘%”.$result->criteri_1.”%’ AND
field2 LIKE ‘%”.$result->criteri_2.”%’ AND
field3 LIKE ‘%”.$result->criteri_3.”%’ ‘”;

$result = mysql_query($query) or die(mysql_error());

//създаваме php масив 
$arr_obj = array();
$arr_obj[‘rows’] = mysql_num_rows($result);

if($arr_obj[‘rows’] > 0) $arr_obj[‘rows’]  = ‘Намерани са ‘.$arr_obj[‘rows’].’ записа’;

else $arr_obj[‘rows’] = ‘Няма намерени данни’;

//връщаме php масива съдържащ резултата

echo json_encode($arr_obj);

?>

Ако всичко е наред след задаване на критериите и натискането на бутона “изпрати” трябва да получите съобщение в конзолата за броя на откритите резултати в Базата Данни.

Едно малко допълнение за по-начинаещите. В заявката към базата дани

$query =”SELECT * FROM table WHERE

field1 LIKE ‘%”.$result->criteri_1.”%’ AND 
field2 LIKE ‘%”.$result->criteri_2.”%’ AND
field3 LIKE ‘%”.$result->criteri_3.”%’ ‘”;

на мястото на table поставете името на Вашата таблица, в която ще търсите записи. На местата на field1,field2,field3 поставете имената на колоните от таблицата, за които се извършва търсенето.