Ajax Kurs od podstaw Część 5 Wyszukiwarka

background image

30.08.2012

Ajax. Kurs od podstaw. Część 5: Wyszukiwarka

1/14

gajdaw.pl/ajax/ajax-wyszukiwarka/print.html

Ajax. Kurs od podstaw. Część 5: Wyszukiwarka

Włodzimierz Gajda

Wyszukiwarki, które wykorzystują Ajax, stosują liczne udogodnienia. Częstymi rozwiązaniami są

podpowiadanie, automatyczne uruchamianie wyszukiwania po upływie kilku sekund oraz animacje.

Główną cechą, która odróżnia wyszukiwarkę Ajax-ową od rozwiązań tradycyjnych, nie są jednak atrakcje

wizualne, a fakt, że wyniki wyszukiwania pojawiają się bez przeładowania strony.

Spis treści

1. Działanie tradycyjnej wyszukiwarki

2. Działanie wyszukiwarki Ajax-owej

3. Implementacja wyszukiwarki tradycyjnej

3.1 Podstrony i adresy URL

3.2 Formularz wyszukiwania

3.3 Menu strony

3.4 Wyszukiwanie

3.5 Wybór treści witryny

4. Implementacja wyszukiwarki Ajax-owej

4.1 Skrypt

server.php

4.2 Zmiany w kodzie HTML

4.3 Przeładowanie fragmentu

5. Podsumowanie

1. Działanie tradycyjnej wyszukiwarki

Wyszukiwarka treści na witrynie WWW jest dostępna w postaci formularza, który posiada wiersz

background image

30.08.2012

Ajax. Kurs od podstaw. Część 5: Wyszukiwarka

2/14

gajdaw.pl/ajax/ajax-wyszukiwarka/print.html

wprowadzania danych oraz przycisk Szukaj. Przykładowa witryna zawierająca wyszukiwarkę jest

przedstawiona na rysunku 1.

Rysunek 1. Witryna z formularzem do wyszukiwania treści

Użytkownik wprowadza w formularzu dowolny wyraz, na przykład

nie

, po czym naciska przycisk

Szukaj

. Działanie takie powoduje przejście do nowej strony WWW, która zawiera wyniki wyszukiwania.

Lista wyników wyszukiwania może zawierać tytuły podstron wraz z informacją o tym, ile razy podane

słowo występuje w treści (rysunek 2).

background image

30.08.2012

Ajax. Kurs od podstaw. Część 5: Wyszukiwarka

3/14

gajdaw.pl/ajax/ajax-wyszukiwarka/print.html

Rysunek 2. Wyniki wyszukiwania słowa

nie

Znalezione informacje są przedstawiane w postaci listy hiperłączy. Po wybraniu jednego z hiperłączy,

przechodzimy do strony, która będzie zawierała wyszukiwane słowo. Innymi słowy ze strony z rysunku 2

przechodzimy z powrotem do strony z rysunku 1 (ewentualnie z treścią innej piosenki).

Rozwiązanie tradycyjne składa się więc z dwóch rodzajów podstron. Pierwszym rodzajem są podstrony z

tekstem wybranej piosenki (rysunek 1), a drugim — podstrony prezentujące wyniki wyszukiwania

(rysunek 2).

2. Działanie wyszukiwarki Ajax-owej

Gdy wyszukiwarkę wzbogacimy o technologię Ajax, wówczas wyniki wyszukiwania są prezentowane bez

przeładowania strony. Po naciśnięciu przycisku

Szukaj

na stronie pojawia się nowy element

div

,

zawierający wyniki wyszukiwania. Na rysunku 3 element ten został otoczony obramowaniem.

background image

30.08.2012

Ajax. Kurs od podstaw. Część 5: Wyszukiwarka

4/14

gajdaw.pl/ajax/ajax-wyszukiwarka/print.html

Rysunek 3. Wyszukiwarka zaimplementowana z wykorzystaniem Ajax-a

Wyszukiwarkę Ajax-ową należy zaimplementować w taki sposób, by po wyłączeniu w JavaScript działała

w sposób tradycyjny.

3. Implementacja wyszukiwarki tradycyjnej

3.1 Podstrony i adresy URL

Przygotowanie wyszukiwarki rozpoczynamy od ustalenia stosowanych adresów URL.

