Diskuze: MVC a zapracovanie ajax funkcií
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 9 zpráv z 9.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
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á.
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
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
AjaxRouterController - 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/AjaxRouterController.
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')
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.
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 : 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ť.
AJAX nic nevypisuje, vrací ti data. Ta si zpracuješ v JS a ten až vyvolá nějaký výstup.
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ý ?
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?
Zobrazeno 9 zpráv z 9.