CakePHP 1.2 Filter Component

Written by: Maciej Grajcarek

Date June 11, 2008

Tworzenie formularzy i metod służących do filtrowania danych jest bardzo częstym zadaniem w codziennej pracy programisty. Zwykle, aby osiągnąć pożądany efekt, korzystałem z kombinacji metod modelu i kontrolera . Zwykle oznacza to również pisanie wielu linii kodu i strata czasu na mało interesujące zadanie. Zacząłem więc szukać rozwiązania, które zdejmie ze mnie choć troszkę pracy. Najbardziej interesujący okazał się dla mnie kod zaprezentowany przez Pana Nik’a Chankov’a na jego blogu, który to kod stał się fundamentem do moich dalszych prac.

Jakie są różnice pomiędzy moim komponentem, a tym zaprezentowanym przez Nik’a?
Jest jedna podstawowa. Osobiście nie lubię trzymać informacji o filtrach w sesji. Zamiast tego, mój komponent dostarcza metod pozwalających na filtrowanie danych za pomocą formularza, ale zapamiętywanie wartości filtrów odbywa się już za pomocą adresu URL.

No to startujemy :)
Po pierwsze ściągnij component filter.php stąd i zapisz go do folderu app/controllers/components/

Następnie dodaj go do kontrolera:

var $components = array(...,'Filter',...);

W akcji kontrolera, tam gdzie używasz metody paginate(), wstaw poniższy kod:

$filter = $this->Filter->process($this);
$this->set('url',$this->Filter->url);
$this->set('filtereddatas', $this->paginate(null,$filter));

I to jest wszystko co musisz zrobić w kontrolerze! Istnieje również dodatkowy parametr dla metody Filter->process(), który przyjmuje tablice z wartościami atrybutów tabeli, które mogą być filtrowane. Dla wyjaśnienia podam przykład:

$this->Filter->process($this, array('id','fname','lname'))

Jeżeli filtrujemy dane pod kątem id, fname i lname, a ktoś w adresie url będzie chciał dopisać własną zmienną lub zmodyfikować istniejącą, Filter komponent po prostu taki parametr zignoruje.
Przejdźmy dalej do widoków. Jak widać również powyżej, ustawiłem zmienną $url:

$this->set('url',$this->Filter->url);

Zmienna ta będzie przekazywana do tablicy $options metod helpera $paginator, co umożliwi pamiętanie filtrów przy sortowaniu danych i przechodzeniu po kolejnych stronach wyników.
Oto przykład:


echo $paginate->sort('Id','id', array('url'=>array($url)));?>

echo $paginator->numbers(array('url'=>array($url)));

Teraz wszystko co trzeba zrobić to zbudować formularz, który wyśle dane do naszej akcji


<?php echo $form->create('Videos',array('url'=>array('action'=>'index'))) ?>
<?php echo $form->input('fname') ?>
<?php echo $form->input('lname') ?>
<?php echo $form->input('Distributor.name') ?>
<?php echo $form->end('Search'); ?>

Ważną cechą komponentu Filter jest to, że można również filtrować dane modeli, do których nasz obecny model przynależy (belongs to) w tym przypadku jest to np. model Distributor.

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>