[2010–01–23] Vyšla stabilní verze 0.9.3

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
David Grudl
Nette Core | 8129
+
0
-

Po dvou měsících je tu verze 0.9.3. Přináší poměrně dost novinek a opravuje chybičky.

  • vylepšení jazyka o globální funkci callback() a Nette\Callback pro čitelnější zápis a volání callbacků
  • zásadního zrychlení dosáhla třída RobotLoader
  • opraven bug přehazující pořadí parametrů v URI
  • vylepšený RoutingDebugger zobrazuje více informací
  • přidána třída DateTime53 opravující zmršený DateTime v PHP 5.2 (podpora serializace & unix timestamp)
  • metoda createComponent() může vracet instanci
  • sjednoceno chování všech funkcí ve frameworku, kterým se jako parameter předává čas. Ten může být zadán buď jako objekt DateTime, řetězec ve formátu '+ 14 days', jako relativní počet sekund nebo jako UNIX timestamp.
  • přidána třída Nette\Web\HttpContext
  • přidány funkce String::padLeft() a String::padRight() (obdoba str_pad pro UTF-8)
  • deprecated: Uri::setPass() a getPass() nahrazuje Uri::setPassword() and getPassword()
  • deprecated: HttpResponse::expire() nahrazuje HttpResponse::setExpiration()
  • deprecated: Nette\Object::getClass() (důvodem je příliš obecný název, lze nahradit za $obj->reflection->name)
  • odstraněny třídy Nette\Loaders\SimpleLoader, Nette\Config\ConfigAdapterXml, Nette\Forms\RepeaterControl

Formuláře

  • InstantClientScript: formuláře generují zgruntu nový validační JavaScriptový kód. Ten by měl být lépe přizpůsobitelný (např. pro live validation) a je nezávislý na HTML ID. V této oblasti bude vývoj pokračovat, nicméně nové chování by mělo být stabilní.
  • HttpUploadedFile: příkaz move() řeší problematiku přístupových práv, umí vytvořit adresář a lze jej použít i pro více přesunů.
  • Html: vylepšeno chování metod getHtml() a getText(), takže objekty Html lze bez problémů používat v labelech apod.
  • deprecated: Form::processHttpRequest() bylo přejmenováno na Form::fireEvents()

Debug

  • globální funkce dump() jako (nejen) zkratka pro Nette\Debug::dump()
  • Debug::enable() lze předat výčet IP adres
  • kvůli šetření místem nyní Debug nevytváří HTML logy pro opakující se chyby (zvažuju ukládat soubory komprimované)
  • opraveny nedostatky logování chyb na některých hostinzích

Šablony

  • isFirst() a isLast() podporuje renderování mřížek
  • v šablonách lze psát <?xml ... ?> bez kliček kvůli PHP parseru
  • Makro {debugbreak} podporuje XDebug
  • deprecated: LatteFilter::invoke potažmo CurlyBracketsFilter::invoke (zpravidla by mělo stačit inicializaci filtru odstranit)

Image

  • metoda resize() se zápornými argumenty zrcadlí obrázek (Image i ImageMagick)
  • metoda calculateSize() je nyní statická (BC break!)

Nette\Reflection

Asi nejvýraznější novinkou je nový soubor tříd Nette\Reflection, které sjednocují a rozšiřují možnosti meta-programování. Sem byla přesunuta podpora anotací a zpracování extension method. Řekl bych, že tohle bude příští velká věc, nicméně tuto oblast čeká ještě velký vývoj.

Cache a session

Co ve verzi 0.9.3 není?

Ve verzi 0.9.3 nejsou vývojové záležitosti jako tzv. nové snippety, nezměnila se třída Identity a Presenter používá starou adresářovou strukturu a má stále aktivní přepínače $oldLayoutMode a $oldModuleMode. Zmíněné novinky najdete až ve vývojové větvi 1.0-dev.

Kromě uvedených deprecated metod by se žádná nekompatibilní změna objevit neměla, takže upgrade na 0.9.3 je doporučený.