Strony pierwszego rodzaju prezentują tekst wybranej piosenki (rysunek 1). Adresy URL przyjmą postać:

index.php?id=2&id2=XXX

gdzie

XXX

jest identyfikatorem piosenki. Na przykład adres:

index.php?id=2&id2=1

dotyczy piosenki pt. Chodzi lisek koło drogi, gdyż piosenka ta ma identyfikator 1, zaś adres:

background image

30.08.2012

Ajax. Kurs od podstaw. Część 5: Wyszukiwarka

5/14

gajdaw.pl/ajax/ajax-wyszukiwarka/print.html

index.php?id=2&id2=5

wskazuje stronę z tekstem piosenki Kółko graniaste (identyfikator 5).

Strony drugiego rodzaju prezentują wyniki wyszukiwania (rysunek 2). Stosowane adresy mają strukturę:

index.php?id=3&szukaj=YYY

gdzie

YYY

jest wyszukiwanym słowem. Na przykład wyniki wyszukiwania słowa

nie

są dostępne pod

adresem:

index.php?id=3&szukaj=nie

zaś wyniki wyszukiwania słowa

tak

pod adresem:

index.php?id=3&szukaj=tak

3.2 Formularz wyszukiwania

Formularz wyszukiwania jest przetwarzany przez skrypt

index.php

. Zawiera on jedno pole

wprowadzania danych o nazwie

szukaj

i jedno pole ukryte o nazwie

id

:

<form action="index.php" method="get">
<div>
<input name="szukaj" />
<input type="hidden" name="id" value="3" />
<input type="submit" value="szukaj" />
</div>
</form>

W ten sposób, po zatwierdzeniu, formularz zostanie przekazany pod adres:

index.php?id=3&szukaj=...

W miejsce trzech kropek przeglądarka umieści wyraz wprowadzony w formularzu.

3.3 Menu strony

background image

30.08.2012

Ajax. Kurs od podstaw. Część 5: Wyszukiwarka

6/14

gajdaw.pl/ajax/ajax-wyszukiwarka/print.html

Menu strony powstaje na podstawie pliku

00index.log

. Każda linijka pliku zawiera dane jednej piosenki:

tytuł oraz nazwę pliku tekstowego z treścią piosenki:

Jawor, jawor|jawor_jawor.txt
Krasnoludki|krasnoludki.txt
Ojciec i syn|ojciec_i_syn.txt
...

Plik ten jest przetwarzany przez funkcję

podaj_dane()

przedstawioną na listingu 1. Wynikiem działania

funkcji

podaj_dane()

jest tablica asocjacyjna, która pod indeksem

ile

zawiera liczbę piosenek, a pod

indeksami

nazwyplikow

oraz

tytuly

— tablice z nazwami plików i tytułami piosenek.

function podaj_dane($ANazwapliku)
{
$tmp = array();
$p = file($ANazwapliku);
$pc = count($p);
$tmp['ile'] = $pc;

$tytuly = array();
$nazwyplikow = array();

for ($i = 0; $i < $pc; $i++) {
$e = explode('|', trim($p[$i]));
$tytuly[$i] = $e[0];
$nazwyplikow[$i] = $e[1];
}

$tmp['nazwyplikow'] = $nazwyplikow;
$tmp['tytuly'] = $tytuly;

return $tmp;
}

Listing 1. Krojenie pliku

00index.log

Wykorzystując funkcję

podaj_dane()

menu strony drukujemy w pętli

for

:

<ul id="menu">
<?php

require_once 'funkcje.inc.php';
$dane = podaj_dane('00index.log');

for ($i = 0; $i < $dane['ile']; $i++) {
echo '<li><a href="index.php?id=2&amp;id2=';
echo $i + 1;
echo '">';
echo $dane['tytuly'][$i];
echo '</a></li>' . "\n";
}

background image

30.08.2012

Ajax. Kurs od podstaw. Część 5: Wyszukiwarka

7/14

gajdaw.pl/ajax/ajax-wyszukiwarka/print.html

?>
</ul>

3.4 Wyszukiwanie

Za wyszukiwanie danych odpowiada przedstawiona na listingu 2 funkcja

wyniki_szukaj()

. Posiada

ona dwa parametry. Pierwszy, szukane słowo

$ASzukaj

, pochodzi z formularza. Drugi, dane

$ADane

