Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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í.

Diskuze: Aktualizace dat v MVC

Aktivity
Avatar
Jakub Du
Člen
Avatar
Jakub Du:28.8.2018 21:45

Ahoj,
mám web s MVC architekturou a potřebuji aktualizovat čas v pohledu. Zatím jsem to zkoušel tímto kódem, který jsem vložil do pohledu.

                $(document).ready(function ()
                {
                            setInterval(function()
                                {
                                $("#cas").load("kontrolery/CasKontroler.php");
                                }, 1000);
});

Čas se ale neaktualizuje. Vím že by se tam místo toho "kontrolery/Cas­Kontroler.php" měla dát přímo cesta na nějaký php script, ale jak to udělat v MVC.

Editováno 28.8.2018 21:46
 
Odpovědět
28.8.2018 21:45
Avatar
Jindřich Máca
Tvůrce
Avatar
Odpovídá na Jakub Du
Jindřich Máca:29.8.2018 0:14

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:

  • Používáš nějakou MVC architekturu na straně serveru, dobře, ale pak by ten kontroler 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? :-O
  • Nemluvě o tom, že vlastně nikdo neví, co ten kontroler dělá a jestli třeba chyba není v něm...
  • Ten JS kód, co jsi sem poslal, tak každou vteřinu odešle AJAX požadavek na server a do elementu s ID 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í...
  • Tvoje otázka na cestu je pro mě taky dost nepochopitelná, protože např. většina MVC frameworků se snaží přímý přístup k PHP skriptům zakázat a místo toho jej nahradit nějakým pěkným routováním. Pak by jsi měl volat přímo URL, kterou daný kontroler obsluhuje.

Takže závěrem, zkus příště svůj dotaz položit trochu lépe. :)

 
Nahoru Odpovědět
29.8.2018 0:14
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:29.8.2018 9:20

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
  • si ze souboru udelej zalohu
  • smaz kod a dej tam misto neho
<?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/re­quest.htm nebo localhost/requ­est.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

Editováno 29.8.2018 9:22
 
Nahoru Odpovědět
29.8.2018 9:20
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:29.8.2018 9:30

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?

 
Nahoru Odpovědět
29.8.2018 9:30
Avatar
Jakub Du
Člen
Avatar
Odpovídá na Peter Mlich
Jakub Du:29.8.2018 14:12

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.

 
Nahoru Odpovědět
29.8.2018 14:12
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:29.8.2018 15:18

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 = {
        "&": "&amp;",
        "<": "&lt;",
        ">": "&gt;",
        "\"": "&quot;",
        "'":  "&apos;"
    };
    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>
Editováno 29.8.2018 15:19
 
Nahoru Odpovědět
29.8.2018 15:18
Avatar
Jakub Du
Člen
Avatar
Jakub Du:29.8.2018 15:35

A to aktualizuješ pouze html stránku??

Editováno 29.8.2018 15:35
 
Nahoru Odpovědět
29.8.2018 15:35
Avatar
Jakub Du
Člen
Avatar
Odpovídá na Peter Mlich
Jakub Du:29.8.2018 16:31

A to aktualizuješ pouze html stránku?? Promiň, zapomněl jsem dát odpověď.

 
Nahoru Odpovědět
29.8.2018 16:31
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:30.8.2018 8:19

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.

 
Nahoru Odpovědět
30.8.2018 8:19
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:30.8.2018 9:18

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_conten­ts($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 = {
        "&": "&amp;",
        "<": "&lt;",
        ">": "&gt;",
        "\"": "&quot;",
        "'":  "&apos;"
    };
    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>
 
Nahoru Odpovědět
30.8.2018 9:18
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:30.8.2018 9:21

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.

 
Nahoru Odpovědět
30.8.2018 9:21
Avatar
Jakub Du
Člen
Avatar
Odpovídá na Peter Mlich
Jakub Du:30.8.2018 13:35

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/kon­trolery/CasKon­troler.php". Ale i tak to nefunguje.

 
Nahoru Odpovědět
30.8.2018 13:35
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:30.8.2018 15:49

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.

Editováno 30.8.2018 15:49
 
Nahoru Odpovědět
30.8.2018 15:49
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:30.8.2018 15:51

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.

 
Nahoru Odpovědět
30.8.2018 15:51
Avatar
Jakub Du
Člen
Avatar
Jakub Du:30.8.2018 17:26

Tak nevíte někdo, jak přes js refreshovat div bez toho, aniž by se refreshovala celá stránka.

Editováno 30.8.2018 17:27
 
Nahoru Odpovědět
30.8.2018 17:26
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:31.8.2018 8:49

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);
 
Nahoru Odpovědět
31.8.2018 8:49
Avatar

Člen
Avatar
Odpovídá na Jakub Du
:31.8.2018 11:19

Čuk a Gek :/

 
Nahoru Odpovědět
31.8.2018 11:19
Avatar
Jakub Du
Člen
Avatar
Odpovídá na Jakub Du
Jakub Du:1.9.2018 13:42

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.

Editováno 1.9.2018 13:43
 
Nahoru Odpovědět
1.9.2018 13:42
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:3.9.2018 8:55

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 :)

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
3.9.2018 8:55
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 19 zpráv z 19.