Diskuze: MVC a zapracovanie ajax funkcií

PHP PHP MVC a zapracovanie ajax funkcií American English version English version

Avatar
Peco
Člen
Avatar
Peco:

Ahojte,
možno jednoduchá otázka, ale ako správne do MVC modelu zapracovať ajax spracovania ?
Učím sa to na základe Sdraco-vho tutoriálu a rad by som si to osvojil správne.

príklad kde by som to chcel použiť je diskusia(chat).
Kde pomocou ajaxu vypisujem aktuálne príspevky.

Odpovědět 18.11.2013 15:22
Každý deň vstávam, aby som sa niečo nové naučil.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Peco
David Čápka:

Uděláš AJAXu normálně kontroler a nějak ošetříš, aby se nevkládal do hlavního layoutu. Můžeš třeba každý takový kontroler zakončit na AjaxKontroler nebo jim dát nějaký atribut, který je rozeznává.

Nahoru Odpovědět  +1 18.11.2013 15:25
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Peco
Člen
Avatar
Peco:

A ako ho volať ? doteraz som klasicky v html(php) súbore zavolal javascript ktorý ak bol špecifický bol napísany na konci daného súboru (akoby v pohľade)
a ak to bol univerzálna funkcia pre viac stránok, tak bol includnuty súbor js.php v ktorom to bolo napísane.

viem, že píšem ako maďar, tak skúsim ešte takto(náčrt):

<div id="diskusia"></div>
<input type="text">
.
.
.