Vyki
Člen | 388
+
0
-

David Grudl napsal(a):

Přešel jsem na PHP 5.3, kde je již nativně sqlite3. Bylo by možné přidat podporu i pro sqlite3, když už má být framework pokrokový a plně použitelný na PHP 5.3 serveru?

Editoval Vyki (23. 1. 2010 10:15)

mcmatak
Člen | 490
+
0
-

Object::getClass() is deprecated

proč??? jako je mi to jedno můžu všude přepsat get_called_class nahrazený to mám v nějakým IDE asi rychle …

Panda
Člen | 569
+
0
-

Místo Object::getClass() by se mělo používat Object::getReflection()->getName(), kam to patří asi víc. get_called_class() nepoužívej, je až v PHP 5.3 a slouží pro potřeby Late Static Bindings.

pekelnik
Člen | 462
+
0
-

Především nemůžeš v žádné třídě mít „property“ class.

Honza Marek
Člen | 1664
+
0
-

Ano, vyžaduju metodu $object->getClass()!

David Grudl
Nette Core | 8129
+
0
-

Problém getClass() je v jejím poměrně obecném názvu, takže pokud zachovat, tak jako getClassName().

Stejný výsledek vrací i getReflection()->getName(), což lze nyní zapsat přes reflection->name, samozřejmě je to o něco pomalejší, ale kupodivu nijak dramaticky.

Sonduju hlavně odezvu :)

Honza Marek
Člen | 1664
+
0
-

Ještě nedávno bylo getClass vydáváno za jednu z hlavních killer feature, že to jako dělá z php kulturní jazyk a že getClass je i v jiných jazycích :)

redhead
Člen | 1313
+
0
-

Jsem pro zachování

Inza
Člen | 330
+
0
-

Zachovat getClass! – a zápis $foo->class mi připadá srozumitelný a jednoznačný dostatečně! – BTW jiné jazyky to mají také tak! Jako v nejhorším přejmenovat na className, ale rozhodně nechat!

Honza Kuchař
Člen | 1662
+
0
-

I přes to, že to budu muset přepsat, tak jsem pro přejmenování na getClassName(). Přijde mi to jednoznačně logičtejší.

//EDIT: překlep

Editoval honzakuchar (23. 1. 2010 17:32)

Jan Tvrdík
Nette guru | 2595
+
0
-

getClass se mi díky své obecnosti a nelogičnosti nikdy nelíbilo. getClassName je v tomto směru o hodně lepší. Nebude mi vadit, když nebude k dispozici ani jedno.

Honza Marek
Člen | 1664
+
0
-

Existuje nějaký jazyk, kde třída Object má getodu getClassName?

pekelnik
Člen | 462
+
0
-

Jan Tvrdík napsal(a):

getClass se mi díky své obecnosti a nelogičnosti nikdy nelíbilo. getClassName je v tomto směru o hodně lepší. Nebude mi vadit, když nebude k dispozici ani jedno.

+1

Hlavní je, že je tato funkčnost plně dostupná jako $obj->reflection->name;

Editoval pekelnik (23. 1. 2010 19:48)

Proki
Člen | 66
+
0
-

Jsem pro jednoznačné zrušení… Nevím jak v ostatních jazycích ale například v .NET Frameworku se ke jménu třídy dostává také přes reflexi jako obj.getType().Name;

EDIT: tak pro zajímavost jsem se podíval na to, jak je to dělané v Javě. Tam se k názvu třídy dostaneme přes obj.getClass().getName();

jak je tedy zřejmé, tak v moderních objektových jazycích neposkytuje název třídy přímo instance objektu, ale získává se spolu s dalšími informacemi reflexí…

Editoval Proki (23. 1. 2010 20:03)

Honza Marek
Člen | 1664
+
0
-

pekelnik: Hlavně je ta funkčnost dostupná přes get_class($object). Holt si budu muset projít zdrojáky, kde mám všude $object->getClass() a přepsat to :-/

Honza Kuchař
Člen | 1662
+
0
-

Pokud nebudu myslet na ty co používají třídu Object bez zbytku Nette, tak mi zrušení této metody v zásadě taky nijak nevadí.

pekelnik
Člen | 462
+
0
-

Honza Marek napsal(a):

pekelnik: Hlavně je ta funkčnost dostupná přes get_class($object). Holt si budu muset projít zdrojáky, kde mám všude $object->getClass() a přepsat to :-/

Ber to tak že u verze 0.9.3 se s tím musí počítat ;)

A jsou to všechno změny k lepšímu a čistšímu kódu.

Aurielle
Člen | 1281
+
0
-

Zaskočilo mě deprecated LatteFilter::invoke(), ale jinak byl přechod bezproblémový.

jtousek
Člen | 951
+
0
-

Zdravím,

mohu se zeptat, proč došlo k odstranění třídy SimpleLoader? Používal jsem ji neboť RobotLoader mi příliš nevyhovuje. Navíc dodržuju strukturu jmenných prostor a tříd stejnou jako strukturu adresářů a souborů s třídami takže použití SimpleLoaderu bylo přirozené.

Filip Procházka
Moderator | 4668
+
0
-

jtousek: vždy můžeš použít třídu ze starší revize a hodit si ji do svých knihoven :)

Editoval HosipLan (24. 1. 2010 23:35)

jtousek
Člen | 951
+
0
-

HosipLan: To jsem samozřejmě udělal, ale proč ta třída byla odstraněna z frameworku samotného?

Honza Marek
Člen | 1664
+
0
-

jtousek:
SimpleLoader byla třída, ve které byl ručně napsaný seznam všech tříd frameworku a nešlo s ním načítat nic jiného. Takže jsi používal SimpleLoader + ruční require na vlastní třídy? Presentery se myslim načítají jinak, na to by to nemělo vliv. Pokud se ti vlastní třídy načítaly samy, zřejmě jsi používal RobotLoader aniž bys o tom věděl.

HopsiLan:
Zrovna tahle třída asi použít ze starší verze frameworku nepůjde. Stačí přidání nebo přesun třídy a framework se rozbije.

kravčo
Člen | 721
+
0
-

Honza Marek napsal(a):

jtousek:
SimpleLoader byla třída, ve které byl ručně napsaný seznam všech tříd frameworku a nešlo s ním načítat nic jiného. Takže jsi používal SimpleLoader + ruční require na vlastní třídy? Presentery se myslim načítají jinak, na to by to nemělo vliv. Pokud se ti vlastní třídy načítaly samy, zřejmě jsi používal RobotLoader aniž bys o tom věděl.

HopsiLan:
Zrovna tahle třída asi použít ze starší verze frameworku nepůjde. Stačí přidání nebo přesun třídy a framework se rozbije.

To, o čom píšeš je NetteLoader. SimpleLoader slúži(l) na načítanie tried podľa mennej konvencie trieda → súbor, podobne ako tomu je v Zend Frameworku. Čiže triedu \My\SuperDuper\MegaClass by hľadal v súbore My/SuperDuper/MegaClass.php.

Honza Marek
Člen | 1664
+
0
-

Tak to se omlouvám.

jtousek
Člen | 951
+
0
-

:D Koukám, že se tu pěkně hádáte, ale vlastně mi nikdo neodpověděl.
Upřímně řečeno argumenty, že RobotLoader stačí moc neberu – pro vývoj není úplně optimální (proto jsem od něj upustil).

Jod
Člen | 701
+
0
-

Dokelu a ja som čakal čo bude Nette\Forms\RepeaterControl za zverinu :)

David Grudl
Nette Core | 8129
+
0
-

jtousek napsal(a):

:D Koukám, že se tu pěkně hádáte, ale vlastně mi nikdo neodpověděl.

Pravděpodobně jsi byl jediným uživatelem této třídy.

Honza Kuchař
Člen | 1662
+
0
-

Přidat SimpleLoader do extras?

Vyki
Člen | 388
+
0
-

Mě by také zajímala jedna odpověď :o) „FileStorage pro ukládání tagů a priority používá SQLite databázi“ – bude podpora i pro sqlite3, který je PHP 5.3 již nativně???

LM
Člen | 206
+
0
-

Vyki napsal(a):

Mě by také zajímala jedna odpověď :o) „FileStorage pro ukládání tagů a priority používá SQLite databázi“ – bude podpora i pro sqlite3, který je PHP 5.3 již nativně???

K čemu by to bylo dobré? na většině hostinzích bude spíš sqlite2.

David Grudl
Nette Core | 8129
+
0
-

Časem třeba bude, teď to nemá smysl řešit, když hostingy téměř nenabízejí PHP 5.3 a nativně je SQLite 2.

Vyki
Člen | 388
+
0
-

Ok. Ptal jsem se jenom kvůli tomu, že jsem do na local, kde mám PHP 5.3.1 neinstaloval sqlite2, ale na hostingu naštěstí je. Jinak mám hosting u onebit a šlape to jako hodinky. Myslím, že udělali maximum pro co nejhladší přechod z PHP 5.2. Mrkněte na PHP info http://docs.rovy.cz/info.html

Patrik Votoček
Člen | 2221
+
0
-

David Grudl napsal(a):

  • InstantClientScript: formuláře generují zgruntu nový validační JavaScriptový kód. Ten by měl být lépe přizpůsobitelný (např. pro live validation) a je nezávislý na HTML ID. V této oblasti bude vývoj pokračovat, nicméně nové chování by mělo být stabilní.

Můžu mít dotaz v čem je to lépe přizpůsobitelné, když mě stačí editovat pár řádků v InstantClientScript.phtml (abych docílil chování že místo alertu se budou chyby zobrazovat za/pod prvky kterých se chyba týká). Ale volání InstantClientScript.phtml je napevno zadrátováno v metodě classy InstantClientScript, která final?

David Grudl
Nette Core | 8129
+
0
-

Jde o tom, že si buď můžeš vytvořit vlastní validační metodu, která bude volat funkce z pole nette.forms. Celý validační skript tedy není jeden black-box, ale rozebiratelná struktura.

Teoreticky můžeše i přepsat JavaScriptové metody jako třeba nette.validateForm vložením kódu za ten vygenerovaný. Žádné best practices v tomto směru ale zatím neexistují, jak píšu, v této oblasti bude vývoj pokračovat.

Patrik Votoček
Člen | 2221
+
0
-

OK ještě na to kouknu…

EDIT: Pokud jsem to pochopil dobře tak vyšla stable verze 0.9.3 (final) Ale balíky https://files.nette.org/…-PHP-5.2.zip
https://files.nette.org/…prefixed.zip
https://files.nette.org/…-PHP-5.3.zip

obsahují 0.9.4-dev verzi

Editoval vrtak-cz (28. 1. 2010 5:59)

David Grudl
Nette Core | 8129
+
0
-

Ona první 0.9.4-dev === 0.9.3 stable, ale pravda, mohlo by to mást, udělám repack.

Patrik Votoček
Člen | 2221
+
0
-

To vím… spíš 0.9.4-dev == 0.9.3 :-p (přece jen liší se Nette\Framework::VERSION a Nette\Framework::REVISION)

EDIT:
Neměl by tu být ještě dnešní datum? https://nette.org/cs/packages

Nette Framework 0.9.3 stable ze dne 23. 1. 2010

A tu taky? https://nette.org/en/packages

Nette Framework 0.9.3 stable (date January 23, 2010)

Editoval vrtak-cz (28. 1. 2010 8:00)

jasir
Člen | 746
+
0
-

Ahoj, +1 pro zachování getClass(). Pragmaticky – nabaví mě psát $object->reflection->name, z čehož není na první pohled jasné že chci třídu.
$object->class je mnohem lepší. V nejhorším $object->className – ale: opravdu je to nutné? Myslím, že trocha praktičnosti neuškodí.

amsys
Člen | 20
+
0
-

reflection->name dává smysl a getClass je matoucí viz předchozí komentáře, tato změna je dobrá jenže se spíše měla objevit v nějaké vývojové větvi, co se týče změn na stávajících aplikacích tak zase prohnat celou aplikaci nějak takhle problém určitě nebude: s/->class([^a-zA-Z0–9])|->getClass()/->reflection->class\1/g

Honza Marek
Člen | 1664
+
0
-

Taky jsem měl rád $object->getClass(), ale tak holt jsem se už naučil používat get_class($object). $object->reflection->name bych teda nikdy dobrovolně nevypisoval.

Jan Tvrdík
Nette guru | 2595
+
0
-

Nelze si tam getClass přidat přes extension method?

jasir
Člen | 746
+
0
-

amsys napsal: reflection->name dává smysl a getClass je matoucí viz předchozí komentáře, tato změna je dobrá jenže se spíše měla objevit v nějaké vývojové větvi, co se týče změn na stávajících aplikacích tak zase prohnat celou aplikaci nějak takhle problém určitě nebude: s/->class([^a-zA-Z0–9])|->getClass()/->reflection->class\1/g

Je vidět, že nový přístup je matoucí (a David to má špatně i ve svém prvním příspěvku). Ve svém regulárním výrazu jsi použil reflection->class, což nefunguje, musí to být reflection->name.

Honza Marek napsal:
Taky jsem měl rád $object->getClass(), ale tak holt jsem se už naučil > používat get_class($object). $object->reflection->name bych teda nikdy > dobrovolně nevypisoval.

Jasně, ale úplně mě bolí do tak krásného kódu (díky nette) psát get_class($obj). Ale tak holt taky cesta… Vypisovat to taky nebudu.
Navíc se nově vždy musí vytvářet reflection, není to tak?

Jan Tvrdík napsal: Nelze si tam getClass přidat přes extension method?

Zatím ne, metoda je tam jako deprecated. Až zmizí při dalším odstraňování deprecated, tak to půjde. Ale to radši půjdu cestou úpravy nette a doplním si tam tu metodu rovnou.

David Grudl
Nette Core | 8129
+
0
-

jasir napsal(a):

Je vidět, že nový přístup je matoucí (a David to má špatně i ve svém prvním příspěvku).

Opraveno.

amsys napsal(a):

tato změna je dobrá jenže se spíše měla objevit v nějaké vývojové větvi

Také proto jsem ji ještě do 0.9 promítnul, alespoň varováním.

Změny v core třídách nejsou nic příjemného a musíte uznat, že v Nette patří k naprostým výjimkám. Metoda getClass() byla blbě pojmenovaná a časem by se její existence vymstila (a snad ani nediskutujme nad jejím zachováním). Buď ji lze přejmenovat na getClassName nebo volit reflection->name.

A teď nastupuje pragmatismus: skutečně používám konstrukci tak často, že vyžaduje vlastní metodu? A pokud ji používám často, nemůže to být chyba návrhu?

Honza Kuchař
Člen | 1662
+
0
-

Používám ji výjimečně. Ve svých aplikacích tak 2×. Takže mě David přesvědčil. Klidně reflection->name. To je opravdu nejlogičtější. Metoda přímo na tohle je opravdu zbytečná.

Honza Marek
Člen | 1664
+
0
-

Taky jsem to použil výjimečně. Nicméně nechápu proč bych měl používat reflection->name, když existuje nativní php funkce get_class. Jsou tam nějaké rozdíly?

Jinak bych chtěl říct, že mi nevadí ani tak ta změna jako spíš fakt, že se to projevilo rovnou ve stable verzi bez varování. Kdyby to bylo nejdříve promítnuto do dev verze, takový humbuk kolem toho nevznikne.

jasir
Člen | 746
+
0
-

Já mám takovou komponentu, která mi ukazuje strukturu presenterů, továrničky, metody apod. na aktuální stránce. Tam jsem to využíval hojně, ale pravda je, že je to bastl ;-) Teď už jsem to tedy přepsal na get_class().

Tak jo, máte pravdu, pryč s tím. Pro existenci getClassName() palec mírně nahoru.