Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework] głosowanie jquery
Forum PHP.pl > Forum > PHP > Frameworki
przemo91r
Witam,
Chcę zrobić głosowanie mocne/słabe na swojej stronie jednak nie rozumiem jak to mam zrobić, czytam manual ale cięzko mi to zrozumieć.
Jak mam to rozpocząć.

Mam przykładowo IndexController a w nim indexAction w niej pobieram posty z bazy. W index.phtml mam pod kazdym postem
  1. <p class="glosuj" id="1>GŁOSUJ: <span style="color: green">MOCNE </span>/ <span style="color: red">SŁABE</span></p>
  2. <p class="ocena" id="1">ocena: 0 (głosów: 0)</p>

oczywiscie id="" jest wartością zmienną każdy post ma inny. Jak ma zacząć bo wnioskuje, że muszę zrobić clase w /view/helpers ?
  1. <?php
  2. class Vote extends Zend_View_Helper_Abstract
  3. {
  4.  
  5.  
  6.  
  7. }


? proszę o jak najwięcej wskazówek ponieważ zależy mi żeby napisać ten skrypt a przy okazji się czegoś nauczyć.
k_@_m_i_l
Tworzysz akcję np. voteAction() do której przekazujesz id postu i typ głosu (słaby/mocny), później robisz update na danych w bazie i zwracasz w akcji rezultat operacji (true/false bądź 1/0), oraz aktualny stan głosów dla danego postu.
Do strony dodajesz jQuery, łączysz się ajaxem z tą akcją, przekazując jej id postu i typ głosu, a następnie aktualizujesz te dane poprzez js.
Raczej skomplikowane to nie jest : )
I zapoznaj się z tym:link.
Dodajesz ajaxcontent do kontrolera i możesz sobie operować w taki sposób na akacjach, by móc je wykorzystać przy integracji strony z ajaxem.

Ps. "id" to atrybut, który definiuje unikalny identyfikator elementu strony i może zostać użyty raz, a z tego co widzę masz dwa elementy <p> o takim samym id.
przemo91r
Cytat(k_@_m_i_l @ 21.09.2011, 19:47:45 ) *
Tworzysz akcję np. voteAction() do której przekazujesz id postu i typ głosu (słaby/mocny), później robisz update na danych w bazie i zwracasz w akcji rezultat operacji (true/false bądź 1/0), oraz aktualny stan głosów dla danego postu.
Do strony dodajesz jQuery, łączysz się ajaxem z tą akcją, przekazując jej id postu i typ głosu, a następnie aktualizujesz te dane poprzez js.
Raczej skomplikowane to nie jest : )
I zapoznaj się z tym:link.
Dodajesz ajaxcontent do kontrolera i możesz sobie operować w taki sposób na akacjach, by móc je wykorzystać przy integracji strony z ajaxem.

Ps. "id" to atrybut, który definiuje unikalny identyfikator elementu strony i może zostać użyty raz, a z tego co widzę masz dwa elementy <p> o takim samym id.


Czyli robie tak:
w /view/index tworze plik index.ajax.phtml bo sam index.phtml już mam

w IndexController
  1. function init(){
  2.  
  3.  
  4. $ajaxContext = $this->_helper->getHelper('AjaxContext');
  5. $ajaxContext->addActionContext('plus', 'id')
  6. ->addActionContext('minus','id')
  7. ->initContext();
  8.  
  9.  
  10.  
  11. }
  12. function plusAction()
  13. {
  14. /// tutaj odebrać parametr id, wysłać do bazy i zwrócić wynik
  15.  
  16.  
  17. }
  18. function minusAction()
  19. {
  20. /// tutaj odebrać parametr id, wysłać do bazy i zwrócić wynik
  21.  
  22. }


a w index.phtml jak?

wstawić w header? i po kliknięciu w mocne już się wykona? jak własnie zrobić odnośnik? i do czego jest to data, do zwracania danych?
  1. $.ajax({
  2. url: "/index/plus/format/id",
  3. type: "POST",
  4. data: "zmienna1=wartosc1&zmienna2=wartosc2",
  5. success: function(id) {
  6. $("#ajax-content").append(id);
  7. }
  8. });
