Nette a Doctrine

Účast na mé první Posobotě předčila veškeré očekávání. Perfektní workshop, skvělé přednášky a úžasní lidé kteří nic netají. Na workshopu jsem díky Filipovi a Chemixovi pronikl do základů Doctrine. Zkusím tyto informace sepsat.

Instalujeme Nette

Ani nemyslete na to že to budete zkoušet bez composeru 🙂

nette-doctrine je název složky do které se sandbox vytvoří.

Instalujeme Kdyby/Doctrine

Pokud máte PHP verzi alespoň 5.4 hned z konzole můžete spustit web server:

webserver se spustí na portu 8888. Pokud do prohlížeče zadáte http://localhost:8888 uvidíte stránku Nette Congratulations!

Práda! Můžeme začít spouštět IDE a zažneme kódovat.

PhpStorm a live templaty pro Doctrine

Rozhodně doporučuji PhpStorm do kterého Filip napsal skvělé live templaty. Ušetří spoustu psaní a času.

Live templaty stáhněte a nahrajte do:

Rozhodně doporučuji soubory: Doctrine.xml, Nette.icls, Nette.xml

Po nahrání je nutné znovu spustit PhpStorm.

Vytvoření databáze

Pojďme si vytvořit databázi a uživatele pro přístup k databázi:

Příkaz vykonáme v Admineru: http://localhost:8888/adminer

Klikneme na tlačítko SQL příkaz. Do okna vložíme kód výše a jeho vykonání potvrdíme tlačítkem Provést.

Tím jsme vytvořili databázi doctrine_devel a uživatele doctrine s heslem doctrine_pass.

Zaregistrování Doctrine do Nette

Do config.neon zamergujeme následující kód:

Do config.local.neon uložíme přístupové údaje do DB pro vývoj u nás na localhostu:

Podle dokuentace Kdyby/Doctrine si vytvoříme první entitu:

app/model/Article.php

V entitě Article definuje id (celé číslo, které se bude inkrementovat) a title (text).

Vytvoření tabulky z entity

V první řadě ověříme zda funguje Doctrine/Console:

Výstup by měl vypadat takto a měl by zobrazovat všechny dostupné příkazy pro Doctrine:

Provedeme validaci:

OK, to je v pořádku:

Podíváme se jaký SQL kód nám Doctrine nabízí pro synchronizaci databáze:

SQL kód pro synchronizaci databáze:

Tento kód můžete vykonat v admineru, neb pokud máte koule můžete ho nechat vykonat přímo z příkazové řádky (hlavouni to nedoporučují):

Nyní když znovu spustíme validaci, vidíme:

Namapování a databáze jsou OK, pojďme na ukládání a zobrazení dat.

Doctrine – ukládání dat

V HomepagePresenter.php si uděláme add akci na přidání záznamů do entity Article:

Definovali jsme $entityManager do které jsme injectli Kdyby\Doctrine\EntityManager.

V actionAdd jsme vytvořili 2 články které uložíme do DB. První s názvem Slabikář a druhý s názvem Čítanka. V DB se můžete přesvědčit že došlo k jejich uložení do tabulky article.

Doctrine výpis dat

Velice podobným způsobem jako jsme ukládali data je budeme vypisovat. Opět budeme potřebovat EntityManager:

v šabloně tyto články zobrazíme:

Jednoduché že ano?

Přidání nového položky do entity

Naše aplikace je známá po celém světě a používají ji milony lidí kteří píší podměty že jim pouze název článku nestačí a chtěli by ještě text článku 🙂 Vyhovíme jim a přidáme do entity Article ještě položku text.

Nyní nám perfektně poslouží Filipovo live templaty. Otevřeme si soubor Article.php a pod proměnou private $title odřádkujeme a napíšeme: col <tab> (napíšeme col a stiskneme klávesu Tab). Ide nám předvygeneruje následující kód:

ve kterém se pohybujeme klávesou Tab. Napíšeme název proměnné (text) a definujeme typ (text). Výsledek vypadá takto:

Provedeme validaci:

která nám oznámí že nemáme synchronizovanou databázi. Podíváme se jaké úpravy databáze nám Doctrine nabízí:

Kód vykonáme v admineru, nebo 🙂

Následná validace by měla být OK. Tím máme přidán sloupec text a můžeme do něho rovnou ukládat data. Vytáhneme námi uložené publikace a donastavíme jim text:

Upravíme šablonu abychom vypisovali text:

 Vyšší liga – vazby mezi entitami

Toto jsme splodili na Workshopu:

Article.php

Author.php

Tag.php

HomepagePresenter.php

Šablona:

 

Celé databázové schéma smažeme a vytvoříme znovu:

Celou ukázku jsem nahrál na GitHub: https://github.com/venca-x/nette-sandbox-doctrine

Composer: jak nainstalovat Nette 2.3.0-beta

Po vystřízlivění ze včerejší posoboty nastal čas vyzkoušet Nette 2.3.0-beta.

Upgrade je jednoduchý. Stačí upravit composer.json:

Velice důležitý je řádek minimum-stability: beta a prefer-stable: true

Následně do konzole pustíte příkaz composer update a můžete testovat Nette 2.3.0-beta

Nette: zmenšení průhledného PNG, zachování průhlednosti

Při zmenšování průhledného PNG obrázku v Nette jsem měl problém se zachováním průhlednosti. Místo průhlednosti byla černá barva. Nakonec jsem problém vyřešil takto:

Kód resize je obalen alphaBlending a saveAlpha

Debian 7 (wheezy) instalace PHP 5.6

Dnes jsme se při vývoji webu eshopvikend.cz zasekli na PHP 5.3. Knihovna pro přihlášení uživatelů přes sociální sítě vyžaduje alespoň PHP 5.4

Inu, mám trochu času tak se podívám na mé VPS na kterém běží Debian 7 Wheezy a PHP 5.4.36. Většina mých projektů je na Nette (verze 2.2) nebo aktualizovaný WordPress. S přechodem na PHP 5.6 nebude problém 🙂

Po motivačním videu od Petra Krčmáře se jde na to!

Dávejte pozor a před aktualizací pro jistotu zazálohujte vaši konfiguraci! Rovněž nezapomeňte že při upgrade na PHP 5.6 na Debianu budete potřebovat Apache 2.4 (který má trochu jiné konfigurační soubory)

Ze stable repozitáře Debianu (Wheezy) není možné nainstalovat vyšší verzi PHP než 5.4. Připadá v úvahu ruční kompilace, ruční instalace zkompilovaného balíčku nebo backports.

Backports má výhodu v tom, že nainstalované programy bude možné dále aktualizovat a pokud chceme instalovat z backports musíme při instalaci zadat určitý identifikátor.

Větve Debianu:

  • stable – bylíčky z větve testing se přibližně jednou za 2 roky vezmou a překlopí do větve stable
  • testing – balíček který se 14 dní neopravoval ve větvi unstable propadne do větve testing
  • unstabe – neznamená nestabilní (lépe řečeno pohyblivá) – často přichází nové verze balíčků

Pokud chceme novější PHP, použijeme větev testing.

Ze všeho nejdřív doporučuji nainstalovat apt-show-version:

 

Nastavení výchozí větev pro instalaci balíčků

vim /etc/apt/apt.conf.d/00release

Nyní přidáme testing repozitář:

vim /etc/apt/sources.list přidáme řádek:

Uděláme update balíčků:

Podíváme se na dostupné verze PHP:

Kde vidět aktuálně nainstalovaná verze 5.4.36-0+deb7u1 a dostupná verze 5.6.4+dfsg-1 z testing větve.

Přidaný testing repozitář nená žádný vliv na instalací balíčků. Pro instalaci z testing větve je nutné uvést parametr. Přesvědčme se o tom. Zobrazme si verzi PHP která se nabízí k instalaci:

Vidíme že instalátor nabízí: Version: 5.4.36-0+deb7u1

Pokud chceme instalovat balíčky z testing větve použijeme parametr: -t testing

Nyní si zobrazme verzi PHP nainstalovaného z testing větve:

Vidíme že instalátor nabízí: Version: 5.6.4+dfsg-1 který nainstalujeme:

 

 

CoffeeScript + Node.js => Hello world

Poslední dobou ujíždím na Node.js. Neskutečně rychlý nástroj! K tomu se pokouším naučit CoffeeScript. Blog dost často používám jako “tahák” co jsem jak dělal. Pojďme si ukázat jak na první Hello World.

CoffeeScript můžeme nainstalovat globálně (bude přístupný v celém OS):

Inicilizujeme Node.js projekt – vyplníme požadované údaje, čímž se vytvoří soubor package.json:

Node přidáme jako závislost do projektu (packages.json):

server.coffee:

Spustíme coffee script v Node.js:

V prohlížeči na adrese http://localhost:5000/ vidíme výsledek

Velice zajímavý mi přijde modul express, což je minimalistický a rychlý framework pro pohodlnější generování stránek:

Spustíme příkazem

a o správné funkčnosti se opět přesvědčíme na portu 5000

Node.js crawling data

Pokud někdy budete chtít získávat obsah webových stránek, doporučuji kvůli rychlosti použít Node.js a modul nazvaný jsdom. Tento modul analyzuje webovou stránku ze které získá DOM, který můžete parsovat přes jQuery.

Před nainstalováním jsdom je nutné nainstalovat Python (verze 2.x) Při instalaci je nutné zaškrtnou volbu Python do PATH (App python.exe to Path).

Nainstalujeme jsdom:

example.js

spustíme příkazem:

 

Jak nainstalovat Grunt pod Windows

Pojďme si ukázat nástroj, který za mne dělá špinavou práci. Všechny procesy které děláte stále ručně do kola se většinou dají zautomatizovat. Já je nechávám na Gruntu aby je udělal za mne. Stroj nedělá chyby a je rychlý.

Dnes si ukážeme úvod do Gruntu. S Gruntem spolupracuje další skvělý nástroj – Bower. Ale o tom až někdy příště.

Pro zprovoznění programu Grunt je nutné nainstalovat node.js

Z webu stáhneme instalaci (tlačítko INSTALL) a nainstalujeme. Instalaci stačí odklikat. Po dokončení instalace pro jistotu restartujeme PC.

Přesvědčíme se že máme správně nainstalovaný node.js. Spustíme příkazovou řádku ( Start -> Příslušenství -> Příkazový řádek ). Do příkazové řádky zadáme příkaz node a potvrdíme klávesou ENTER:

node-test-run

Součástí každého projektu by měl být soubor package.json. Vytvoříme ho příkazem:

package.json obsahuje základní informace o projektu ( autor, verze, verzi Node, závislé balíčky a jejich verze, …) je to něco jako composer.json pro php. Pokud si projekt s tímto souborem stáhnete, jednoduše nainstalujete všechny potřebné balíčky příkazem:

Instalace Grunt

Parametr -g říká, že Grunt instalujeme globálně.

Úspěšné nainstalování Gruntu prověříme příkazem:

node-test-run-grunt

Z hlášky v konzoli je vidět že nemáme soubor Gruntfile.js pojďme si ho vytvořit (ten musíme vytvořit ručně):

Vytvořili jsme 2 tasky:

  • section – multiTast vykoná všechny tasky v sekci section
    node-test-run-grunt-run
  • only-baz – vykoná pouze 1 task ze sekce section ( section -> baz )
    node-test-run-grunt-run-1task

Neužitečný příklad výstupu, ovšem nutný pro pochopení fungování Gruntu. Příště si ukážeme zajímavější použití v praxi 🙂

Nette: handle (signál)

Předpokládejme že máme TODO list ve kterém budeme chtít vybraný úkol nastavit jako splněný.

Na takový úkon je vhodný signál:

Signál v šabloně zavoláme jednoduše:

 

Grunt – task pro automatický release nové verze

Dělám na několika doplňcích pro WordPress. Kámen úrazu je verzování. S vydáním nové verze jsem musel přepisovat verzi ve zdrojovém kódu, vytvořit nový tag v Gitu a tuto změnu commitnout a pushnout. Ale protože jsem lajdák vždy jsem na něco zapoměl…

Při vydání nové verze dělám:

  • nastavit novou verzi ve zdrojových souborech ( Version: 0.0.1 => Version: 0.0.2 )
  • coomitnout tuto změnu
  • vytvořit nový tag ( 0.0.2 )
  • pushnout tyto změny

To jsem dělal ručně do doby než jsem poznal Grunt. Nyní mám tento proces automatizovaný a tuto nudnou opičí práci za mne udělá Grunt.

Pojďme si ukázat jak. Předpokládejme nainstalovaný Grunt (o instalaci Gruntu zase někdy jindy).

Vytvoříme soubor package.json:

Nainstalujeme grunt-version:

Vytvoříme soubor Gruntfile.js:

Příkazem grunt release nastavíme v souboru my-file.php novou verzi uvedenou v package.json:

Version:           0.0.1 se změní na verzi zadanou v souboru package.json

To je solidní základ 🙂 Ale mne to nestačí. Verzi kterou chci vydat musím zapsat do souboru package.json a příliš práce to za mne neudělá…

Dělám různé releasy:

  • patch (1.2.X)
  • minor (1.X.0)
  • major (X.0.0)

Pojďmě si napsat script který bude automaticky zvyšovat verzi v souboru package.json v závislosti na vydávané verzi. Vužijeme modul grunt-update-json

Použijeme tento kód:

To už je lepší. Můžeme použít následující příkaz:

  • grunt release:patch
  • grunt release:minor
  • grunt release:major

K dokonalosti chybí pouze commit, vytvořit tag s novou verzí a push. K tomu využijeme grunt-git

Do souboru package.json přidáme následující kód:

Celý kód nakonec vypadá takto:

 

 

Nette + Texy

Pokud si zájemce o web přeje základní formátování textů, vetšinou nejprve sáhnu po Texy. Nemám rád weby které vypadají jako omalovánky (ano, tomu kdo dá tu práci aby každé písmenko ve slově mělo jinou barvu se to moc líbí ale spoustu návštěvníků to odradí). Texy je jednoduchý nástroj kterým můžete bez odborných znalostí psát HTML kód. Příklad si ukážeme na jednoduchém formuláři, jehož odesláním naformátujeme zadaný text přes Texy.

 

Pojďme si ukázat jak zprovoznit  Nette společně s Texy!

Ukázka je na poslední verzi Nette (2.2.6) a poslední verzi Texy (2.6).

Instalace Nette

Stáhneme Nette sandbox (přes composer):

příkazem se vytvoří složka nette-texy do které se nahraje Nette + sandbox. Document root pro virtualhost nasměrujeme do nette-texy/www/

Instalace Texy

nainstalujeme samozřejmě přes composer :

 

Zprovoznění Texy

Uděláme si pořádek na hřišti. Nahradíme obsah šablony pro titulní stránku: app/templates/Homepage/default.latte:

 Vytvoření formuláře

app/presenters/HomepagePresenter.php:

Máme formulář který při odeslání odešle do šablony (proměnná $text ) zadaný text.

Zapnutí Texy

Nejprve je nutné přidat Texy do neon.config aby o Nette o Texy vědělo:

app/config/config.neon:

 

 

V souboru app/presenters/BasePresenter.php je nutné vytvořit helper, který bude fomárovat text přes Texy.

V nové verzi Nette (>=2.4) se helper (filtr) registruje takto, metodu createTemplate můžete úplně vynechat):

Nejlepší cesta

Kvůli bezpečnosti, doporučuji tento způsob použití, ve kterém filtr vrací Nette\Utils\Html, který nemusíme nonescapovat. Registrujeme filter klasicky v beforeRender:

A pak již pouze v šabloně vypíšeme: