V nedávném příspěvku jsem psal o velmi důležité funkci – cachování na straně PHP skripu, které je užitečné zejména v případě dlouhých databázových dotazů nebo složitě parsovaných vstupních dat třeba z webové služby.

Někdy je nutné data načíst znovu ještě před expirací cache, např. při ladění skriptu. Občas se něco nepovede i při běžném provozu a uživateli bychom měli umožnit obnovení celé stránky pomocí CTRL+F5 i za cenu, že zpracování stránky bude trvat déle.

Použijeme skript původního příkladu, ale do podmínky pro načtení


přidáme ještě testování na parametr HTTP_PRAGMA, kterým nám server naznačuje, že si uživatel nepřeje načítat data z cache.


Pokud ještě zaměníme v názvu bloku ‘narocnyblok’ za md5 hashované parametry, máme už dokonalý kešovací skript.


Každý javascriptový programátor zřejmě už slyšel tajemnou zkratku JSON. A pokud už předtím měl nepříjemné zkušenosti s XML, má z webových formátů možná posvátný respekt až hrůzu. O tom, že JSON je technologie naopak velmi uživatelsky přívětivá, je následující článek.

JSON je formát dat, který podobně jako XML umožňuje přenášet formátovaná data – pole – z jedné platformy na druhou. Programátory AJAXových aplikací si zkrátka musí získat skvělý způsob, jakým lze poskytovat data z PHP do Javascriptu.

Začínáme

Pro začátek trochu nemilá zpráva pro příznivce konzervativních až zpátečnických hostingů: funkce pro práci s tímto formátem jsou dostupné pouze od verze PHP >= 5.2. Nám ostatním funguje funkce json_encode(). A pokud vás k přechodu na pořádný hosting nepřesvědčí ani to, že váš hoster kašle na bezpečnost, určitě zvládnete tuto funkci implementovat sami na pár řádcích PHP kódu.

Posíláme data z PHP

Funkce json_encode() nedělá než nic jiného, než že vezme jakékoliv (nejlépe asociativní) pole a vytvoří z něj string formátovaný v JSON.
<?php
$r['jmeno']='Pavel';
$r['prijmeni']='Novak';
$r['bydliste']['ulice']='Sokolská';
$r['bydliste']['cp']='666';
$r['bydliste']['mesto']='Strakonice';
echo json_encode($r);

// výstup:
// {"jmeno":"Pavel","prijmeni":"Novak","bydliste":{"ulice":"Sokolovska","cp":"666","mesto":"Strakonice"}}
?>

A teď do Javascriptu tím!

Co je na tom nejzajímavější: Protože se jedná o přímou javascriptovou syntaxi zápisu objektu, Javascript už s takto formátovaným stringem umí pracovat, není třeba řetězec složitě parsovat nebo upravovat!

Stačí jeden eval().


var a= '{"jmeno":"Pavel","prijmeni":"Novak","bydliste":"ulice":"Sokolovska","cp":"666","mesto":"Strakonice"}}';
eval('var obj='+a)
//Zobrazení hodnot
alert(obj['bydliste']['mesto']);
//anebo
alert(obj.bydliste.mesto);

(Napsáno v prohlížeči Google Chrome)

Tak jsem tu novinku taky prozkoumal, když už to bylo i na Nově.

A … jsem mile překvapen. Všechno funguje jak má. Bookmarky.cz taky.

Ale co jsem opravdu nečekal: rychlost. Prohlížeč se otvírá i zavírá bez dlouhého škrábání na disku, všechny stránky fungují vůbec velmi (!) svižně – proti Firefoxu i bez výrazných paměťových nároků.

