IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Peco
Člen
Avatar
Peco:18.11.2013 15:22

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 Hartinger
Vlastník
Avatar
Odpovídá na Peco
David Hartinger:18.11.2013 15:25

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
18.11.2013 15:25
New kid back on the block with a R.I.P
Avatar
Peco
Člen
Avatar
Peco:18.11.2013 16:17

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
Tvůrce
Avatar
Odpovídá na Peco
user:18.11.2013 16:37

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 Hartinger
Vlastník
Avatar
Odpovídá na Peco
David Hartinger:18.11.2013 17:02

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
New kid back on the block with a R.I.P
Avatar
Peco
Člen
Avatar
Odpovídá na David Hartinger
Peco:5.12.2013 13:54

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 Hartinger
Vlastník
Avatar
Odpovídá na Peco
David Hartinger:5.12.2013 18:05

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
New kid back on the block with a R.I.P
Avatar
Peco
Člen
Avatar
Odpovídá na David Hartinger
Peco:5.12.2013 19:07

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:10.2.2016 10:54

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.2.2016 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.