[2010–01–23] Vyšla stabilní verze 0.9.3
- David Grudl
- Nette Core | 8227
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()
aString::padRight()
(obdoba str_pad pro UTF-8) - deprecated:
Uri::setPass()
agetPass()
nahrazujeUri::setPassword()
andgetPassword()
- deprecated:
HttpResponse::expire()
nahrazujeHttpResponse::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říkazmove()
ř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í metodgetHtml()
agetText()
, takže objekty Html lze bez problémů používat v labelech apod.- deprecated:
Form::processHttpRequest()
bylo přejmenováno naForm::fireEvents()
Debug
- globální funkce
dump()
jako (nejen) zkratka proNette\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()
aisLast()
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žmoCurlyBracketsFilter::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.
- anotace fungují všude, eAccelerator není překážkou
- syntaxe anotací byla rozšířena
- deprecated:
Nette\Annotations
– podpora se přesunula do třídNette\Reflection
Cache a session
- objekty ukládané do session nebo cache lze nyní verzovat pomocí anotace @serializationVersion
FileStorage
pro ukládání tagů a priority používá SQLite databázi
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
David Grudl napsal(a):
FileStorage
pro ukládání tagů a priority používá SQLite databázi
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)
- Panda
- Člen | 569
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.
- David Grudl
- Nette Core | 8227
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
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 :)
- Honza Kuchař
- Člen | 1662
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
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.
- pekelnik
- Člen | 462
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
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
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
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
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.
- Filip Procházka
- Moderator | 4668
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)
- Honza Marek
- Člen | 1664
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
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
.
- David Grudl
- Nette Core | 8227
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.
- David Grudl
- Nette Core | 8227
Č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
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
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 | 8227
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
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 | 8227
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
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)
- amsys
- Člen | 20
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
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.
- jasir
- Člen | 746
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 | 8227
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
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
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
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.