k_@_m_i_l
Ehh, nie rozumiesz troche.
Zobacz:
w init() w kontrolerze zapisujesz coś takiego:

  1. $contextSwitch = $this->_helper->getHelper('contextSwitch');
  2. $contextSwitch->addActionContext('glosuj', 'json')
  3. ->initContext();
  4. // glosuj to nazwa akcji dla jakiej dodajemy contentswitch,
  5. //a json to typ danych na jakich będziemy operować (nie wiem czy to dobrze wyjaśniłem, ale zakładam że rozumiesz o co chodzi)


Teraz w akcji glosujAction() trzeba zapisać głos do bazy danych i odebrać aktualny stan głosów
  1. $data = $this->getRequest()->getPost(); // pobranie przesyłanych danych
  2. // nie będę tego opisywać, ale w tym miejscu robisz zapis do bazy danych
  3.  
  4. $result_data = array(
  5. 'result' => $result, // wynik operacji na bazie danych
  6. 'plusy' => $plusy, // liczba głosów na plus pobrana po aktualizacji
  7. 'minusy'=>$minusy // liczba głosów na minus pobrana po aktualizacji
  8.  
  9. );
  10. $this->view->wynik = $result_data;

i to jest koniec tej metody. Wszystkie zmienne, które chcesz żeby zostały przekazane zapisujesz do widoku. Z racji tego, iż dla naszej akcji glosuj użyliśmy contentswitch z typem json, to zend zwróci dane z tej akcji jako tablicę zakodowaną w jsonie.

Teraz pozostaje już tylko napisać skrypt w jquery, który połączy się z akcją.
Powiedzmy, że mamy taki kod html
  1. <div class="post">
  2. <div class="tresc">Lorem ipsum ...</div>
  3. <div class="glosy">
  4. <div style="display: none;" class="ukryte_id">11</div>
  5. <div class="plusy">
  6. <span class="ilosc_plus">15</span> <a href="#" class="glosuj_plus glosowanie_odn">+</a>
  7. </div>
  8. <div class="minusy">
  9. <span class="ilosc_minus">5</span> <a href="#" class="glosuj_minus glosowanie_odn">-</a>
  10. </div>
  11. </div>
  12. </div>


Teraz czas na odpowiedni kod w jquery:
  1. $(document).ready(function()
  2. {
  3. $("a.glosowanie_odn").click(function()
  4. {
  5. container = $(this).parents("div.glosy");
  6. post_id = container.find(".ukryte_id").html();
  7. if($(this).hasClass("glosuj_plus"))
  8. typ = 'plus';
  9. else
  10. typ = 'minus';
  11. $.ajax({
  12. type : 'post',
  13. url : 'index/glosuj?format=json',
  14. data : {
  15. 'post_id' : post_id,
  16. 'typ' : typ
  17. },
  18. dataType: 'json',
  19. success: function(data)
  20. {
  21. if(data.wynik.result == 1)
  22. {
  23. // jeśli poprawnie zapisano głos
  24. container.find(".ilosc_plus").html(data.wynik.plusy);
  25. container.find(".ilosc_minus").html(data.wynik.minusy);
  26. }
  27. else
  28. {
  29. alert("Wystąpił błąd podczas przesyłania danych. Spróbuj ponownie.");
  30. container.find(".ilosc_plus").html(data.wynik.plusy);
  31. container.find(".ilosc_minus").html(data.wynik.minusy);
  32. }
  33. }
  34.  
  35. });
  36. });
  37. });


O jQuery i html nie będę nic pisać, dostałeś gotowca więc teraz czas na ruch z Twojej strony i przeanalizowanie kodu. Kod działa, bo sprawdzałem;p
przemo91r
Wielkie dzięki, teraz już to rozumiem, na wolnym czasie do tego przysiąde, przanalizuje dokładnie i dostosuje do włąsnych potrzeb.
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.