Pohodlné procházení filesystémem
Vymyslet dobré API je někdy neskutečný porod. Vedle toho skutečný porod je procházka růžovou ordinací. Snad dva roky jsem neustále překopával třídu na procházení adresářů. A stále nebyl spokojen. Přitom taková blbost. Existuje totiž spousta variant toho, co a jak hledat, které soubory vracet, které adresáře vracet a které procházet rekurzivně, nebo naopak kterým se vyhnout. Také jsem potřeboval řešit specifické situace, kupříkladu když během procházení adresářovou strukturou teprve zjišťuji dodatečná pravidla. Otázkou bylo, jak to navrhnout univerzálně a pokud možno srozumitelně.
Výsledkem snažení je třída Nette\Finder, jejíž API není dokonalé, ale je zatím asi to nejpoužitelnější, k jakému jsem se dopracoval. Můžete si ji stáhnout jako součást Nette 1.0 nebo i samostatně.
Pár příkladů použití:
// nerekurzivní hledání souborů *.txt v adresáři $dir
foreach (Finder::findFiles('*.txt')->in($dir) as $key => $file) {
echo $key; // $key je řetězec s názvem souboru včetně cesty
echo $file; // $file je objektem SplFileInfo
}
// rekurzivní hledání souborů *.txt
foreach (Finder::findFiles('*.txt')->from($dir) as $file) {
echo $file;
}
// hledání podle více masek a dokonce z více adresářů v rámci jedné iterace
foreach (Finder::findFiles('*.txt', '*.php')->in($dir1, $dir2) as $file) {
}
// rekurzivní hledání souborů *.txt obsahujících číslici v názvu
foreach (Finder::findFiles('*[0-9]*.txt')
->from($dir) as $file) {
}
// rekurzivní hledání souborů *.txt kromě těch, co obsahují v názvu X
// pozn.: exclude se tu vztahuje na findFiles()
foreach (Finder::findFiles('*.txt')->exclude('*X*')
->from($dir) as $file) {
}
// rekurzivní hledání souborů *.txt umístěných v adresáři
// začínajícím na "te" ale nikoliv "temp"
foreach (Finder::findFiles('te*/*.txt')->exclude('temp*/*')
->from($dir) as $file) {
}
Omezit hloubku procházení lze metodou limitDepth().
Kromě souborů lze hledat i adresáře přes
Finder::findDirectories('subdir*') nebo obojí
Finder::find('file.txt'). V takovém případě se maska vztahuje
na soubory, nikoliv adresáře.
Adresáře, kterým se chceme zcela vyhnout, uvedeme za klauzulí „from“:
// tady se exclude vztahuje na klauzuli "from"
foreach (Finder::findFiles('*.php')
->from($dir)->exclude('temp', '.git') as $file) {
}
Nejen maskou lze výsledky filtrovat:
// prochází soubory v rozmezí 100B až 200B
foreach (Finder::findFiles('*.php')->size('>=', 100)->size('<=', 200)
->from($dir) as $file) {
}
// prochází soubory změněné v posledních dvou týdnech
foreach (Finder::findFiles('*.php')->date('>', '- 2 weeks')
->from($dir) as $file) {
}
// prochází soubory PHP s počtem řádku větším než 1000 filtrujeme callbackem
$finder = Finder::findFiles('*.php')->filter(function($file) {
return count(file($file->getPathname())) > 1000;
})->from($dir);
V Nette lze jít dál a třídu Nette\Finder skrze extension
methods dále rozšiřovat a poté můžete třeba:
// hledat obrázky s rozměry většími než 50px x 50px
foreach (Finder::findFiles('*')->dimensions('>50', '>50')
->from($dir) as $file) {
}
Třída funguje na Windows i Linuxu a je napsána co nejoptimálněji, měla by tudíž fungovat velmi rychle a neprochází zbytečně adresáře, které nemá. Enjoy!
StárNette a TloustNette?
Můžu v názvu svého programu nebo služby použít slovo „Nette“? Otázka, která v poslední době padá docela často, dokonce si zasloužila oprášit blogísek ;)
Chcete krátkou nebo dlouhou odpověď? Krátká odpověď: bohužel ne. A teď ta obšírnější.
Velice mě těší, že kolem Nette vznikají nové projekty, ať už jde o CMS, wiki, fóra nebo dokonce hostingy. Celý ekosystém. Nette inspiruje programátory, baví je programovat a tvořit. To je prostě paráda!
Když někdo vytvoří open-source fórum a nazve ho NetteForum, je to v podstatě pocta pro framework. Programátor s ním byl nejspíš velmi spokojen, jinak by si ho do názvu nedával. Jenže je tu i druhá strana mince.
Nette Framework je u nás známý a těší se výborné reputaci. Taky se snažíme s komunitou vše pro to dělat. Když se pak objeví projekt NetteNěco, spousta lidí se bude domnívat, že jde o oficiální projekt „od tvůrců Nette Framework“. Ale půjde o omyl a to přeci není příjemné pro nikoho – ani pro uživatele, ani skutečného autora a ani pro framework. Budou hledat podporu na stránkách frameworku, psát e-maily, atd. Budou také očekávat stejnou kvalitu, a pokud je zklame, může to házet špatné světlo i na framework.
Příklad? Nette Framework si buduje image nejbezpečnějšího frameworku. A teď si představte, že vznikne dejme tomu hosting pojmenovaný NetteHosting a ten jednoho sychravého dne hacknou. Zmínka o útoku se objeví na technických serverech a čtenář si řekne: „ejhle, s tou bezpečností Nette to asi nebude tak žhavé.“ Přitom framework s tím nemá naprosto nic společného.
Samozřejmě bych byl rád, kdyby hypotetický NetteHosting a NetteForum byly ty nejlepší služby a držel bych jim palce, ovšem držení palců je to jediné, co mohu dělat. Když s nimi nemám nic společného a žádným způsobem nemohu ovlivnit jejich kvalitu, nechci přijmout ani odpovědnost. Tedy slovo „Nette“ v názvu.
Programátorovi fóra bych stejně spíš poradil: hele, programuješ to pro
lidi, které beztak žádné frameworky nezajímají. Snažit se do názvu
nějak zapasovat „Nette“ je úplně zbytečné, spíš vymysli pěkný
název, co se bude líbit tvým uživatelům, a ať se jim dobře pamatuje. Že
jsi nadšen z Nette Framework raději napiš na své stránky, dej si tam ikonku, obleč
si tričko s logem Nette, ale nepojmenovávej tak své děti ![]()
NETTE!!! OSTRAVA!!!
Mam novinu jak cyp! Tak 11.11. v 11.11 hodin (by si to zapamatovaly i babky z Ludgeřovic) zfarame na 3 hodiny na Bani (Vysoke škole pro štajgery). Esli nas nezavali, řeknu vam o vyvoji webových aplikací v PHP a Nette Framework. Bude to tu v baraku RV101.
Fajne logo jak od Najbrtu
Zfarat možu fšeci, kere zajima vyvoj webovych aplikaci, ať už dělaji jakesik programovaci jazyky nebo maji framework co o něm neslyšela ani svačinařka z NHKG. Jo! A je to zadara!
Řekneme a ukažem si:
- jake je fajne používat frameworky
- základy Nette Framework co je to AJAX, DRY, KISS, MVC
- ukážu, jak s využitím Nette Frameworku vývoj aplikací zjednodušit, urychlit a eliminovat bezpečnostní rizika
- zkusíme si něco naprogramovat
Jako esli bude aj ohňostroj jak na odpustu v Kravařu to nevim, ale aji tak to bude fajne, takže dovalte na faračku! (Je to taky na xichtbuku).
Ukázkový příklad z WebExpa 2009

Na WebExpu jsem měl přednášku nazvanou RIA jednoduše – JavaScript + AJAX + PHP + Nette Framework. Pokusil jsem se ukázat, jak snadno lze psát AJAXové aplikace za použití Nette Framework a jQuery. Během přednášky vznikl jednoduchý příklad, který vám nyní dávám ke stažení.
Protože přednáška byla zaměřená na začátečníky a posluchače,
kteří Nette Framework zatím neznají, začal jsem na zelené louce stažením
frameworku z webu a poté psal celý kód naživo. Doufal jsem, že divák
spíš odpustí různá zaškobrtnutí, která k živému programování
patří, než abych z rukávu vycopy&pastoval předpřipravené kusy kódu
a posluchače připravil o niť. Ale sebekriticky přiznávám, že nervozita
zapracovala a těch zaškobrtnutí mělo být mnohem méně ![]()
Ovocný příklad si můžete vyzkoušet on-line – ovoce a zeleninu můžete přetahovat po ploše, přičemž jejich polohu si server pamatuje v session a tak zůstane zachována i po obnovení stránky. Dále lze plody matky Země přetahovat do modrého nákupního košíku.
Kód jsem ještě doplnil o pár komentářů, aby byl srozumitelnější, a vy si jej můžete stáhnout:
Video z přednášky zatím není k dispozici, ale mělo by se objevit na StreamHostingu.
Kosmetické HTML
V některých rodinách panuje zvyk před odjezdem na dovolenou celý byt vygruntovat. Proč? To kdyby se k nim vloupal zloděj, aby si nepomyslel něco špatného. Do stejného pytle patří kodéři puntičkářsky dbající na vzhled HTML kódu jejich stránek. To aby se jejich kód snáze vykrádal, aby je lepič na Webtrhu nepomluvil.
Sám jsem děsný perfekcionista. Takže mě žralo, že hezky naformátovaná PHP šablona:
<?php
$items = array('user', 'see', 'too');
?>
<ul>
<?php foreach ($items as $item): ?>
<li><?php echo htmlSpecialChars($item) ?>
<?php endforeach ?>
</ul>
generuje ošklivý HTML kód:
<ul>
<li>user <li>see <li>too</ul>
Jak už asi víte, v Nette Framework lze ekvivalentní šablonu zapsat pomocí přehlednějšího Curly Brackets filtru:
<ul>
{foreach $items as $item}
<li>{$item}
{/foreach}
</ul>
Filtr má v sobě zabudovanou kosmetickou drobnost – podle určité heuristiky se snaží učinit perfekcionistické duši za dost. A vygeneruje tento výstup:
<ul>
<li>user
<li>see
<li>too
</ul>
Já vím, pro mnohé z vás je to detail, ale pro nás chronické puntičkáře zásadní feature ;)
p.s. jsou situace, kdy jde o velmi praktickou vlastnost, pokud třeba generujete plain text nebo Texy kód, kde na formátování a správném odřádkování hodně záleží
p.s.s. tahle feature má nulový vliv na rychlost generování stránky
novější články
