Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony] paginacja w szablonie formularza
Forum PHP.pl > Forum > PHP > Frameworki
janek9
czesc

Tak sie wlasnie zastanawiam, czy mozna zrobic paginacje wynikow z widgetu propelchoice w szablonie formularza? Moze ktos sie spotkal z podobnym problemem ? Jezeli bym ustawil w akcji paginacje tak jak ukazuje to w ladny sposob dokumentacja, to otrzymam zdublowane wyniki.
LBO
JA rozwiązałem ten problem następująco:

1. Dodałem dodatkowe pole (extra_field) w formularzu filtra z wyborem ilości wyników na stronę. Nie trzymam tej wartości w bazie, więc mam zwykły sfWidgetFormChoice, ale nie powinno być problemu, żeby widget z dropdownem pobierał domyślną wartość z bazy za pomocą sfWidgetPropelChoice.
2. Następnie, pobieram wartość tego pola z filtra (zmodyfikowałem metodę getPager()) i ustawiam jako atrybut Pagera

Jeżeli nie używasz Pagera możesz zmodyfikować Criteria i ustawić paginację bezpośrednio z formularzu filtra metodą sfTwojFormularzFiltra::addNazwaDodatkowegoPolaWNotacjiWielbladziejColumnCriteria(Criteria $criteria, $field, $values)

Pozdrawiam

edit:

Nadmienię tylko, że te nadmiarowe pole dodałem z zewnątrz formularza - w kontrolerze.
janek9
a jak zmodyfikowales metode pagera? Akurat z niego korzystam. Dodam jeszcze ze we formie mam widgetpropelchoice expanded na true. Ja myslalem w ten sposob, zeby w widgecie zmienic jakos sposob wyswietlania wynikow, dodac wlasnie taki wbudowany pager ale to chyba nie jest dobre rozwiazanie, pozatym nawet bym nie umial tego zrobic na chwile obecna.
LBO
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 smile.gif ). 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.
  1. <?php
  2. class nazwa_moduluGeneratorConfiguration extends BaseNazwa_moduluGeneratorConfiguration
  3. {
  4.  public function getMaxPerPageOptions()
  5.  {
  6.    return array(5, 10, 25, 50, 100, ); // Tutaj ustawiasz liczby do listy dropdown
  7.  }
  8.  
  9.  public function getPagerMaxPerPage()
  10.  {
  11.    return 13; // Domyślna liczba wyników na stronę. Wystarczy, że ustawisz ją w yaml'owej konfiguracji
  12.  }
  13. }
  14. ?>


2. Następnym krokiem jest właściwa implementacja paginacji w kontrolerze.
  1. <?php
  2. class nazwa_moduluActions extends autoNazwa_moduluActions
  3. {
  4.  public function executeIndex(sfWebRequest $request) // metoda zmodyfikowana
  5.  {
  6.    // sorting
  7.    if ($request->getParameter('sort'))
  8.    {
  9.      $this->setSort(array($request->getParameter('sort'), $request->getParameter('sort_type')));
  10.    }
  11.  
  12.    // pager
  13.    if ($request->getParameter('page'))
  14.    {
  15.      $this->setPage($request->getParameter('page'));
  16.    }
  17.  
  18.    if ($request->hasParameter('max_per_page')) // dodane
  19.    {
  20.      $this->setMaxPerPage($request->getParameter('max_per_page'));
  21.      $this->setPage(1);
  22.    }
  23.  
  24.    $this->pager = $this->getPager();
  25.    $this->sort = $this->getSort();
  26.  }
  27.  
  28.  protected function getPager() // metoda zmodyfikowana
  29.  {
  30.    $pager = $this->configuration->getPager('ObiektPropela'); // Pamiętaj! Zmień 'ObiektPropela' na poprawną nazwę modelu.
  31.    $pager->setCriteria($this->buildCriteria());
  32.    $pager->setPage($this->getPage());
  33.    $pager->setMaxPerPage($this->getMaxPerPage()); // dodane
  34.    $pager->setPeerMethod($this->configuration->getPeerMethod());
  35.    $pager->setPeerCountMethod($this->configuration->getPeerCountMethod());
  36.    $pager->init();
  37.    return $pager;
  38.  }
  39.  
  40.  protected function setMaxPerPage($max_per_page) // metoda dodana
  41.  {
  42.    if(in_array($max_per_page, $this->configuration->getMaxPerPageOptions()))
  43.    {
  44.      $this->getUser()->setAttribute('health_care_institutions.max_per_page', $max_per_page, 'admin_module');
  45.    }
  46.    else
  47.    {
  48.      $this->getUser()->getAttributeHolder()->remove('health_care_institutions.max_per_page', null, 'admin_module');
  49.    }
  50.  }
  51.  
  52.  protected function getMaxPerPage() // metoda dodana
  53.  {
  54.    return $this->getUser()->getAttribute('health_care_institutions.max_per_page', $this->configuration->getPagerMaxPerPage(), 'admin_module');
  55.  }
  56. }
  57. ?>


3. Czeka Nas jeszcze dostosowanie szablonów. Zmienimy dwa - widok indexSuccess...
  1. <!- templates/indexSucces.php -->
  2.  
  3. <!- Dodajemy helper Form -->
  4. <?php use_helper('I18N', 'Date', 'Form') ?>
  5. <!- etc -->
  6.    <!- Przekazujemy zmienną $configuration do partiala "list" -->
  7.    <?php include_partial('nazwa_modulu/list', array('pager' => $pager, 'sort' => $sort, 'helper' => $helper, 'configuration' => $configuration)) ?>
  8. <!- etc -->


4. ...i partial _list.

  1. <!- templates/_list.php -->
  2.  
  3. <!- Poniższy kod listy dropdown dodaj, gdzie uważasz za stosowne, w partialu "list". -->
  4. <?php
  5.  echo form_tag('@nazwa_modulu', array('method' => 'get')) . PHP_EOL; // nagłowek formularza
  6.  echo label_for('max_per_page', 'Wyniki na stronę: '); // etykieta dla listy
  7.  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
  8.  echo '</form>'
  9. ?>


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ć:
janek9
Dzieki:) Tylko nie moge sobie poradzic z implementacja tego, musze troche posiedziec nad tym. Ale nie wiem czy sie dobrze zrozumielismy, bo...Wyswietlam we formularzu widgetPropelChoice z criteria. Do tego wlasnie chce zrobic paginacje tak jak przy normalnym pager z wyswietlaniem tych << < 1-2-3-4-5 > >> . Aha no i panelu admina jeszcze nie mam bo mecze sie nad frontendem. Sorry nie jestem pro, wiem ze dla innych moze to banal ale dla mnie narazie nie jest to proste..



LBO
hahahaha, no bardzo się nie zrozumieliśmy smile.gif

W takim razie, mam najprostszą radę - pobaw się admin generatorem i zobacz jak tam jest to zrobione.

Wskazówka - obiekt pagera udostępnia tobie wszystko co potrzebujesz. Przyjrzyj się mu dokładniej.

Nie potrzebujesz widgeta do tego. Właśnie dlatego, że wspomniałeś o sfWidgetPropelChoice źle zinterpretowałem Twoje pytanie.

Co dokładnie chciałeś pobierać tym widgetem?
janek9
Cytat(LBO @ 18.07.2009, 17:27:06 ) *
hahahaha, no bardzo się nie zrozumieliśmy smile.gif

W takim razie, mam najprostszą radę - pobaw się admin generatorem i zobacz jak tam jest to zrobione.

Wskazówka - obiekt pagera udostępnia tobie wszystko co potrzebujesz. Przyjrzyj się mu dokładniej. Ni potrzebujesz widgeta do tego.


Hehe do wyswietla nie potrzebuje, ale potrzebuje ten widget do masowego usuwania zaznaczonych wiadomosci i robie to w petli dlatego go zastosowalem.

mam tak we form:

  1. <?php
  2. class MailboxForm extends BaseTpMailInboxForm
  3. {
  4.    public function configure()
  5.    {
  6.        unset($this['id'], $this['from_who'], $this['message'], $this['subject'], $this['read'], $this['created_at'], $this['deleted']);
  7.        
  8.        if(sfContext::hasInstance())
  9.        {
  10.            
  11.            $this->widgetSchema['id_user'] = new sfWidgetFormPropelChoice(array('model' => 'InboxView', 'add_empty' => false, 'criteria' => InboxViewPeer::getMailFromUserForm($id = intval(sfContext::getInstance()->getUser()->getGuardUser()->getId())), 'multiple' => True, 'expanded' => True));
  12.            
  13.            $this->validatorSchema['id_user'] = new sfValidatorPropelChoice(array('model' => 'InboxView', 'criteria' => InboxViewPeer::getMailFromUserForm($id = intval(sfContext::getInstance()->getUser()->getGuardUser()->getId())), 'multiple' => True, 'required' => False));
  14.            
  15.        }
  16.        
  17.        $this->widgetSchema->setNameFormat('mailbox[%s]');
  18.    }
  19. }
  20. ?>


pobieram wyniki i MUSZE je zwrocic jako lista z checkboxami, zeby mozna bylo masowo usuwac. Do tego jeszcze mialaby byc paginacje tego wlasnie wiec nie wiem czy nie lepiej wystarczylby do tego sam pager z wynikami ale dolozyc checkbox do kazdej wiadomosci z mozliwoscia usuniecia, ale wowczas nie wiem jak to podczepic, aby wiedzial ze zaznaczony checkbox nalezy do okreslonej pozycji.
LBO
Powtarzam, próbujesz zrobić coś co masz dostępne na dzień dobry. Admin Generator nie służy tylko do generowania modułów w backendzie.

Jeżeli jednak nadal upierasz się przy swoim, to przynajmniej wygeneruj sobie jakiś przykładowy moduł i spójrz w kod - nikt nie będzie Ci tego przyklejał.
janek9
Nie nie upieram sie. Wygeneruje sobie panel admina i zobacze jak to jest tam zrobione. Dzieki za pomoc:-)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.