Pár postřehů a první dojmy

  1. Google se snaží oslovit zapřísáhlé uživatele Internet Exploreru minimalistickým designem a podobným rozmístěním ovládacích prvků.
  2. Všechno funguje. Bookmarky.cz, TinyMce, JQuery, WordPress, Ajax, content-editable, vše bez problémů, ale mnohem rychleji.
  3. Excelentní rychlost vykreslování stránky.
  4. Ještě excelentnější :-) rychlost Javascriptu
  5. Na nové kartě se zobrazí nejnavštěvovanější weby ve stylu SpeedDial ve Firefoxu.
  6. Menší paměťové požadavky než Firefox3.
  7. Trochu nezvyklé – není žádné vyhledávací pole. Takto sice umí fungovat i Firefox a IE, ale stejně…
  8. Trochu mě vyděsilo, že si prohlížeč naimportoval i uložená hesla z Firefoxu.
  9. Vývojářská konzole – možná bude chtít delší zkoumání, uvidíme. Taky je tam nějaký profiler. Ale na FireBug stejně nemá.
  10. Každá Textarea má růžek pro změnu velikosti. Moc pěkné. Škoda že není taky v dolním rohu prohlížeče.
  11. V adresním řádku je zvýrazněna doména tmavým písmem. Detail, ale celkem fajn.
  12. Dialog pro upload souboru neumožňuje pastnout název souboru, stejně jako ve Firefoxu3. Místo toho je trochu nevzhledný nápis.
  13. Chrome nemá stejně jako IE7 hlavní menu. Pokud jste geek, pak znáte klávesové zkratky. Pokud používáte IE7, je na vás příliš i to, co máte na liště.
  14. Animovaná šipka při downloadu souboru určitě ozvláštní nudné hodiny surfování po netu.
  15. Hodily by se na liště buttonky Historie a Záložky, snad by tolik místa nezabraly. Aspoň že tlačítko Home lze zapnout, i když zrovna to bych oželel.
  16. Sidebar je asi přežitek. K ničemu, pryč s ním.
  17. Moc pěkné je naopak vytvoření nového okna prohlížeče pouhým přetažením mimo hlavní okno a vrátit zpět do původního okna. Zajímavé, funguje i v Opeře. A ve Firefoxu ne. Můžete také měnit pořadí karet na panelu.
  18. Důležité může být i Anonymní okno (zlé či jinak vášnivé jazyky používají termín porn mode), kde se zřejmě dlouhodobě neukládají přihlašovací údaje a historie prohlížených stránek.
  19. Výpis navštívených stránek lze zobrazit Ctrl+H

Shrnutí

Při vývoji webových aplikací potřebuju hlavně rychlé načítání stránek a rychlý start prohlížeče. Další “vylepšení” jsou víceméně jenom kosmetická. Lidi stejně zajímá jenom obsah webu. Ale pokud by se vývojářům Google Chrome podařilo odlákat lidi od Internet Exploreru (a možná také vymyslet vlastní pořádný název), pak si zasloužil své místo na slunci.

P.S.: Pro zastánce konspiračních teorií:  Podle tohoto článku byla opravena licenční smlouva, kde si firma Google údajně osobuje právo na cokoliv projde oknem prohlížeče,  která byla zjevně pouze okopírovaná z jiných služeb Google.

Pokud máte projekt v PHP, kterému se věnujete už několik let, zřejmě se nevyhnete také “nánosům minulosti”.

Tohle je jedno z nejčastějších a nejčastěji porušovaných pravidel při programování v PHP a je třeba je tesat do kamene:

OPRAVDU INICIALIZUJTE VŠECHNY PROMĚNNÉ.


<?
$pole=Array('nula','jedna','dvě', 'tři');

foreach($pole as $b){
$vystup[$i]=Array($i,$b);
$i++;
}
echo $vystup[0];

?>

A co je na tom špatně?
Pokud nemám inicializovanou proměnnou $i, nebude mít $i počáteční hodnotu “0”, ale jenom “”, což platí i pro asociativní pole. Tudíž počáteční prvek pole není uložen v $vystup[0], ale $vystup[”].

Nojo, jednoduché. Pokud víte, co a kde hledat.

Kvůli nově zavedené podpoře inline-block ve Firefoxu3 (waaaaau užasnou teď jistě uživatelé IE5+) je třeba mírně upravit poměrně známý zarovnávací hack pro plovoucí (float) elementy.

/* This needs to be first because FF3 is now supporting this */
.clearfix {display: inline-block;}

.clearfix:after {
content: ” “;
display: block;
height: 0;
clear: both;
font-size: 0;
visibility: hidden;
}

/* Hides from IE-mac \*/
* html .clearfix {height: 1%;}
.clearfix {display: block;}
/* End hide from IE-mac */

Proč je nutné zarovnávat dva plovoucí elementy vedle sebe když už jsou zavřeny v DIVu a ještě je na to potřeba takto složitou konstrukci? A proč jsme asi 10let nemohli v Mozille/Firefoxu nastavovat rozměry inline elementu? Tak tohle ví asi jenom vývojáři zmiňovaných prohlížečů.

« novější článkydalší články »