Diskuze: Aktualizace dat v MVC
V předchozím kvízu, Online test znalostí JavaScript, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 19 zpráv z 19.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí JavaScript, jsme si ověřili nabyté zkušenosti z kurzu.
Ahoj, když se na to tak koukám, tak ani nevím, kde bych měl začít. Ten
dotaz je celkově špatně koncipován hlavně s ohledem na https://www.itnetwork.cz/…otaz-ve-foru
Pár příkladů za vše:
CasKontroler
měl být snad volaný v rámci této
architektury se všemi potřebnými závislosti a ne jen tak pomocí AJAX z JS?
cas
uloží výstup z toho PHP skriptu
(např. výstup z echo
). To mě opět vrací k předchozímu bodu,
ale navíc a především chudák server. Až tam na tu stránku přijde 100
lidí, tak budeš obsluhovat 100 dotazů za vteřinu jenom z tohoto jednoho
volání...Takže závěrem, zkus příště svůj dotaz položit trochu lépe.
Zkus tu stranku otevrit do iframu, nastav mu rozmery, abys videl, ze to zobrazuje, co ma zobrazovat. Nebo v novem okne
tvujserver.cz/kontrolery/CasKontroler.php
Dale si otevri js konzolu a zkoukni, zda nevypisuje nejake chyby, kdyz pak provedes se strankou F5 (znovunacteni). Ve Firefox je to menu Nastroje - Vyvoj webu- Webova konzola (ctrl+shift+k)
CasKontroler.php
<?php echo time(); ?>
Tvuj js by mel kazdou 1s posilat http request na server. Ajax funguje tak, ze musis mit stranku otevrenou jako
tvujserver.cz/stranka.htm (nebo stranka.php, napr localhost/stranka.htm)
a pak funguje request na adresu
tvujserver.cz/request.htm (nebo CasKontroler.php, napr localhost/CasKontroler.php)
Neexistuje, aby jsi mel stranku spustenou treba jako
file:///c:/slozka/stranka.htm
a spoustel z jineho serveru to ze serveru, to ti pak pinda do konzoly, ze to
ajax nedovoli
tvujserver.cz/request.htm nebo localhost/request.htm ...
A take bacha na velka mala pismenka v nazvech souboru. Linux velikost rozlisuje
a jedna se o jiny soubor, cili error 404, soubor nenalezen. CasKontroler.php
casKontroler.php caskontroler.php Caskontroler.php CasKontroler.Php
K tomu posilani 1s...
Kazdy http request odesila hlavicku. Odkud to posila, treba, jaky server tam
bezi, velikost a jina data. Ma rekneme 1k.
1 odeslani = 1k + text
100 uzivatelu, 100k/s
Bezna lan karta ma propustnost 10/100M / s. Rekneme 100M, takze zatez 0.1%. Neni
to moc, ale mohl by to byt casem problem. Lze pouzit i jiny protokol nez http,
ale byl by to o moc slozitejsi php a js kod.
Ja bych radeji zmenil refresh na 17s. Nebo postupne snizoval pri necinnosti
uzivatele na 17s.
A opravdu nutne potrebujes 1s stahovat datum? Nestaci stahnout jednou a pak javascriptem pripocitavat sekundy?
Vyzkoušel jsem všechno co jsi napsal, ale i tak to nefunguje. Konzole nehlásí žádný error. V CasKontroler je jenom vkládání time(); do $cas. Tato proměnná se pak v pohledu vypíše do divu #cas, který je pak pomocí js aktualizován (neúspěšně). Rychlost refreshovaní zatím neberu v potaz, jelikož je to jen příklad.
Zvlastni, a mne to normalne funguje...
--- soubor http://localhost/www/js-request.htm ---
<input type="button" onclick="odesli('http://localhost/www/js-request.htm',prijmi);" value="Zobrazit zdrojovy kod">
<div id="xxx"></div>
<script>
function isFunction(obj) {return typeof(obj)=='function';}//) && obj!=null
function escapeHtml(str) {
var map = {
"&": "&",
"<": "<",
">": ">",
"\"": """,
"'": "'"
};
return str.replace(/[&<>"']/g, function(m) { return map[m]; });
}
function odesli(path, onsuccess, onerror)
{
var fn;
req = new XMLHttpRequest();
fn = {};
fn.onsuccess = isFunction(onsuccess) ? onsuccess : function(data){};
fn.onerror = isFunction(onerror) ? onerror : function(data){alert("Request error\n"+req.error_path+"\n"+req.status)};
req.response = 'responseText';
req.onload = fn.onsuccess;
req.onerror = fn.onerror;
req.error_path = path;
req.open('GET', path, true);
req.send();
}
function prijmi(event)
{
var data;
data = event.target.result ? event.target.result : (req.response ? req.response : '');
document.getElementById('xxx').innerHTML = '<pre>'+escapeHtml(data)+'<\/pre>';
}
var req;
</script>
A to aktualizuješ pouze html stránku?? Promiň, zapomněl jsem dát odpověď.
Pro jednoduchost jsem pouzil tu samou stranku, jestli myslis tohle. Si udelej jinou html / php stranku a zmen url. Treba v tom bude rozdil, to jsem nezkusil.
Jeste muzes zkusit tuhle verzi. Muzes zkusit zakomentovat cast s onload a odkomentovat onreadystate. Nebo si googlem najdi, jak se to pise v jquery, ja ho nepouzivam. Podstatne u readyState je spoustet na serveru (localhost/ nebo mujserver.cz) a aby slo o steny server, domenu. Protoze z jinym serverem nez se program spousti je to bezpecnostni error. Pak vetsinou pinda do konzoly. (ale to se da obejit pres php file_get_contents($url))
<input type="button" onclick="req.sendGet('http://localhost/www/js-request.htm',receiveCB);" value="Zobrazit zdrojovy kod">
<div id="xxx"></div>
<script>
function isFunction(obj) {return typeof(obj)=='function';}//) && obj!=null
function escapeHtml(str) {
var map = {
"&": "&",
"<": "<",
">": ">",
"\"": """,
"'": "'"
};
return str.replace(/[&<>"']/g, function(m) { return map[m]; });
}
function classRequest()
{
var root = this;
this.req = null;
this.path = null;
this.fn = {};
this.construct = function (onsuccess, onerror)
{
root.req = new XMLHttpRequest();
root.req.response = 'responseText';
//root.setSuccessError(onsuccess, onerror);
// root.req.onreadystatechange = function()
// {
// if (root.req.readyState==4 && root.req.status==200)
// {root.onSuccessRequestCB(root.req);}
// else {root.onTransferCB();}
// }
root.req.onload = root.onSuccessEventCB;
root.req.onerror = root.onErrorRequestCB;
}
this.setSuccessError = function (onsuccess, onerror)
{
root.fn.onSuccess = isFunction(onsuccess) ? onsuccess : root.onSuccessCB;
root.fn.onError = isFunction(onerror) ? onerror : root.onErrorCB;
}
this.onErrorCB = function (req, path)
{
alert("Request error\n"+[path, req.readyState, req.status, req.statusText ? req.statusText : ''].join("\n"));
};
this.onTransferCB = function ()
{
};
this.onSuccessCB = function (data)
{
};
this.onErrorRequestCB = function () // send / receive error
{
alert('error');
root.fn.onErrorCB(root.req, root.path)
};
this.onSuccessRequestCB = function (req) // receive
{
alert('success request');
root.fn.onSuccess(req.responseText);
};
this.onSuccessEventCB = function (event) // receive
{
alert('success event');
var data, req;
data = event && event.target && event.target.response ? event.target.response : (root.req.response ? root.req.response : ''); // zkus ziskat response
data = data ? data : (event && event.target && event.target.result ? event.target.result : ''); // zkus ziskat result
root.fn.onSuccess(data);
};
this.sendGet = function (path, onsuccess, onerror)
{
root.setSuccessError(onsuccess, onerror);
root.path = path;
root.req.open('GET', path, true);
root.req.send();
}
root.construct();
}
function receiveCB(data)
{
document.getElementById('xxx').innerHTML = '<pre>'+escapeHtml(data)+'<\/pre>';
}
var req = new classRequest();
</script>
Ve FF, aspon kdysi, mi slo spustit readystate i pres file:///c:\.... Ale bylo treba tusim zrusit z podminky tu cast s 200 nebo tu cast se 4. Tim si nejsem jisty. Ale pak to nefunguje na serveru. takze je lepsi od zacatku to spoustet na serveru.
Ono to funguje když ten js mám v html stránce a php samostatně, ale nevím jak to udělat pro MVC. Jelikož jsem zkoušel do toho load dát normální url "localhost/cas" a také jsem zkoušel tam dát url toho kontroleru "localhost/kontrolery/CasKontroler.php". Ale i tak to nefunguje.
Na mne musis pomalu. Tyhle technicke pojmy neovladam. Zdejsi clanky vubec
nectu. Jestli mluvis o clanku, pridej link nebo pockej, az zareaguje nekdo, kdo
ten clanek zplacal. Myslel jsem, ze ti nefunguje ajax, tak jsem pridal funkci
ajaxovy kod. To preci nema s jakymsi mvc nic spolecneho, ne?
Jestli mas na strance jakousi berlicku pres htaccess jako pekne url (jestli
tohle povazujes za mvc), pak ten jeji kod mas spatne napsany a musis to upravit
tak, aby pro vybrane adresare se choval jako kdyby tam pekna url nebyla. Nekde
pred ten kod das ifko na konkretni adresar v url.
google = mvc programovani
Zajimave, prvni link hned na it-network
https://www.itnetwork.cz/…architektury
A hned vidim zasadni chyby pri psani clanku, Ta zkratka by mela byt vysvetlena
pri jejim prvnim pouziti, coz se nestalo. Smutna. Asi zvlastni skola.
Aha, MVC je to, co delam uz 30 let. Stale nevidim souvislost s ajaxem.
Ajax je black box, s definovanymi vstupy a vystupy. Pokud nefunguje, tak mas vstupy spatne. Vstupem je rul a parametry. Ve tvem pripade je to url. Takze, pokud to nefunguje, tak mas spatne nejspis url. Zkus tu url dat primo do prohlizece. Udelej na te strance link a klikni na nej. Schvalne, kam te to presmeruje, jestli zobrazi spravnou stranku nebo ne. Myslim jako do stranky, kterou mas na tom serveru, kde jsi pouzival ten ajax.
Jeste doporucuji ten htaccess si nekde kod zalohovat a smazat. Zkouset to bez nej. Tak se da zjistit, zda to bez nej jde a kdyz jo, je chyba tam a ne v ajaxu.
Dyt jsem ti poslal kod ajaxu, ne? Rikal jsi, ze ti to tak nejak funguje,
ne?
Misto onclick to budes spoustet jen pres setInterval, ne?
function mojeodesli() {req.sendGet('http://localhost/www/js-request.htm',receiveCB);}
setInterval("mojeodesli", 1000); // nebo bez uvozovek, ted nevim setInterval(mojeodesli, 1000); a nebo setInterval("mojeodesli()", 1000);
Asi by to normálně fungovalo, ale mě to vloží do původní stránky ještě jednu. Právě pro to se ptám, jak tento problém vyřešit v MVC. Jelikož když chci refreshovat danou stránku přes hezký url, tak se zavolá kontroler, který vyrendruje stránku, pak se spustí js, který opět spustí kontroler, který vyrendruje pohled, ve kterém již vše funguje a čas se každou sekundu mění. A ten tvůj kód mi nefunguje vůbec. Odpovídám na Peter Milch. Překlikl jsem se.
Tak si uprav funkci, ktera ti tam dava ten js, aby ho tam nedavala pro requesty. Nebo renderovala jen cast js, oddelis js pro stranku a js pro veci, ktere nemaji byt duplicitne..
$page->html->add("<div>...
$page->js->add("<script>...
$page->render(array('js'=>false));
S tim kodem nevim. Mi to na localhostu funguje. Jestli ho neumis zabudovat do
sveho programu, s tim ti tezko poradim, tvuj program nemam pred sebou. Par
moznych zadrhelu jsem zminil.
Ale pises, ze ti mozna tvuj funguje, tak aspon tak
Zobrazeno 19 zpráv z 19.