,

są wynikiem działania funkcji

podaj_dane()

.

function wyniki_szukaj($ASzukaj, $ADane)
{
$dane = array();
$dane[0] = array();
$dane[1] = array();
$dane[2] = array();

for ($i = 0; $i < $ADane['ile']; $i++) {
$t = file_get_contents('txt/' . $ADane['nazwyplikow'][$i]);

//tytul
$dane[0][$i] = $ADane['tytuly'][$i];

//id
$dane[1][$i] = $i + 1;

//liczba wystapien slowa
$dane[2][$i] = substr_count($t, $ASzukaj);
}

array_multisort(
$dane[2], SORT_DESC, SORT_NUMERIC,
$dane[0], SORT_ASC, SORT_STRING,
$dane[1]
);

if ($dane[2][0] == 0) {

//nic nie znaleziono
return false;

} else {

for ($i = 0; ($i < $ADane['ile']) && ($dane[2][$i] > 0); $i++);
$dane['ile'] = $i;
$dane['pokazpelnalista'] = false;

$dane[0] = array_slice($dane[0], 0, $i, true);
$dane[1] = array_slice($dane[1], 0, $i, true);
$dane[2] = array_slice($dane[2], 0, $i, true);


return $dane;
}
}

background image

30.08.2012

Ajax. Kurs od podstaw. Część 5: Wyszukiwarka

8/14

gajdaw.pl/ajax/ajax-wyszukiwarka/print.html

Listing 2. Funkcja

wyniki_szukaj()

Gdy podane słowo nie zostało znalezione, to wynikiem funkcji

wyniki_szukaj()

jest

false

. W

przeciwnym wypadku wynikiem funkcji jest tablica dwuwymiarowa, która zawiera informacje o tym, w

których piosenkach ile razy podane słowo wystąpiło. Po wywołaniu:

$w = wyniki_szukaj('ala', $dane);

tablica

$w

będzie zawierała trzy składowe:

$w[0]

,

$w[1]

oraz

$w[2]

. Pierwsza z nich będzie tablicą

zawierającą tytuły piosenek. Druga — tablicą zawierającą identyfikatory piosenek, a trzecia — tablicą

zawierającą liczbę wystąpień wyrazu

ala

w danej piosence. Jeśli:

$w[0][3] = 'Krasnoludki'
$w[1][3] = '6'
$w[2][3] = '17'

to wynika z tego, że identyfikatorem piosenki Krasnoludki jest 6 oraz, że szukane słowo występuje w

piosence Krasnoludki 17 razy.

Wyniki wyszukiwania ustalone przez funkcję

wyniki_szukaj()

przekształcamy w listę

ol

. Zadanie to

realizuje przedstawiona na listingu 3 funkcja

wyniki_html()

.

function wyniki_html($AWyniki)
{
if ($AWyniki) {
$wynik = '<ol>';
for ($i = 0; $i < $AWyniki['ile']; $i++) {
$wynik .=
'<li><a href="index.php?id=2&amp;id2=' .
$AWyniki[1][$i] .
'">' .
$AWyniki[0][$i] .
'</a> (' .
$AWyniki[2][$i] .
')' .
'</li>';
}
$wynik .= '</ol>';
} else {
$wynik = 'Nic nie znaleziono!';
}
return $wynik;
}

Listing 3. Funkcja przekształcająca wyniki wyszukiwania w listę

ol

background image

30.08.2012

Ajax. Kurs od podstaw. Część 5: Wyszukiwarka

9/14

gajdaw.pl/ajax/ajax-wyszukiwarka/print.html

3.5 Wybór treści witryny

Skrypt

index.php

zajmuje się wyborem odwiedzonej podstrony oraz przygotowaniem informacji.

Wybór podstrony następuje na podstawie zmiennej URL o nazwie id. Gdy

id

jest równe 2, to wyświetlany

jest tekst odpowiedniej piosenki. Jeśli natomiast

id

wynosi 3, wówczas wyświetlane są wyniki

wyszukiwania. Zarys skryptu

index.php

jest przedstawiony na listingu 4.

<div id="content">
<?php
$akcja = 1;

if (empty($_GET)) {
$_GET['id'] = '2';
$_GET['id2'] = '1';
}

//walidacja zmiennych URL
if (isset($_GET['id']) && str_ievpifr(...)) {

$akcja = $_GET['id'];

switch($_GET['id']) {

case 2:
...
$wiersz = file_get_contents(...);
echo nl2br($wiersz);
break;

case 3:
...
$w = wyniki_szukaj($_GET['szukaj'], $dane);
echo wyniki_html($w, $_GET['szukaj']);
break;
}
};

if ($akcja == 1) {
echo '<p>Błąd!</p>';
}
?>
</div>

Listing 4. Zarys skryptu

index.php

z tradycyjną wyszukiwarką

Domyślna stroną, jaką ujrzy użytkownik jest strona błędu (

$akcja == 1

). Stronę z tekstem piosenki lub

z wynikami wyszukiwania wyświetlamy wyłącznie wtedy, gdy proces walidacji zmiennych URL zakończy

się sukcesem.

Jeśli tablica

$_GET

jest pusta, wówczas instrukcjami:

background image

30.08.2012

Ajax. Kurs od podstaw. Część 5: Wyszukiwarka

10/14

gajdaw.pl/ajax/ajax-wyszukiwarka/print.html

$_GET['id'] = '2';
$_GET['id2'] = '1';

wymuszamy przejście do strony z tekstem pierwszej piosenki.

4. Implementacja wyszukiwarki Ajax-owej

4.1 Skrypt

server.php

Pracę nad rozwiązaniem Ajaksowym rozpoczynamy od przygotowania skryptu

server.php

przedstawionego na listingu 5. Skrypt ten odpowiada za wyszukiwanie podanego słowa. Wyszukiwane

słowo jest przekazywane do skryptu jako zmienna URL o nazwie

co

. Wyniki wyszukiwania są zwracane

w postaci listy

ol

.

<?php
require_once 'walidacja.inc.php';
require_once 'funkcje.inc.php';

$dane = podaj_dane('00index.log');

if (
isset($_GET['co']) &&
(strlen($_GET['co']) < 20) &&
preg_match('/^[a-z]+$/', $_GET['co'])
) {
header('Content-Type: text/html; charset=utf-8');

$w = wyniki_szukaj($_GET['co'], $dane);
echo wyniki_html($w, $_GET['co']);

} else {
header('HTTP/1.x 404 Not Found');
}
?>

Listing 5. Skrypt

server.php

przekazujący wyniki wyszukiwania do obiektu

XMLHttpRequest

Skrypt

server.php

możemy przetestować wprowadzając w polu

Adres

przeglądarki następujący adres

URL-e:

server.php?co=ja

W wyniku powinniśmy ujrzeć listę

ol

prezentującą wyniki wyszukiwania słowa

ja

.

background image

30.08.2012

Ajax. Kurs od podstaw. Część 5: Wyszukiwarka

11/14

gajdaw.pl/ajax/ajax-wyszukiwarka/print.html

4.2 Zmiany w kodzie HTML

Formularz Ajax-owej wyszukiwarki zawiera obsługę zdarzenia

onsubmit

.

<form
action="index.php" method="get"
onsubmit="pokaz_wyniki(); return false">
<div>
<input id="sz" name="szukaj" />
<input type="hidden" name="id" value="3" />
<input type="submit" value="szukaj" />
</div>
</form>

Wywoływana funkcja

pokaz_wyniki()

jest zdefiniowana w pliku

ajax.js

dołączonym w nagłówku

strony:

<script type="text/javascript" src="xmlhttprequest.js"></script>
<script type="text/javascript" src="ajax.js"></script>

Wyszukiwanie nie może powodować przeładowania strony WWW. Odpowiada za to instrukcja

return

false

występująca w obsłudze zdarzenia

onsubmit

. Jeśli kod JavaScript wywoływany w zdarzeniu

onsubmit

zwraca wartość

false

, to przeglądarka nie wysyła formularza na serwer. Takie zachowanie

umożliwia nie tylko wykonanie Ajaksowej wyszukiwarki ale także walidację formularza.

Wyniki wyszukiwania będą umieszczane w elemencie:

<div id="wyniki"></div>

Element ten jest początkowo niewidoczny. Odpowiadają za to style CSS:

#wyniki {
display: none;
}

4.3 Przeładowanie fragmentu

Za wyświetlenie wyników wyszukiwania odpowiadają dwie funkcje JavaScript:

pokaz_wyniki()

oraz

odbierz_dane()

:

background image

30.08.2012

Ajax. Kurs od podstaw. Część 5: Wyszukiwarka

12/14

gajdaw.pl/ajax/ajax-wyszukiwarka/print.html

Pierwsza z nich,

pokaz_wyniki()

wykonuje następujące akcje:

tworzy obiekt

XMLHttpRequest

,

pobiera do zmiennej

co

wyszukiwane słowo, które zostało wprowadzone w formularzu,

ustala adres URL wyników wyszukiwania (

'server.php?co=' + co

),

ustala funkcję obsługi zdarzenia

onreadystatechange

,

oraz rozpoczyna transfer danych:

function pokaz_wyniki()
{
if (r = getXMLHttpRequest()) {
var co;
co = document.getElementById('sz').value;

r.open('GET', 'server.php?co=' + co);
r.onreadystatechange = odbierz_dane;
r.send(null);
}
}

Funkcja

odbierz_dane()

odpowiada włączenie widoczności elementu

div#wyniki

przeznaczonego

na wyniki wyszukiwania oraz za umieszczenie w nim treści zwróconych przez skrypt

server.php

:

function odbierz_dane()
{
if (r.readyState == 4 && r.status == 200) {
var wyn;
wyn = document.getElementById('wyniki');
wyn.innerHTML = r.responseText;
wyn.style.display = 'block';
}
}

5. Podsumowanie

Działanie wyszukiwarki Ajaksowej możemy sprawdzić odwiedzając witrynę Bartosza Danowskiego

http://danowski.pl

(rysunek 4) oraz blog Piotra Petrusa

http://perfectionorvanity.com

(rysunek 5).

background image

30.08.2012

Ajax. Kurs od podstaw. Część 5: Wyszukiwarka

13/14

gajdaw.pl/ajax/ajax-wyszukiwarka/print.html

Rysunek 4. Witryna Bartosza Danowskiego

Rysunek 5. Blog Piotra Petrusa

Z racji na niewielką ilość dostępnej przestrzeni liczbę wyników wyszukiwania prezentowaną bez

przeładowania strony należy ograniczyć do kilku pozycji. Do pełnej listy może prowadzić hiperłącze:

zobacz wszystkie wyniki

.

Zwróć uwagę, na ustalenie kodowania znaków w skrypcie

server.php

:

header('Content-Type: text/html; charset=utf-8');

Wywołanie funkcji

header()

będzie konieczne, jeśli zechcesz stosować inne kodowanie niż utf-8.

lp.

Przykład

background image

30.08.2012

Ajax. Kurs od podstaw. Część 5: Wyszukiwarka

14/14

gajdaw.pl/ajax/ajax-wyszukiwarka/print.html

1.

Wyszukiwarka tradycyjna

2.

Wyszukiwarka wykorzystująca Ajax

3.

Wyszukiwarka Ajax-owa z ograniczeniem liczby wyników wyszukiwania

4.

Wyszukiwarka z zaznaczaniem wyrazu

5.

Wyszukiwarka Ajax-owa z zaznaczaniem wyrazu

Tabela 1. Przykłady do pobrania

lp.

Adres

1.

Strona domowa Bartosza Danowskiego

2.

Blog Piotra Petrusa pt. Perfection or vanity

Tabela 2. Adresy

Reklama


Wyszukiwarka

Podobne podstrony:
Ajax Kurs od podstaw Część 3 Ajax, PHP i pliki tekstowe
Ajax Kurs od podstaw Część 4 Wymiana fragmentu strony
Ajax Kurs od podstaw Część 6 jQuery
Ajax Kurs od podstaw Część 1 Wprowadzenie
Akademia księgowości kurs od podstaw
KURS ŁĄCZNOŚCI–ZAKRES PODSTAWOWY ETAP 1 CZĘŚĆ 4
KURS ŁĄCZNOŚCI–ZAKRES PODSTAWOWY ETAP 1 CZĘŚĆ 1
Ajax Od podstaw 2
KURS ŁĄCZNOŚCI–ZAKRES PODSTAWOWY ETAP 1 CZĘŚĆ 2
Kurs Excel 2013 od podstaw
KURS ŁĄCZNOŚCI–ZAKRES PODSTAWOWY ETAP 1 CZĘŚĆ 3

więcej podobnych podstron