<script>
$("#diskusia").getAjax(ajax.php...  //cize som pouzival jeden ajax subor v ktorom bol switch ktory volal to co som prave potreboval
</script>

v MVC sa vo všetkom snažim držať tvojich rád a to pohľadu písať iba html

Nahoru Odpovědět 18.11.2013 16:17
Každý deň vstávam, aby som sa niečo nové naučil.
Avatar
user
Redaktor
Avatar
Odpovídá na Peco
user:

V jednotlivých šablonách žádný javascript nepotřebuješ. V šabloně Layoutu bych si jenom includoval potřebné .js soubory.
Můžeš to vyřešit například tak, že si uděláš dva Routery. Jeden RouterController - na zpracování běžných požadavků. Druhý bude AjaxRouterCon­troller - na zpracování ajax požadavků...
Pak už stačí jen podle příchozího požadavku určit, zda se jedná o ajax nebo klasický požadavek a podle toho vytvořit instanci RouterController/A­jaxRouterContro­ller.
Ostatní běžné Controllery už měnit nepotřebuješ.

Otestování ajax požadavku by mohlo vypadat takto:

if( !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest')
 
Nahoru Odpovědět 18.11.2013 16:37
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Peco
David Čápka:

Jak jsem již psal, uděláš si klasický kontroler, AJAX většinou vrací HTML nebo XML, takže šablonu vypíšeš úplně stejně. Jediný rozdíl je v tom, že nebudeš spolu s šablonou vypisovat layout. To si uprav v routeru.

Nahoru Odpovědět 18.11.2013 17:02
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Peco
Člen
Avatar
Odpovídá na David Čápka
Peco:

Vďaka za nasmerovanie. Bolo to nakoniec fakt jednoduchšie ako som čakal :)

Skús ma, ak je to možné, prosím nasmerovať ešte v jednej veci v tejto téme.

Vypisujem príspevky chatu do DIV pomocou ajax, chcem tu ošetriť na strane servera prípad, keď nezadá žiadny text iba to odošle.
Učím sa to pomocou tvojho tutorialu MVC, takže v spracovaní mám:

class DiskusiaAjaxKontroler extends Kontroler
{
       public function zpracuj($params)
       {

                  $diskusia= new Diskusia();
                  if($_POST)
                   {
                          if(empty($_POST["text"])) Oznamy::zobraz("Zabudol si napísať text.");
                          elseif(!$_SESSION["user"]["userID"] and empty($_POST["nick"])) Oznamy::zobraz("Prihlás sa, alebo zadaj nick.");
                          else
                          {
                                  $diskusia->text=$_POST["text"];
                                  $diskusia->uzivatel=$_SESSION["user"]["userID"];
                                  $diskusia->nick=$_POST["nick"];
                                  $diskusia->vlozPrispevok();
                          }
                   }

                  $this->data=$diskusia->vypisPrispevky();

       }
}

Zisťujem, či bol poslaný príspevok ak hej, tak sa ho snažím ošetriť a uložit.

Na konci vo funkcii vypisPrispevky() ukladam HTML, ktoré kedže je to ajaxom volané vypisujem do pripraveného DIVu

A teraz ta otázky :D : Ako najlepšie vypísať Oznamy::zobraz() ? ten sa plní do session, tak ako je to v tutoriály. Je tam pripravený aj element <p>, len ako ho vypísať keď idem cez ajax.

prikladám aj obsah .js súboru odkial je ajax volaný. (po stlačení ENTER sa volá funkcia vlozPrispevok()

function vlozPrispevok()
{
        var text=$("textarea[name='prispevok']").val();
        var nick=$("input[name='meno']").val();

 $.ajax({
    type: "POST",
    data: "text="+text+"&nick="+nick,
    success: function(){
                        $("textarea[name='prispevok']").val('');
                        vypisPrispevky();
                        }
 });
}
function vypisPrispevky()
{
        setTimeout(vypisPrispevky,15000);
         $.ajax({
    type: "POST",
    success: function(response){$("#zobrazPrispevky").html(response);}
        });
}

Ďakujem za každú radu, či nasmerovanie ako sa to správne robí, aby som si neosvojil zase nejakú neštandartnú blbosť. :)

Nahoru Odpovědět 5.12.2013 13:54
Každý deň vstávam, aby som sa niečo nové naučil.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Peco
David Čápka:

AJAX nic nevypisuje, vrací ti data. Ta si zpracuješ v JS a ten až vyvolá nějaký výstup.

Nahoru Odpovědět 5.12.2013 18:05
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Peco
Člen
Avatar
Odpovídá na David Čápka
Peco:

ciže by som mohol vrátiť pole, kde "response[0]" bude html (všetky príspevky) a "response[1]" by mohol byt oznam, ktorý vypíše do <p> oznam kam patri(ak bude definovaný ?

Nahoru Odpovědět 5.12.2013 19:07
Každý deň vstávam, aby som sa niečo nové naučil.
Avatar
Marek Šafránek:

zkusil jsem, udělat AjaxKontroler a v něm metodu registrovat(), která by měla echovat json pro jquery

public function registrovat()
    {


                if ($_POST)
                {

                                $spravceUzivatelu = new SpravceUzivatelu();
                                $spravceUzivatelu->registruj($_POST['email'],$_POST['heslo'],$_POST['hesloZnovu'],$_POST['jmeno'],$_POST['prijmeni'],$_POST['telefon'],$_POST['ulice'],$_POST['mesto'],$_POST['psc'],$_POST['captcha']);

                                                $email= $_POST['email'];
                                                $jmeno= $_POST['jmeno'];
                                                $prijmeni= $_POST['prijmeni'];
                                                $telefon= $_POST['telefon'];
                                                $ulice= $_POST['ulice'];
                                                $mesto= $_POST['mesto'];
                                                $psc= $_POST['psc'];

                                        $navraceno = array('id'=> '5' ,
                                                'email'=> $email,
                                                'jmeno'=> $jmeno,
                                                'prijmeni'=> $prijmeni,
                                                'telefon'=> $telefon,
                                                'ulice'=> $ulice,
                                                'mesto'=> $mesto,

                                                'psc'=> $psc);

                         header("Content-Type: application/json", true);
                        echo json_encode($navraceno);
                        exit;
                }

, tuto funkci kterou volá router naparsováním url - /ajax/registruj/
a pomocí jquery.ajax

$.ajax({
           type: "POST",
           url: "../ajax/registrovat/",
           data: {
               "email": email,
               "heslo": heslo,
               "hesloznovu": hesloznovu,
               "jmeno": jmeno,
               "prijmeni": prijmeni,
               "telefon": telefon,
               "ulice": ulice,
               "mesto": mesto,
               "psc": psc,
               "captcha": captcha
           },

           dataType: "json",
           success: function (data) {
                               response = jQuery.parseJSON(data);
               console.log(response);

               $("#registrace").html("Registrace proběhla úspěšně!<br>Potvrďte registraci klepnutím na odkaz v aktivačním emailu.");
               setTimeout(function () {
                   $("#registrace").delay(6800).hide();
                   $("#zatmeni").delay(6800).hide();
               }, 3000);

           },
           error: function (data) {
               console.log("chyba");

           }

Pokud provedu akci, metoda registrovat, zapíše uspešně data do databáze, ale když chci pomocí success načíst jsoun, který by měla metoda vrátit, hlásí stále chybu, nebo po smazání dataType, vrací nesmysly, celou HTML indexu. Zkouším na localhostu se subdoménou web.localhost.com.

Uměl by někdo poradit, kde dělám chybu?

Nahoru Odpovědět 10. února 10:54
Stojí-li něco za námahu, je třeba to udělat pořádně...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.