Klávesové zkratky na tomto webu - rozšířené Na obsah stránky

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.

clock před 22 dny pencil Nette comments Komentáře: 10


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

clock před měsícem pencil PHP comments Komentáře: 8


Špeky a párky v nahrazování řetězců

Jak se nenechat vypéct při nahrazování výskytů jednoho řetězce jiným.

Základní funkcí pro nahrazování řetězců v PHP je str_replace:

$s = "Lorem ipsum";
echo str_replace('ore', 'ide', $s); // vrací "Lidem ipsum"

Díky chytře vymyšlenému kódování UTF-8 ji lze spolehlivě používat i pro takto kódované řetězce. Navíc jako první dva argumenty lze uvést pole a funkce potom provede vícenásobné nahrazení. A tady narážíme na první špíček, který je třeba mít na zřeteli. Každé nahrazení prochází řetězec znovu, pokud bychom tedy chtěli ve větě pánské dárky prohodit < ⇒ a získat tak dánské párky (švédská delikatesa!), žádné pořadí argumentů k cíli nepovede:

// vrací "dánské dárky"
echo str_replace(array('dá', 'pá'), array('pá', 'dá'), "pánské dárky");

// vrací "pánské párky"
echo str_replace(array('pá', 'dá'), array('dá', 'pá'), "pánské dárky");

Hledanou funkcí, která řetězec projde jen jednou a zamezí vzniku kolizí, je strtr:

// vrací "dánské párky", hurá
echo strtr("pánské dárky", array('pá' => 'dá', 'dá' => 'pá'));

Pokud bychom hledali výskyty podle složitějších pravidel, využijeme regulární výrazy a funkci preg_replace. Ta také umožňuje vícenásobné nahrazování a chová se stejně jako str_replace. Teď však mířím jinam. Potřebuji v řetězci nahradit všechny čísla slovem hafo, což je snadné:

$s = "Radek tvrdí, že má IQ 151. Pěkný sběratelský kousek!";
echo preg_replace('#\d+#', 'hafo', $s);

Zobecněme kód, nechť umí čísla nahradit čímkoliv, co mu předáme v proměnné $replacement. Řada programátorů použije:

return preg_replace('#\d+#', $replacement, $s); // spatne!

Což bohužel není dobře. Je třeba si uvědomit, že i v nahrazovaném řetězci mají určité znaky speciální význam (konkrétně lomítko a dolar), proto ho musíme escapovat. Správné obecné řešení je:

return preg_replace('#\d+#', addcslashes($replacement, '$\\'), $s); // ok

Napadají vás ještě nějaké nahrazovací špeky?

clock před měsícem pencil PHP comments Komentáře: 4


Git: snadný cherry-pick z Githubu

Pokud vám někdo na Githubu pošle commit, je vhodné ho před začleněním do hlavní větve ověřit nebo třeba upravit. Jak si snadno commit z Githubu vyzobnout do svého repozitáře? Používám k tomu skript remotepick.phpc, který spustím v repozitáři a jako parametr uvedu URL commitu. Což je adresa, na kterou vede například odkaz 363413a na této stránce. Takže spustím:

remotepick.phpc https://github.com/hrach/nette/commit/363413a042adff12a3e26b28fb4fabebdeb208f8

A skript vypadá takto:

<?php
$url = @$_SERVER['argv'][1];

if (!preg_match('#github\.com/([^/]+)/([^/]+)/commit/(\w+)$#', $url, $m)) {
        exit("Invalid URL");
}

list(, $name, $repo, $hash) = $m;
passthru("git remote add temp http://github.com/$name/$repo.git");
passthru("git fetch temp");
passthru("git cherry-pick $hash");
passthru("git remote rm temp");

Poté se commit objeví v aktuální větvi .

clock 22. 11. 2011 pencil PHP comments Komentář: 1


Git: jak na hromadný rebase

Pokud máte v Git repozitáři víc vývojových větví, je rozhodně dobré je průběžně aktualizovat oproti masteru. V řeči Gitu jde o rebase. Aktualizované větve se pak mnohem snáze aplikují (merge) do hlavní vývojové větve. A pokud máte větví opravdu hodně, aktualizovat každou zvlášť je zdlouhavé. Pomoci může skript rebaseall.phpc, který stačí zavolat někde uvnitř repozitáře:

<?php

// zjisti seznam větví
exec('git branch', $branches);

// postupně každou rybejzuj proti masteru
foreach ($branches as $branch) {
        $branch = trim($branch, "* \r\n");
        passthru("git rebase master $branch", $errorCode);
        if ($errorCode) {
                exit;
        }
}

// a nakonec se vrať na master
passthru('git checkout master');

Je možné, že se to dá zapsat i jedním příkazem z bashe, ale já rád skriptuju v PHP a bash nemám.

clock 22. 11. 2011 pencil PHP comments Komentáře: 2


phpFashion © 2004, 2012 David Grudlo webu

Pokud není uvedeno jinak, podléhá obsah těchto stránek licenci Creative Commons BY-NC-ND Creative Commons License BY-NC-ND

Ukázky zdrojových kódů smíte používat s uvedením autora a URL tohoto webu bez dalších omezení.