Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework] dodawanie komentarza + walidacja + przyjazne adresy
Forum PHP.pl > Forum > PHP > Frameworki
csharp
Cześć,

zacznę może od tego jak jest zbudowana moja aplikacja:

strony wyświetlają się na zasadzie przyjaznych adresów - w bazie jest pole o nazwie adresu, skrypt wyciąga to z bazy i ładnie dopasowuje, wygląda to tak:

application.ini

  1. resources.router.routes.post_show.type = "Zend_Controller_Router_Route_Regex"
  2. resources.router.routes.post_show.route = "([a-zA-Z0-9\-_]+)\.html"
  3. resources.router.routes.post_show.defaults.controller = "index"
  4. resources.router.routes.post_show.defaults.action = "showpost"
  5. resources.router.routes.post_show.reverse = "%s.html"
  6. resources.router.routes.post_show.map.1 = "address"


akcja showpost odpowiedzialna za wyświetlenie posta

  1. $Post = new Application_Model_DbTable_Post();
  2. $address = $this->getRequest()->getParam('address');
  3. $select = $Post->select()->where('address = ?', $address);
  4. $this->view->blog_posts = $Post->fetchRow($select);
  5. if (!$this->view->blog_posts) {
  6. throw new Zend_Controller_Action_Exception('Błąd #1!', 404);
  7. }


w widoku akcji showpost chce dodać możliwość komentowania posta.
sam formularz już działa i jeśli nie ma błędów dodaje się właściwie do bazy

problem w tym jeśli są błędy - bo walidacja mi wszystko rozwala, tutaj właśnie potrzebuje pomocy...

przed akcją wyświetlania posta dodałem akcje dodania komentarza:


początek showpost
  1. $this->view->form = new Application_Form_Addcomment();
  2.  
  3. $form = new Application_Form_Addcomm();
  4.  
  5. if ($form->isValid($this->getRequest()->getPost())) {
  6.  
  7. $User = new Application_Model_DbTable_Commdb();
  8.  
  9. $auth = Zend_Auth::getInstance();
  10. if (!$auth->hasIdentity()) {
  11. $logg = $form->getValue('user');
  12. } else {
  13. $logg = $auth->getIdentity();
  14. }
  15.  
  16. $ip = $_SERVER['REMOTE_ADDR'];
  17. $dane = array(
  18. 'user' => $logg,
  19. 'www' => $form->getValue('www'),
  20. 'comment' => $form->getValue('comment'),
  21. 'post_id' => $this->getRequest()->getPost('post_id')
  22. );
  23.  
  24. $User->createRow($dane)->save();
  25.  
  26. return $this->_redirect('komentarz-dodany');
  27.  
  28. }


akcja formularza jest maskowana tz.: kierowana j/n:
  1. resources.router.routes.dodaj.route = "dodaj"
  2. resources.router.routes.dodaj.defaults.controller = "index"
  3. resources.router.routes.dodaj.defaults.action = "showpost"


i jeśli nie popełnię błędu w formularzu to wszystko pójdzie sprawnie i komentarz się doda. Jeśli natomiast zrobię błąd to próbuje wyświetlić akcję "showpost" ale w adresie mam http://nazwastrony.pl/dodaj zamiast http://nazwastrony.pl/tytul-newsa.html i oczywiście akcja showpost nie znajduje posta "dodaj" w bazie i wywala błąd...

jak to logicznie uporządkować? co mógłbym zrobić lepiej aby to sprawniej działało? mogę całość przebudować jeśli będzie miało to sens. Będę wdzięczny za wszystkie pomocne głowy smile.gif


//edit - temat dalej aktualny, nie znalazłem rozwiązania... mógłby ktoś się przyjrzeć temu? dzięki...
CuteOne
Z reguły nie daje gotowców ale ciężko by mi było wyjaśnić co i jak
  1.  
  2. public function addAction() {
  3.  
  4. $form = new Application_Form_Addcomment();
  5. $form -> setAction('/dodaj');
  6.  
  7. if($this->_request->isPost()) {
  8.  
  9. $postValue = $this->_request->getPost();
  10.  
  11. if($form->isValid($postValue)) {
  12.  
  13. $formData = $form->getValues();
  14.  
  15. $xxxModel = new Application_Model_XXX();
  16. $result = $xxxModel -> saveData($formData);
  17.  
  18. if($result === true) {
  19.  
  20. $this->_redirect('/lista');
  21. }
  22. else {
  23.  
  24. $this->view->error = 'Nie udało się dodać rekordu do bazu';
  25. }
  26. }
  27. }
  28. $this->view->form = $form;
  29. }


  1. <?php
  2.  
  3. echo $this->error;
  4. echo $this->form;
  5. ?>
csharp
dzięki, a mógłbyś mi napisać co jest istotne w tym co napisałeś? bo podstawiając to pod swój formularz zachowuje się on właściwie tak samo jak zachowywał... i w zasadzie nie wiem na co zwrócić uwagę.
CuteOne
Rozdziel akcje dodawania komentarza i wyświetlania posta.
  1. public function showpostAction() {
  2. // pokazanie posta
  3. }
  4.  
  5. public function addCommentAction) {
  6.  
  7. // dodanie komentarza tak jak w moim skrypcie z tą różnicą, że action form. ma kierować na na showpostAction()
  8. }


widok showpost.ptml
  1. <?php
  2. //nie pamiętam już jak się nazywała ta funkcja więc musisz poszperać w zendowskim manualu
  3. $this->setAction('add-comment', 'kontroler');
  4. ?>


widok dla addComment taki jak podałem powyżej
csharp
muszę się jeszcze upewnić, bo czegoś nie rozumiem...

  1. public function showpostAction() {
  2. // pokazuje tutaj posta + formularz do dodawania komentarzy, form action ustawiam na addCommentAction()
  3. }
  4.  
  5. public function addCommentAction) {
  6.  
  7. // tutaj mam funkcję dodawania komentarza, to po co jeszcze raz ustawiam form action na showpostAction()? tego nie rozumiem..
  8. }


  1. <?php
  2. //nie pamiętam już jak się nazywała ta funkcja więc musisz poszperać w zendowskim manualu - o jaką Ci tutaj funkcję chodzi?
  3. $this->setAction('add-comment', 'kontroler');
  4. ?>


dzięki za pomoc.
CuteOne
Nie nie smile.gif w showpostAction() zostaw tylko wyświetlanie posta. Dodawanie komentarza(czyli obłsługę formularza z mojego pierwszego posta) wrzuć do osobnej akcji
csharp
dalej utknąłem na czymś :|

jeszcze raz:

  1. public function showpostAction()
  2. {
  3. //tworzę obiekt formularza
  4. $form = new Application_Form_Addcomment();
  5. $this->view->form = $form;
  6.  
  7. oraz zajmuje się wyświetlaniem postów
  8. /*
  9. *kod do wyświetlania posta
  10. */
  11.  
  12. }


w klasie formularza mam zdefiniowaną akcje na:
  1. $this->setAction('dodaj');


co odpowiada:
  1. resources.router.routes.dodaj.route = "dodaj"
  2. resources.router.routes.dodaj.defaults.controller = "index"
  3. resources.router.routes.dodaj.defaults.action = "addcom"


a akcja addcom zajmuje się dodawaniem posta do bazy:

  1. public function addcomm()
  2. {
  3. $form = new Application_Form_Addcomment();
  4. $form -> setAction('/dodaj-komentarz-con');
  5.  
  6. if($this->_request->isPost()) {
  7.  
  8. $postValue = $this->_request->getPost();
  9.  
  10. if($form->isValid($postValue)) {
  11.  
  12. $Model = new Application_Model_DbTable_Comm();
  13.  
  14.  
  15. $dane = array(
  16. 'cos' => $form->getValue('post1'),
  17. 'cos' => $form->getValue('post2')
  18. );
  19.  
  20. $result = $Model->createRow($dane)->save();
  21.  
  22. if($result === true) {
  23.  
  24. $this->_redirect('/dodano');
  25. }
  26. else {
  27.  
  28. $this->view->error = 'wystąpił błąd';
  29. }
  30. }
  31. }
  32. $this->view->form = $form;


i pomimo wszystko gdy popełnię błąd w formularzu (podam np. za dużą ilość znaków) to formularz jest przekierowywany do widoku "addcomm"

więc postanowiłem, że może spróbuje zostawić widok "showpost"

  1. $this->_helper->viewRenderer('showpost');


no ale to nie przejdzie bo błąd się pojawia już na nowym adresie tej akcji...

nazwadomeny.pl/dodaj

a chciałbym aby to wszystko odbywało się ciągle w widoku akcji showpost i aby adres pozostał bez zmian

nazwadomeny.pl/tytul-newsa.html
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.