Hej, nie będę Tobie wszystkiego przyklejał, bo to co opisałem jest częścią znacznie większej całości - mojego własnego generatora admina (ulepszyłem i dodałem kilka feature'ów m.in. wspomniana spersonalizowana paginacja, czy sortowanie po wirtualnych kolumnach i trochę więcej

). Dodatkowo paginacja na podstawie filtra niekoniecznie musi u ciebie pasować - w projekcie do którego to dorobiłem żadne z pól filtra nie było wymagane (required), a
tylko wtedy taka paginacja działa
poprawnie (bez brzydkich hacków).
Jednak byś nie myślał, że nie chciałem pomóc,
bonusowo, opiszę jak zrobić
oddzielny dropdown i jak podpiąć go pod
$pager.
Zakładam, że masz stworzony świeży moduł z admin generatora - nic nie zmieniałeś, nic nie dodawałeś etc.
1. Na początku trzeba ustalić, gdzie trzymamy liczby stron do listy
dropdown. Najbardziej oczywistym wyborem będzie konfiguracja generatora, ale nie ta
yaml'owa, tylko ta w postaci klasy znajdująca się w pliku
nazwa_moduluGeneratorConfiguration.class.php w folderze
lib twojego modułu.
<?php
class nazwa_moduluGeneratorConfiguration extends BaseNazwa_moduluGeneratorConfiguration
{
public function getMaxPerPageOptions()
{
return array(5
, 10
, 25
, 50
, 100
, ); // Tutaj ustawiasz liczby do listy dropdown }
public function getPagerMaxPerPage()
{
return 13; // Domyślna liczba wyników na stronę. Wystarczy, że ustawisz ją w yaml'owej konfiguracji
}
}
?>
2. Następnym krokiem jest właściwa implementacja paginacji w kontrolerze.
<?php
class nazwa_moduluActions extends autoNazwa_moduluActions
{
public function executeIndex(sfWebRequest $request) // metoda zmodyfikowana
{
// sorting
if ($request->getParameter('sort'))
{
$this->setSort(array($request->getParameter('sort'), $request->getParameter('sort_type'))); }
// pager
if ($request->getParameter('page'))
{
$this->setPage($request->getParameter('page'));
}
if ($request->hasParameter('max_per_page')) // dodane
{
$this->setMaxPerPage($request->getParameter('max_per_page'));
$this->setPage(1);
}
$this->pager = $this->getPager();
$this->sort = $this->getSort();
}
protected function getPager() // metoda zmodyfikowana
{
$pager = $this->configuration->getPager('ObiektPropela'); // Pamiętaj! Zmień 'ObiektPropela' na poprawną nazwę modelu.
$pager->setCriteria($this->buildCriteria());
$pager->setPage($this->getPage());
$pager->setMaxPerPage($this->getMaxPerPage()); // dodane
$pager->setPeerMethod($this->configuration->getPeerMethod());
$pager->setPeerCountMethod($this->configuration->getPeerCountMethod());
$pager->init();
return $pager;
}
protected function setMaxPerPage($max_per_page) // metoda dodana
{
if(in_array($max_per_page, $this->configuration->getMaxPerPageOptions())) {
$this->getUser()->setAttribute('health_care_institutions.max_per_page', $max_per_page, 'admin_module');
}
else
{
$this->getUser()->getAttributeHolder()->remove('health_care_institutions.max_per_page', null, 'admin_module');
}
}
protected function getMaxPerPage() // metoda dodana
{
return $this->getUser()->getAttribute('health_care_institutions.max_per_page', $this->configuration->getPagerMaxPerPage(), 'admin_module');
}
}
?>
3. Czeka Nas jeszcze dostosowanie szablonów. Zmienimy dwa - widok
indexSuccess...
<!- templates/indexSucces.php -->
<!- Dodajemy helper Form -->
<?php use_helper('I18N', 'Date', 'Form') ?>
<!- etc -->
<!- Przekazujemy zmienną $configuration do partiala "list" -->
<?php include_partial
('nazwa_modulu/list', array('pager' => $pager, 'sort' => $sort, 'helper' => $helper, 'configuration' => $configuration)) ?> <!- etc -->
4. ...i partial
_list.
<!- templates/_list.php -->
<!- Poniższy kod listy dropdown dodaj, gdzie uważasz za stosowne, w partialu "list". -->
<?php
echo form_tag
('@nazwa_modulu', array('method' => 'get')) . PHP_EOL
; // nagłowek formularza echo label_for
('max_per_page', 'Wyniki na stronę: '); // etykieta dla listy echo select_tag
('max_per_page', options_for_select
(array_combine
($configuration->getMaxPerPageOptions(),$configuration->getMaxPerPageOptions()), $pager->getMaxPerPage(), array('include_custom' => '--') ), array('onChange' => 'java script:this.form.submit();')) . PHP_EOL
; // lista dropdown. Strona przeładowuje się automatycznie ?>
I to będzie wszystko. Powinno działać bezpiecznie i sprawnie, ale jeżeli znajdziesz jakieś błędy napisz posta w tym temacie.
edit:
A tak to może wyglądać: