Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony] Sposoby przekazywania parametrów: criteria, id
Forum PHP.pl > Forum > PHP > Frameworki
kaniagandzowski
Witam

Mam problem z przekazywaniem parametrów (różnych parametrów np. obiekt cryteria, id, sortowanie itd). Nie wiem w jaki sposób ładnie i elegancko przekazywać parametry a zarazem żeby w kodzie nie było bajzlu związanego z pobieraniem tych parametrów.

Podam na przykładzie mój problem
1. Mam helper, który wyświetla komentarze dla danego profilu. Helper wywoływany jest w templatce. Do tego helpera są przekazywane Id Profilu.
2. Helper tworzy obiekt $Criteria bo Jak wiemy symfony korzysta z propela. Tak więc aby wyciągnąć dane z bazy danych należy utworzyć obiekt kryteria
np.
  1. <?php
  2. $criteria = new Criteria();
  3. $criteria->add( OpiniaPeer::USLUGA_ID_USLUGA, $id_uslugi );
  4. ?>


i przekazać go do metody propela
np.

  1. <?php
  2. ...doSelect(  $criteria )
  3. ?>


3. Następnie jest wyświetlana strona (profil) wraz komentarzami do niego.
4. Operacje na komentarzach (kasowanie, dodawanie) wykonywanej jest przez ajax.
5. Gdy zostanie skasowany komentarz przez właściciela użytkownika, to wynik czyli lista komentarzy jest aktualizowana na stronie poprzez AJAX. Ale już nie pamięta iż ma wyświetlić komentarze tylko dla tego profilu.
6. Problem mój jest w jaki ładnie sposób miał by pamiętać do jakiego profilu komentarze ma wyświetlić.

Rozwiązania jakie nasuwają się:

W realiziowanym projekcie wywoływana jest akcja tworząca w/w obiekt a następnie na jego podstawie pobierane są dane z bazy i prezentowane na ekranie. Dalej w odpowiedzi na zapytania użytkownika www (kliknięcie butona) wykonywana jest kolejna akcja dla której potrzebny jest wcześniej wymieniony obiekt kryteria.
Teoretycznie obiekt można by tworzyć każdorazowo przy wywołaniu ostatniej akcji, na podstawie parametrów podanych url.

Niestety z wielu powodów takie rozwiązanie odpada (dynamiczna lista parametrów, wygląd url, podanie ciekawskiemu użytkownikowi danych do których nie powinien mieć wglądu - ostatnie powoduje że odpada również serializacja i przesłanie danych postem).

Wygodnym wydawałoby się wrzucenie omawianego obiektu do sesji i pobranie go w momencie gdy będzie potrzebny. Tutaj również pojawiają się problemy:
- z usuwaniem danych sesji więc należałoby ciągle aktualizować daną zmienną (a nie tworzyć kolejne).
- ponownie problem z usuwaniem zmiennych gdyż obecnie można otworzyć strony serwisu w kilku kartach/zakładakach przeglądarki. W każdej kart pojawi się wcześniej ustawiona zmienna, gdyż zmienne sesyjne usuwane są z zamknięciem okna przeglądarki (a nie kart).

Proszę o rady w jaki sposób radzicie sobie z takimi przypadkami. Dodam że używam symfony 1.2.
qqrq
Szczerze powiem nie bardzo wiem z czym masz problem - takie rzeczy załatwia się najprościej jak się da, czyli przez parametry w URL - u (ew. POST-em). Co do podglądu niechcianych danych, to przecież przesyłasz tylko jeden (lub więcej) identyfikatorów, względnie nazwę akcji, jaką wykonujesz.
Przechowywania Criteria w sesji bym nie polecał - obiekt może się rozrosnąć do cholera wie jakich rozmiarów. Zresztą, uważałbym z serializacją czegokolwiek, co ma kontakt z bazą - mogą tam być jakieś składowe będące resource-ami.
kaniagandzowski
tak zgadza się, że przez url jest najprościej i w sumie najlepsze.
Ale nie lubię tej metody ponieważ, gdy trzeba np. przekazać takie jak id, sortowanie (rosnące czy malejące) itd. z których się nazbiera kilka parametrów to zaczyna być męczące.
np.
  1. <?php
  2. url_for('job/show?id='.$job->getId().'&sortowanie=rosnace'.& ..........);
  3. ?>


i później na nowo w każdej akcji tworzyć dodatkowe skrypty, które zbierają do kupy wszystkie dane przekazane przez url i konstruuje kryteria do bazy i pobiera dopiero rekordy.
Przez to kod staje się mniej przyjemny, bardziej specjalizowany na jedno zadanie np. pisanie opinii tylko do profili a już do artykułów wymagało by stworzenia np. warunków w module opinia. (oczywiście pisze ogólnie aby naświetlić problem, nie tyle rozwiązać konkretnie problem z opiniami tylko chcę poznać sposób jaki powinno się do tej sprawy podejść)

W symfony 1.2 bardzo podoba mi się tworzenia linków w ten oto sposób
  1. <?php
  2. url_for('job_show_user', $job)
  3. ?>

później w akcji pobieram sobie obiekt job
  1. <?php
  2. class jobActions extends sfActions
  3. {
  4.  public function executeShow(sfWebRequest $request)
  5.  {
  6.    $this->job = $this->getRoute()->getObject();
  7.  }
  8.  
  9.  // ...
  10. }
  11. ?>


i ta metoda jest bardziej wygodna. Dlaczego?. Ponieważ nie zawracam sobie głowy z pisaniem url i przekazywaniem id itd. Bo mnie tylko interesuje obiekt na który wykonam operacje na bazie danych oraz nie martwię czy nie popełniłem literówki w nazwie parametrów .

To fajnie działa tylko, że nie potrafię lub nie idzie tego samego linka zrobić poprzez AJAX
  1. <?php echo link_to_remote('Delete this post', array(
  2.    'update' => 'feedback',
  3.    'url'    => 'post/delete?id='.$post->getId(),
  4. )) ?>

Który by przekazał obiekt do akcji, która zostaje wywoływana przez AJAX.

Może wie ktoś z was jak to zrobić?

Bo dzięki temu mogę (tak myślę, może to jest złe) np. przekazywać kryteria wew. obiektu Job (bazy) Kryteria oczywiście bym stworzył w heleprze np.
  1. <?php
  2. //templatka np. indexSuccess.php
  3. getOpinia_for_profil('Id_profilu');  //funkcja stworzyła by obiekt kryteria i przekazała do modułu. i nastepnie zwróci kod html tzn wyświetli wszystkie opinie do danego profilu
  4. ?>
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.