Autor Zpráva
spartan13
Profil
Dobrý den,
rád bych se zeptal, jak jsou tvořeny tzv. "aktivní šablony", které načítají některý obsah až posléze. Je mi jasné, že lze šablonu vytvořit takovým způsobem, aby nejprve provedla určitou operaci (vykreslila kostru šablony) a posléze volala funkce, které jsou potřeba. Jak ale následně např. v PHP lze tisknout řetězce dovnitř již hotové kostry?
spartan13
Profil
Jediným způsobem, který mě napadá, je bloky html kódu následně "lepit" pomocí javascriptu, což se mi ale nezdá jako dobré řešení
nemeja
Profil
Jestli se jedná pouze o vizuální efekt, tak by mohlo stačit v PHP vykeslit celou stránku s třídou, která obsah skryje a poté pomocí JS ho odkrývat. Je důležité nezapomenout pomocí <noscript> zrušit skrývání v případě, že JS bude vypnutý. Nic vám potom nebrání stránky pomocí JS měnit, ale funkčnost zůstane zachována.
spartan13
Profil
šlo mi o princip těchto šablon, aby se mohli načíst nejdříve podstatné věci a až potom ty méně důležité nebo výpočetně náročné
_es
Profil
spartan13:
Záleží, čo si vlastne tým svojím dotazom myslel. Možno len spôsob definície pozície prvkov, kde sú síce nejaké elementy v HTML kóde skôr, no vykresľujú sa pritom na stránke nižšie, než skoršie elementy v HTML kóde, alebo opačne. Možno keby si dal nejakú konkrétnu ukážku takej šablóny...
spartan13
Profil
_es:
šablony na principu, jež uvádí např. Jakub Vrána v článku http://php.vrana.cz/vyhody-aktivnich-sablon.php
Alphard
Profil
Uvedený článek nic v javascriptu nelepí. Postupně se vypisuje klasické html, rozdíl je v tom, že se s vypisováním výstupu nečeká, až jsou získána všechna potřebná data (a uložena děkam do pole), ale šablona se začne zpracovávat hned a data např. z databáze se tahají až chvíli, kdy jsou uvnitř šablony potřeba.
Javascriptové donačítání využívá třeba Adminer pro informace o velikosti tabulek v základním přehledu databáze. Je to někdy hodně pomalá operace, takže se vypíše jen tabulka s názvy databázových tabulek, do dalších sloupců se vloží otazníky, a až jsou k dispozici kompletní data, javascript je tam vloží.
spartan13
Profil
zřejmě asi nechápu základy webu, poprosím jestli byste mě někdo mohl alespoň nasměrovat na nějaké články či přímo vysvětlit.

Pokud bych měl následující kód (v PHP tomu asi zde rozumí každý)
Mám za to, že proběhne nejdříve celé zpracování stránky a ta se následně až odešle, jaký princip se tedy využívá u těch "aktivních šablon"? Zvláště pokud by hned první bloky v šabloně měli hned volat nějaký složitější výpočet (ačkoliv třeba obsah není zase tak důlěžitý) tak by výsledné zrychlení bylo zřejmě dosti minimální

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title></title>
    </head>
    
    <body>
        <div>
            obsah, který by měl být viděn dříve
        </div>
        <?php
            for($i = 0; $i < 10000000; $i++){
                // zpoždění - náhrada za výpočty
            }
            echo "<div> zpožděný obsah </div>";
        ?>
    </body>
</html>
Alphard
Profil
spartan13:
Mám za to, že proběhne nejdříve celé zpracování stránky a ta se následně až odešle
To právěže ne. Úvodní část, až po zdržení při cyklu, se odešle hned. Jestli v prohlížeči nic nevidíte, je to způsobeno výstupním bufferem. Kdyby byla hlavička podstatně větší, explicitně jste odeslal výstup, nebo přenastavil buffery, uvidíte ji hned.
spartan13
Profil
vypnul jsem tedy output_buffering i podle phpinfo() ale výsledek je stále stejný. Zkoušel jsem to i na webhostingu (viz. http://web4profi.eu/)
Alphard
Profil
Hostingy mají obvykle více bufferů. Zkuste si na lokále spustit tohle
<?php
header( 'Content-type: text/html; charset=utf-8' );

ob_end_flush();
for($i=0;$i<20;$i++) 
{
    echo "$i. test<br>\n";
    flush();
    sleep(1);
}
echo "konec";
spartan13
Profil
Alphard:
pomocí funkce flush() vše je již funkční (u hostingu tedy ne..)

uvádí se, že je vhodné buffer vyprázdňovat po určitém počtu kB, nenašel jsem tedy žádnou funkci, která by toto automaticky obstarávala (samozřejmě lze udělat jednoduchou rozhodovací logiku, kde se bude pomocí ob_get_length rozhodovat, kdy odeslat data)

ovšem příjde mi, že na začátku skriptu volat ob_end_flush a následně vždy flush() je možná náročnější, než řešení, které by bylo obstarávané přímo serverem.

Rád bych jen poprosil Vás nebo někoho jiného o názor či osobní zkušenost, jaké řešení je cca ideální?

Děkuji.
Alphard
Profil
Funkce pro práci s bufferem se běžně nepoužívají, proto jsem je taky hned neuváděl. Je to spíš demonstrace, v praxi pro specifické případy. Když vypisujete z databáze dlouhou tabulku mnoha dat, která má třeba mnoho kiB, projeví se vliv pull šablon i bez vlastního bufferování.
spartan13
Profil
Alphard:
právě pull šablonu bych se rád (alespoň nějakou základní kostru) pokusil vytvořit, proto mi šlo o tyto principy..
spartan13
Profil
rád bych ještě poprosil o navedení na vhodné články (ideálně v češtině ale předpokládám, že jich asi moc nebude).

snažím se předělat současný šablonovací systém (který jsem sám vytvořil a pracuje jen pasivně, kdy se předá celé pole proměnných a až potom se vykreslí celá stránka)

Mám zrhuba rozmyšlené, jakým způsobem změním logiku priorit volání funkcí ale ohledně bufferu a těchto technických záležitostí mám stále poměrně velké nedostatky.
Jan Tvrdík
Profil
spartan13:
Proč vůbec potřebuješ tu „aktivní šablonu“? Pro naprosto drtivou většinu webů se jedná o zbytečnost. Princip je triviální a byl ti zde vysvětlen. Stejně tak je vysvětlen ve výše tebou zmíněném článku od Jakuba Vrány. Ještě jednou zdůrazňuji, že musíš mít dost speciální typ webu, aby se ti takový koncept vyplatil. A i když ho máš, tak „aktivní šablony“ nemusí být stejně nutně optimální řešení.
spartan13
Profil
Jan Tvrdík:
tak je mi jasné, že pro opravdu většinu webů se jedná o zbytečnost, hodí se asi jen pro weby, kde je extrémě náročný výpočet (což bude většinou nutné řešit spíše výpočet než šablonu), trochu zbytečně jsem se pro tuto alternativu nadchnul (asi zbytečně) kde Jakub Vrána píše "že jsou obecně lepší prakticky vždy".

Princip je jednoduchý a chápu ho, šlo mi spíše o výkonnost bufferů a jejich ideálního používání..

Ale zřejmě máš pravdu, u běžného webu, kde jsou výsledky v databázi nebo dostupné bez složitějšího výpočtu bude tato šablona zřejmě zbytečná. Uživateli asi bude jedno, že se obsah začne zobrazovat o 10ms později..

Díky za názor.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: