Diskuse ke článku o Dependency Injection
Pod článkem Dependency Injection není žádná věda se vyrojilo několik komentářů, které neměly dle mého přínos k diskusi, ale spíš byly zdrojem nepochopení a špičkování se. Aby neubližovaly samotnému článku určenému pro začátečníky, přenesl jsem je pod tento spot.
Export z Facebooku do Google Calendar
Jak vyexportovat události z Facebooku do Google Calendar, aby vše fungovalo dobře?
Otevřete si Facebook a klikněte na „Události“. Adresa s exportem událostí ve formátu iCalendar je trošku nečekaně ukrytá pod ikonkou lupy:

Adresu si zkopírujte do schránky:

Odkaz bychom mohli hned dát to Google kalendáře, ale narazili bychom na několik nedostatků. Google nedokáže korektně zobrazit neveřejnou událost, místo ní uvidíte pouze nicneříkající slovo „nedostupný“:

Google nedokáže ani filtrovat události podle toho, zda jsme potvrdili účast. Takže kalendář se nám plní nejen událostmi, na které jsme účast potvrdili, ale i těmi, na které nás někdo zatím jen pozval. Navíc u událostí v letním čase uvádí o hodinu více.
Vše lze vyřešit jednoduchým filtrem facebookfilter.php,
který si umístěte na server:
// load events from Facebook
$s = file_get_contents("http://www.facebook.com/ical/u.php?$_SERVER[QUERY_STRING]");
// PREG requires \n line breaks
$s = str_replace("\r\n", "\n", $s);
// fix private events bug in Google Calendar
$s = str_replace('CLASS:PRIVATE', 'CLASS:PUBLIC', $s);
// remove unconfirmed events
function filterEvents($m) {
return strpos($m[0], 'PARTSTAT:NEEDS-ACTION') ? '' : $m[0];
}
$s = preg_replace_callback('#^BEGIN:VEVENT\n(.*?)^END:VEVENT\n#sm', 'filterEvents', $s);
// fix daylight savings bug in Google Calendar
function fixTime($m) {
$zone = new DateTimeZone('Europe/Prague');
$time = new DateTime($m[2], new DateTimeZone('UTC'));
$fix = $zone->getOffset($time) - $zone->getOffset(new DateTime('20000101', $zone));
$time->modify("-$fix seconds");
return $m[1] . $time->format('Ymd\THis\Z');
}
$s = preg_replace_callback('#^(DTSTART:|DTEND:)(.+)#m', 'fixTime', $s);
// revert line breaks back
$s = str_replace("\n", "\r\n", $s);
header('Content-Type: text/calendar; charset=utf-8');
echo $s;
Do Google kalendáře přidáme adresu našeho filtru se stejnými parametry v URL, jako měl původní skript od Facebooku:

A je to!
Jak vypsat funkci, argumenty, proměnné?
Ladíte v prohlížeči PHP aplikaci a potřebujete ji v jednom místě snadno zastavit a přehledně zobrazit všechny důležité informace jako:
- právě volanou funkci
- argumenty, které ji byly předané
- lokální proměnné
- call stack
A občas by se hodily i globální proměnné $_SERVER, $_COOKIES, HTTP hlavičky, apod.
Jak na to?
Tohle umí Laděnka neboli Nette\Diagnostics\Debugger. Pokud používáte Nette Framework, Laděnku už máte, protože je jeho nedílnou součástí. Ostatní si mohou stáhnout přímo framework (disponuje i jednosouborovou verzí) nebo samostatnou verzi NDebugger.zip.
Laděnku nejprve aktivujeme. Pro uživatele samostatné verze stačí zavolat:
ndebug();
(Uživatelé Nette Framework, aktivujte Debugger::$strictMode =
TRUE; a zavolejte Debugger::enable().)
Nyní v místě, kde chceme program přerušit a zobrazit všechny
požadované informace, stačí napsat $stop():
public function authenticate(array $credentials)
{
list($username, $password) = $credentials;
$row = $this->users->where('username', $username)->fetch();
$stop(); // tady se program přeruší
...
Debugger vám přehledně ukáže místo, kde k přerušení došlo:

Všimněte si, že hodnotu lokální proměnné lze zobrazit tím, že na ni najedete myší. Cool!
Můžete si nastavit systém tak, aby při kliknutí na jméno souboru jej otevřel ve vašem oblíbeném editoru:

K dispozici je přehled všech proměnných, které byly funkci předány (pod záložkou Callstack):

A přehledně vypsané všechny lokální proměnné, složitější struktury můžete kliknutím rozbalit:

Samozřejmostí je celý call stack, opět s rozklikávacím pohledem do zdrojového kódu nebo předávaných proměnných. A také lze klikem na jméno souboru jej otevřít v editoru:

Níže najdete všechny informace o HTTP požadavku, počínaje hlavičkami přes cookies k GET/POST proměnným:

A nechybí ani pole $_SERVER, konfigurační direktivy,
konstanty atd:

Dokáže tohle váš framework?
Pokud ne, seznamte ho s Laděnkou.
TOHLE. KURVA. ANI. OMYLEM.
Ne každému a ne na všechno se vždy a univerzálně hodí velké frameworky!
Nadpis jsem si vypůjčil z článku Manifest miniaturního PHP, pod nějž bych se klidně elektronicky podepsal, mít elektronický podpis. Sice argument s počítáním řádků je nefér a diskutabilní, ale rozumím, co se autor snažil říct. Na Zdrojáku jsem pod něj napsal komentář, který jsem se nakonec rozhodl zvěčnit i tu na blogu:
Docela často dělám jednoduché weby, které celé napíšu v „notepadu“, a chci, aby kód neměl víc řádků, než je naprosto nezbytně nutné a nahrávat kvůli 20kB webu i se styly na hosting hafo-megabajtový framework nepřichází v úvahu už vůbec.
Ale přitom i v těch jednoduchých webech chci použít věci, co jsou vyřešené v Nette, a nechci se vzdát navyklého pohodlí. Jsem líný programátor. Z toho důvodu se dá Nette Framework používat jako micro framework.
Chtělo by to příklad. Zrovna včera jsem si redesignoval http://davidgrudl.com a dal k dispozici zdrojové kódy (odkryjte rožek vlevo nahoře), čistě pro inspiraci ostatním, jak takový microsite řeším. Celý PHP kód webu je tvořen jedním souborem index.php, který je, věřím, srozumitelný, byť pro neznalého asi méně. Zbytek jsou šablony. A framework nahraný v minifikované podobě jediného souboru, což, společně s faktem, že má cca dvojnásobnou velikost než jQuery, řeší psychologický blok „nechci nahrávat celej framework“.
Nebo příklad blogu, který najdete přímo v distribuci. Jeho zdroják tvoří taktéž pouze index.php, a to ještě s méně řádky, než v předchozím případě. Vše ostatní jsou šablony, viz https://github.com/…ta/templates.
Asi bych měl napsat, proč vlastně na pidiwebech framework používám. Tak
především si dnes neumím představit, že bych něco programoval bez Laděnky, ta mi pak na ostrém
serveru bude logovat chyby (ačkoliv u statického webu asi nebudou).
Především ale využiju šablonovací systém Latte,
protože už od 2 stránek chci mít oddělený layout a obsah, vyhovuje mi
stručná syntaxe Latte a spoléhám na automatické escapování. Využiji
i routování, protože prostý
požadavek mít URL adresy bez koncovek .php dokáže
v mod_rewrite nastavit (správně!) jen
bůh.
V prvním zmíněném webu se ještě používá kešování pro twitter feedy, na
blogu je zase využit databázový
layer. A taky SEO vychytávka Nette, která automaticky předchází
známé chybě, kdy se při stránkování pohybem vpřed a
vzad dostaneme na tutéž stránku, jen jí v URL bude navíc strašit
page=1.
A taky mi Nette zajistí, že se při chybě nikdy neobrazí programátorské chybové hlášky PHP, ale uživateli srozumitelná stránka. A ještě autoloading – už jej vnímám jako takovou samozřejmost, že bych na něj úplně zapomněl.
Samozřejmě někdy ještě přidám kontaktní formulář a nechám ho odesílat emailem. Teď si teprve uvědomuji, že vlastně využívám 90 % frameworku.
Takhle tvořím quick'n'dirty weby a takhle mě to baví ![]()
Poznámka: napsat konečně článek o tom, proč místo „osvědčeného“ Phing (2,3 MB) používám své Make (71× menší) a je to po všech stránkách lepší udělátko.
Nejkratší parse error v PHP
Jaký je nejkratší kód v PHP, který způsobí parse error? Má
právě 5 znaků a vyžaduje povolené short_open_tag:
<?php
Po spuštění vyhodí:
Parse error: syntax error, unexpected $end of file in test.php on line 1
Syntaktickou chybu lze opravit přidáním mezery nebo odřádkování ![]()
novější články
