YUI 3.4.0 Preview Release 3 je nyní k dispozici na CDN
28. července 2011 v 12:39 hod. George Puckett | V rozvoji záložky | 4 KomentářeTým YUI právě dokončil poslední vývoj sprint na 3.4.0 verzi. V tuto chvíli považujeme za funkčně kompletní kód. Plánujeme strávit další sprint se zaměřením na našem posledním kole testování a vytváření většího počtu příkladů a dokumentace. Jsme zaslali k FC (funkční kompletní) stavět na CDN pro komunitní průzkum a zpětnou vazbu. Můžete se na uvolnění http://yui.yahooapis.com/3.4.0pr3/build/yui/yui-min.js~~pobj .
Tam jsou některé konkrétní oblasti knihovny, kde bychom rádi, aby komunitní zpětnou vazbu:
- Nakladač má významný update pro 3.4.0. Pokud provádíte ruční zatížení specifikace přes
use("*")nebo využít submodulu konfigurací, tak jsme vděčni snažíte kód s novým Loader být jisti, že jsou správně manipulaci se všemi případy použití. Pro podrobnější informace o Loader změn v této verzi naleznete na blogu popisuje 3.4.0 Loader změny . - Kalendář a panely jsou plně funkční a připraven k použití pro vývojáře.
- Grafika:. Byly několik API změny, které ovlivní všechny experimentální kód napsaný na grafice distribuován v Pr2 vydání
getShape()byla přejmenována naaddShape(). Tam také byli několik atributů náhrady. - Přechod: Nativní přechody jsou nyní podporovány ve Firefoxu.
- WidgetButtons byla uvolněna jako nový Widget rozšíření, které umožňuje umístit CSS designem tlačítek v záhlaví a zápatí každé widget, který implementuje standardní modul podporu.
- Widget druhů dopravy a Widget-Autohide pluginy byly přeměněny na rozšíření.
- Widget: Přidána podpora pro zničení (true), který odstraní a zničí všechny podřízené uzly (nejen BoundingBox a contentBox) obsažených v Widget BoundingBox. destroy () udrží své současné chování vzhledem k potenciálně velkým run-time cenu zničení všechny podřízené uzly. Pokud zničíte udělátek ve vaší aplikaci, nebo jsou vlastní widget, developer, vaše pomoc při testování tuto změnu ocení.
- ScrollView nyní podporuje vertikální stránkování, obsahuje seznam scrollview-plugin přidat CSS názvů tříd, na bezprostřední seznam prvků a také několik oprav chyb a refaktorování
- Aplikace Framework: Chceme rozšířit upřímné poděkování patří také všem z vývojářů v komunitě, kteří se čas na testovací jízdu nového App rámec. Dostali jsme výbornou zpětnou vazbu po Pr2 vydání. Prosím nadále zkoumat tyto komponenty a pošlete nám své připomínky a návrhy.
Můžete získat další informace o obsahu této verzi kontrolou historie kumulativní a úplný seznam vstupenek, jimiž se PR3 . Vyplňte prosím všechny požadavky na vylepšení, chyby a regrese v jízdenky databáze na YUILibrary.com .
Sdílet a rozšiřovat: Záložka se Del.icio.us | Digg to! | reddit!
YUI: Otevírací doba čtvrtek 28. července
25. července 2011 v 10:56 hod. Luke Smith | V rozvoji a Otevírací doba záložky | 2 Komentáře Y.Calendar přichází na 3.4.0

Kalendář je jednou z našich nejoblíbenějších udělátek v Yui 2 rodiny, a to při svém debutu na YUI 3 architektury 3.4.0. Allen Rabinovič je součást, vlastník a autor a bude na výzvu znovu zavádí nás do tohoto starého favorita, ukazuje některé nové přístupy k problémům, kterým čelí 2.x kalendáři. Jsem především jazzed o podpoře internacionalizace, ale nové renderovací pravidla jsou také docela fascinující.
Pojďte dál, a aby vaše data na sběr, události kalendář, import-z-iCal-a-make-palačinky dotazy a tyto požadavky s vámi jako se zhmotní nyní a budoucí Y.Calendar . (Ne, to nebude dovážet iCal, ale pokud někdo chce vytvořit galerii modul zkrotit, že zvíře, je tu určitě YUIConf lístek v ní pro vás ;))
Jsme zpět k naší obvyklou dobu tento týden, tak uvidíme v Připojení v 10 hodin PDT.
Čas a detaily
Budeme on-line od 10 do 11 hodin PDT čtvrtek. Připojovací údaje jsou stejné jako obvykle.
- Dial do 1-888-371-8922 (Skype funguje skvěle pro neamerické účastníků *)
- Zadejte kód účastníka 47188953 #
- Přidejte se k relaci sdílení obrazovky (to vás vyzve k instalaci zásuvného modulu Adobe Connect, pokud je to vaše první používat to)
Poznámka: Vzhledem k tomu, že je to otevřená konference vedení, žádáme, aby volající vypnout jejich linky, pokud se účastní aktivní diskuse.
* - Pokud Skype není možnost, napište mi, nebo mě chytit odst. ls_n) v Č. Yui IRC kanál na freenode pro místní číslo.
Záznam
Díky všem za volání v! Online záznam zasedání je nyní k dispozici.
Vysoká kvalita, iPhone / iPad kompatibilní, záznam ke stažení je zde .
Sdílet a rozšiřovat: Záložka se Del.icio.us | Digg to! | reddit!
YUI: Otevírací doba čt. 21. července
19.července 2011 v 2:16 pm Luke Smith | V rozvoji a Otevírací doba záložky | 12 KomentářeDataTable aktualizace a galerie přehlídkou
3.4.0 vývojový cyklus se chýlí ke konci a bude plný nejrůznějších skvělých funkcí, ale mluví jasně, DataTable, nepřichází tolik důraz na rozvoj, jak by mělo mít. Tam byly některé opravy chyb, i když, a slušné množství plánování změn, které jsou zaměřeny na 3.5.0 a skvělý start do komunity zapojení s jejich vývojem.
Víme, že DataTable je nesmírně důležité widget pro spoustu zákazníků, tak jsme pochopili náklady na oddálení zaměřený rozvoj. To Otevírací doba bude aktualizace na tom, co práce je dostat udělat pro 3.4.0, co se plánuje na 3.5.0, a úvod do velkého díla, který je začal se objevit v Galerii přidat funkce a opravit chyby na DataTable (a její rodina podporovat třídy).
Budeme on-line hodinu dříve tento týden ve prospěch Eamon Brosnana (aka, mosen od # YUI), který je podle řady z galerie oprav budeme hledat znovu. V opačném případě budeme mít # jinou Yui obyvatele a galerie přispěvatele ukazují své zboží. Máte-li řešení, DataTable nebo nedokončenou, kterou chcete sdílet, dejte mi prosím vědět, abych mohl zablokovat plán, aby se vešly všechno (ls_n v § YUI nebo twitter ).
Čas a detaily
Budeme on-line od 9 do 10 hodin PDT čtvrtek. Připojovací údaje jsou stejné jako obvykle.
- Dial do 1-888-371-8922 (Skype funguje skvěle pro neamerické účastníků *)
- Zadejte kód účastníka 47188953 #
- Přidejte se k relaci sdílení obrazovky (to vás vyzve k instalaci zásuvného modulu Adobe Connect, pokud je to vaše první používat to)
Poznámka: Vzhledem k tomu, že je to otevřená konference vedení, žádáme, aby volající vypnout jejich linky, pokud se účastní aktivní diskuse.
* - Pokud Skype není možnost, napište mi, nebo mě chytit odst. ls_n) v Č. Yui IRC kanál na freenode pro místní číslo.
Sdílet a rozšiřovat: Záložka se Del.icio.us | Digg to! | reddit!
Next-Gen YSlow Powered by Yui
18.července 2011 v 9:17 hod. od Marcela Duran | V rozvoji a výkonu záložky | 4 KomentářePřed několika týdny, Yahoo! oznámil YSlow pro mobilní telefony na Velocity 2011 , přinášet sílu analýzy výkonnosti YSlow do mobilního světa.
YSlow pro mobilní pracuje jako bookmarklet , takže je možné spustit na jiných prohlížečů než Firefox (jako doplněk) nebo chrom (jako rozšíření) .
Architektura YSlow byl částečně přepracován pro práci na platformě a YUI je základním faktorem, aby tzv. sandboxu, cross-browser abstrakce a jednoduché YQL přístup možný.
Sandboxu
Aby mohla být vložená na stránce, aniž by zasahoval analýzu výkonnosti a bez probírat s vlastní stránku, YSlow je bookmarklet, který vstřikuje JavaScript a CSS do libovolné stránky s využitím síly Yui sandboxu:
Bookmarklet URL:
javascript: (function (y, p, o) { p = y.body.appendChild (y.createElement ("iframe")); p.id = 'YSlow-bookmarklet "; p.style.cssText = "display: none"; o = p.contentWindow.document; o.open (). write (' <head> <Tělo onload = " YUI_config = { výhra: window.parent, doc: window.parent.document }; var d = doklad; d.getElementsByTagName (\ "vedoucí \") [0] . AppendChild ( d.createElement (\ 'skript \ ") ). Src = \ 'http://d.yimg.com/jc/yslow-bookmarklet.js \' " > '); o.close () } (Dokument))
Výše uvedený kód:
- vytvoří prázdný iframe;
- připojí jej na stránky orgánu;
- skrývá soubor * iframe;
- dostane jeho okna ovladače;
- zapíše do jeho obsahu do těla iframe;
- tento orgán je prázdný, ale má
onloadudálost -
onloadudálost definuje, jak aplikovat YSlow JS:- stanoví
YUI_config, takžewinadocpoukazuje na stránce v současné době analyzujíwindowadocument, respektive - dynamicky se vstřikuje YSlow URL vytvořením
scriptprvek do iframe nahead
- stanoví
* Iframe se zobrazí v době, kdy všechny YSlow prezentace aktiva jsou nahrány
To bude klást iframe do stránky se analyzují. Tento iframe bude působit jako sandboxed prostředí a YSlow bude bydlet v něm. Vzhledem k tomu, iframe je dynamicky vytvořen bez src atributu, bude mít přístup ke své mateřské společnosti (str. analyzován), protože není stejného původu politika porušení tam děje.
YUI_config Objekt je po ruce, protože to určuje win a doc s rodiči IFRAME strany (str. analyzované), a tak každá nová instance YUI bude vázán na mateřské dokumentu ve výchozím nastavení, kabeláže žádné volání Y.all a Y.one přes Y.config.win nebo Y.config.doc z Yui use zpětného volání.
YSlow prezentace je zpracována iframe window a document odkazy, což YSlow hlavní skript k tomu, aby se značky, stejně jako načítat externí CSS v této iframe, aniž by v rozporu s nadřazenou stránku v stylů. YSlow naskenuje nadřízenou stránku, aby si všechny součásti (obrázky, skripty, odkazy, obrázky na pozadí,, flash apod.) potřebné pro pozdější analýzu výkonnosti. To se provádí pomocí přístupu Y.config.win a Y.config.doc , protože oni se odkazují na mateřské straně.
Cross-browser abstrakce
Být bookmarklet, je YSlow pro mobilní zařízení mělo fungovat na všech prohlížeč *. YUI abstrahuje cross-browser problémy tím, že normalizace prohlížeče rozdíly, což v čistém a snadno číst a udržovatelné codebase.
YSlow nebyla plně portován na YUI 3 - pouze regulátor vrstva (z připravované App složku) pro tuto chvíli - ale přesto jsou všechny manipulace DOM a zpracování událostí provádí pomocí node a event modulů. V budoucích verzích plánujeme do přístavu více YSlow funkcí Yui 3.
* Ne všechny prohlížeče jsou podporovány
YQL
YSlow analyzuje stránek kontrolou HTTP hlaviček pro součásti nalezených na stránce. HTTP hlavičky odpovědi nejsou k dispozici na stránce, tudíž tyto komponenty je třeba požádat znovu, aby pro YSlow dostanete odpověď informace v hlavičce. To by mohlo být dosaženo, a vyžádat si seznam komponent URL pomocí XMLHttpRequest (AJAX), ale bohužel z důvodu téhož původu politiky omezení , to není možné, pokud všechny komponenty jsou ve stejné doméně jako stránka, která je velmi nepravděpodobné.
Společná řešení pro omezení stejného původu politiky, pomocí JSONP, kde pracuje jako externí server proxy požaduje seznam součástí URL a jejich načítání HTTP hlavičky odpovědi na účet YSlow. Vzhledem k popularitě a jeho YSlow posledních mobilních úsilí analòz, čekáme velmi silný provoz na YSlow pro mobilní bookmarklet. S cílem podpořit pravidelnou leteckou dopravu, YQL bylo škálovatelné řešení přijaté YSlow prostřednictvím otevřené datové tabulky s názvem data.headers , který načte hlavičky odpovědi a obsah na základě seznamu adres URL, zatímco se vydávat za user-agenta, aby očekávaný obsah je získat.
YQL Dotaz složka dělá všechnu práci pro správu YQL dotazy při řízení JSONP žádostí pod kapotou, takže řadiče YSlow kód mnohem jednodušší a snadno udržovat.
Budoucí vylepšení: Nová YSlow pro mobilní přívětivého rozhraní
V současné době YSlow pro mobilní uživatele zkušenost je stejná jako práce s počítačem. Jednání s dlouhým seznamem dat pro analýzu výkonnosti není nejlepší zážitek na malé chytré telefonů obrazovek. Vzhledem k tomu, YUI také abstrahuje křížové zařízení gesta , bude YSlow pro mobilní dostat zbrusu nový mobilní přívětivé rozhraní v budoucích verzích.
Výkon výkonný nástroj
YSlow nasazení mobilní byla provedena pečlivě s ohledem na její vliv na výkon na doby načítání stránky se analyzují. V Yui 3 moduly používané na YSlow byly přezkoumány, aby obsahovala pouze moduly potřebné pro načtení YSlow tak rychle, jak je to možné. Osivo YUI soubor a nakladače nebyly zahrnuty , protože všechny potřebné moduly a submodulů byly spojeny dohromady po výkonu Ryana Grove Zen hroty, které umožnily zavést všechno do jednoho malého jediné přání: YSlow-bookmarklet.js: 204 KB, 66 kb ( gzip), pokud:
- YUI: 75 KB, 27 kb (gzip)
- YSlow: 129 KB, 39 kb (gzip)
Více o YSlow
Mějte up-to-data s nejnovějšími YSlow oznámení podle:
- Návštěva přepracované YSlow stránku na getyslow.com
- Líbí YSlow na Facebooku: facebook.com / getyslow
- Po YSlow na Twitteru: twitter.com / getyslow
Sdílet a rozšiřovat: Záložka se Del.icio.us | Digg to! | reddit!
Klasifikovaný Podpora prohlížeče Aktualizovat
12. července 2011 v 8:55 hod. od Jenny Donnelly a Matt Sweeney | V rozvoji a Klasifikovaný Podpora prohlížeče záložky | 22 KomentářeGBS změny
Konkrétní změny pro tuto aktualizaci zahrnovat:
- Už přiřadit zkušenosti stupně
- Zastaveno předepisování konkrétních operačních systémů (kromě mobilního telefonu)
- Přidáno pokrytí pro Internet Explorer 9
- Přidáno pokrytí pro Firefox 4. †
- Přidáno pokrytí pro Firefox 5. †
Browser test Základní
| Internet Explorer | 6.0 | 7.0 | 8.0 | 9.0 |
|---|---|---|---|---|
| Firefox | 3. † | 4. † | 5. † | |
| Chrome † | Poslední stabilní | |||
| Safari | 5. † | iOS 3. † | iOS 4. † | |
| WebKit | Android 2. † | |||
Poznámky:
- Symbol dýka (jak v "Firefox 4. †") vyplývá, že nejvíce proudu non-beta verze na této úrovni odvětví získává podporu.
- Žádné pokyny jsou uvedeny na iOS nebo Android OS zařízení je s nimi nakládáno. Doporučujeme vybrat si zařízení, které jsou nejreprezentativnější uživatelské základny pro každý OS.
Odstranění známky až od základní čáry prohlížeče test
Toto vydání GBS aktualizace představuje odklon od našich předchozích aktualizací v tom, že se pohybujeme od mapování prohlížeče přímo do praxe stupňů (např. "kvalitní" a "C-grade"). Spíše než předepsat, co uživatelské prostředí, které je vhodné pro prohlížeče, budeme soustředit na definování efektivní základní testovací strategii, která maximalizuje testovací pokrytí a minimalizuje zkušební povrch. Například, IE6 je stále významné globální podíl na trhu zaručuje, pokračovalo testování, nicméně dnešní GBS umožňuje IE6 uživatelské zkušenosti se lišit od IE9 zkušenosti.
Odstranění operační systémy od základní čáry prohlížeče test
Za účelem zjednodušení testování a minimalizace požadavků na prostředky, se už určit, jaký operační systém by měl být testován. Jedinou výjimkou je, když je prohlížeč pevně spojený s verzí OS, v tomto případě, odkazujeme na verzi operačního systému spíše než verze prohlížeče (např. "Safari iOS 4"). To nám umožňuje soustředit se na pokrytí zkušební verze prohlížečů, a minimalizovat redudant testování napříč platformami. Problémy se stejným prohlížeče napříč verzemi jsou zanedbatelné, a obecně v souvislosti s vyšší úrovni OS rozdíly, jako jsou klíčoví manipulaci a dostupných písem. Kód, který je známý dotknout platformě otázky by měla být testována na tolika platformách jak je to možné, ale toto testování obecně může být izolován na konkrétní problémy, spíše než běh plný regresní test všech funkcí. Doporučujeme zarovnání operační systém testování prioritu s uživatelskou základnou.
Proč je IE6 stále na seznamu?
IE6 má stále dost významný podíl na celosvětovém trhu opravňující ověřené přijatelné uživatelské prostředí. Jeden obyčejný misconception s Progressive Enhancement strategie je, že jakmile vstoupí do prohlížeče "C-třídy", že se stane "není podporován", zatímco ve skutečnosti to opravdu znamená, že by měla být poskytována v HTML jen zkušenosti. Teď, když už ne předepisovat, které obdrží prohlížeče Jaké zkušenosti, je to ponecháno na projekty, které se rozhodnou na základě svých uživatelů a zdrojů. GBS se zaměřuje na určení, které je třeba prohlížeče ověřenou použitelný zkušenosti založené na takových faktorech, jako je podíl na trhu a vlivu. Definuje, co je "použitelné" a budou blíže přijatelné úrovně rozkladu jsou ponechány pro týmy rozhodnout. Stále ještě podporovat jednoduchý Progressive Enhancement model, a odradit projektů z vytváření nových vrstev bez účtování dodatečných nákladů ve vývoji, testování a údržby zdrojů.
GBS počasí
Očekáváme, aby tyto změny v příští aktualizaci:
- Přerušení pokrytí pro Safari na iOS 3.
- Přidejte pokrytí pro WebKit na Android 3.
- Přidejte pokrytí pro Firefox 6.
- Přidejte pokrytí pro Safari iOS 5.
GBS Archiv
- GBS aktualizace, 11.3.2010
- GBS aktualizace, 2010-02-16
- GBS aktualizace, 2009-10-16
- GBS aktualizace, 07.2.2009
- GBS aktualizace, 2009-01-28
- GBS aktualizace, 07.3.2008
- GBS aktualizace, 2008-02-19
Sdílet a rozšiřovat: Záložka se Del.icio.us | Digg to! | reddit!
"MakeNode" Widget Rozšíření
8. července 2011 v 2:11 hod. od Satyam | V rozvoji záložky | 6 Komentáře V mém předchozím článku, recept na YUI 3 aplikace , ukázal jsem způsob, jak využít Y.substitute jako velmi základní šablony procesoru. Nápad se život odtud, kde se návrhy od lidí v Č. Yui IRC kanálu, a udělal jsem to Widget rozšíření, které je k dispozici na mých stránkách, tzv. MakeNode . MakeNode není obecná šablona procesor a to není myšleno jako jeden. Na druhou stranu, je úzce integrován s YUI Widget třídy nadace, včetně className a událost pomocníků a internacionalizace. V tomto článku se budu mít Spinner příklad a upravte jej řídit pokyny z mého předchozího článku a používat MakeNode. Upravené Spinner složka ( JS , CSS , skřítci ), stejně jako příklad jsou k dispozici na mých stránkách. Odkazy na další zdroje lze nalézt na konci tohoto článku.
Prodloužení komponentu
Jakmile MakeNode je načten, je třeba zahrnout modul ve vašem YUI().use() prohlášení použitím jména 'makenode' . Poté, rozšířit svůj widget, můžete jej uvést ve třetím argumentu Y.Base.create() , takto:
Y.Spinner = Y.Base.create ( "Spinner", Y.Widget, [Y.MakeNode] { / / Instance členů ... } { / / Statické členy } );
Můžete přidat MakeNode po libovolném počtu vhodných pro rozšíření Widget, jako WidgetParent a WidgetChild a WidgetStdMode atd. MakeNode přidá dvě chráněné metody, _makeNode a _locateNodes, a to bude číst z několika statických vlastností, je-li nalezen.
Všichni členové tohoto rozšíření jsou buď chráněné nebo soukromé, neboť jsou určeny k použití ve složce vývojáře a ne ze strany realizátora pomocí těchto součástí, které by neměly být neobtěžovali s nimi.
Definování šablony
První věc, kterou normálně udělat, je definovat šablonu pro vaše komponenty. Pro Spinner, naše šablona je:
_TEMPLATE: [ "<input Type="text" title="{s input}" class="{c input}">" "<button Type="button" title="{s up}" class="{c up}"> </ button>", "<button Type="button" title="{s down}" class="{c down}"> </ button>" ]. Join ('\ n'),
Výchozí šablona bude obvykle být jmenován _TEMPLATE a prohlásil, podél jiných statické vlastnosti třídy, jako jsou ATTRS . MakeNode bude používat tuto šablonu, pokud nikdo jiný je výslovně stanoveno. Šablona je vyrobena z prostého HTML plus řada zástupných symbolů uzavřeny v hranatých závorkách složených, každý z jednoho znaku (zpracování kódu) a následuje jeden nebo více argumentů. Zástupné symboly a to, co produkují, jsou:
{@ attributeName}nastavení hodnotu atributu{p propertyName}instance hodnota vlastnosti{m methodName arg1 arg2 ….}Návratová hodnota dané metody. Operační kód následuje název metody a libovolný počet argumentů oddělených mezerou. Řetězce musí být uzavřeny v uvozovkách. Čísla, booleovské anullbudou převedeny z řetězce na jejich vlastních datových typů{c classNameKey}CSS className generována z_CLASS_NAMESstatické vlastnosti{s key}řetězce zstringsatributu, pomocíkeyjako sub-atributu.{? other placeholder }Vytvoří řetězecchecked, když výsledkem zpracování zbytek zástupného symbolu, je pravda.{}Jakákoli jiná hodnota bude nakládáno stejně jakoY.substitutedělá.
Například {@ value} se projeví vytvořením this.get('value') , zatímco {p value} překládá k this['value'] .
{m} symbol je trochu složitější. První argument za m kódem zpracování je název metody a zbytek z argumentů, to vše jsou odděleny mezerou, které budou předány na danou metodou. Tyto argumenty mohou být čísla, null , true , false nebo řetězce uzavřené v uvozovkách. MakeNode bude analyzovat je a převést je do svých vlastních typů, tedy {m myMethod 123.45 true “this is a string”} bude mít za následek volání this.myMethod(123.45, true, “this is a string”) tak, že první dva argumenty jsou převedeny na jejich správné datové typy a řetězec může obsahovat mezery. Chcete-li zahrnout uvozovky, použijte \\" , dvojité lomítko bylo nezbytné, protože JavaScript, bude interpretovat ani jednu a zahodí ji dřív, než se dostane do MakeNode. pouze dvojité uvozovky jsou povoleny, MakeNode nepoužívá eval() , takže analyzátor je omezena ale bezpečné. Cokoli, jen čísla, null , Booleans a dvojité uvedené řetězce budou ignorovány.
{?} zástupný se hodí pro použití s zaškrtávacích políček a přepínače. Budou se zde vyrábět řetězec “checked” v závislosti na pravdivostní hodnotu kódu pro zpracování instrukcí, který následuje. Tak, <input type=”checkbox” {? m getLength}/> <input type=”checkbox” {? m getLength}/> bude produkovat výrazné políčko, pokud getLength metoda vrací něco jiného než nula. {?} bude akceptovat některou z dalších zástupných symbolů, i když to má smysl pouze s prvními třemi.
Pro {c} zástupný symbol, musíme mít _CLASS_NAMES vlastnost definovaná.
Další zástupné symboly mohou být přidány do MakeNode, přidejte je do _templateHandlers hash.
_CLASS_NAMES Nemovitosti
Spolu s ATTRS a _TEMPLATE statických atributů, můžeme definovat _CLASS_NAMES majetek, který ukazuje na pole řetězců. Každá z těchto řetězců bude použit pro generování className. Tak _CLASS_NAMES: ['input'] vyvolává className “yui3-spinner-input” týden Tyto názvů tříd, jsou uloženy v takovém případě vlastnictví this._classNames . {c input} symbol v šabloně výše bude nahrazen “yui3-spinner-input” .
Můžete použít _CLASS_NAMES vlastnost vytvářet libovolný počet názvů tříd, ať už je použít v šabloně, nebo ne. Stále můžete dosáhnout těchto názvů tříd, navíc v rámci this._classNames . ClassName je generován pomocí yui3 prefix následovaný hodnoty NAME statické vlastnosti otočil malé, a pak řetězec uveden v _CLASS_NAMES (poslední z nich nebude se obrátil malými písmeny), vše odděleno pomlčkami. _classNames hash bude obsahovat také názvů tříd pro boundingBox a contentBox , první v rámci "." klíče a druhý za “content” klíč. Widget přiřadí k boundingBox se názvů tříd, odvozené z hodnoty NAME majetku každou ze tříd v dědické řetězci, od yui3-widget . MakeNode ukládá do this._classNames pouze na nejvyšší className pro boundingBox .
Je-li součástí je několik úrovní daleko od Widget, jako SuperSpecialSpinner dědění z SuperSpinner , která dědí od Spinner , která dědí od Widget, a je-li některé nebo všechny z nich mají _CLASS_NAMES vlastnosti definováno, budou produkovat MakeNode názvů tříd, pro všechny z nich a uložte je na this._classNames . Není nutné vkládat na všech úrovních jména již vykázané v předchozích úrovních. Ve skutečnosti, to je lepší, že není, protože názvů tříd, vyráběné na všech úrovních budou používat hodnotu NAME majetku této úrovni. Tak, v SuperSpecialSpinner , {c input} povede ke “yui3-spinner-input” a ne “yui3-superspecialspinner-input” a tak to bude držet CSS soubor stále platný.
{S} zástupný symbol
Widget má strings konfiguraci definovaný atribut, ačkoli to není inicializován s nějakou hodnotou. Tento atribut je určen k držení řetězce, které jsou viditelné (nebo prostřednictvím čtení z obrazovky, číst) uživatele. Je důležité, že jste nikdy obsahovat viditelné řetězce přímo v šabloně. To není požadavek MakeNode - to nikdy nebylo dobré vůbec. Všechny řetězce, které mají být viděn nebo čtení pro uživatele by měla být vždy umístěna v strings atributu. strings atribut obsahuje hash, kde je každý textový nachází jeho klíče. Spinner složka má následující řetězce, které můžete vidět použité v šabloně výše.
Řetězce: { Hodnota: { vstup: "Stiskem šipky nahoru / dolů pro malé přírůstky, Stránka nahoru / dolů pro hlavní krocích." se: "Zvyšuje" stanoví: "Decrement" } }
Nejlepší na tom, jak to udělat je to, že vaše komponenta může být lokalizována do jiných jazyků se velmi snadno vývojáře, kteří používají vaši komponentu. Při vytváření instance Spinner, můžete udělat:
var mySpinner = new Spinner ({řetězce: Y.Intl.get ("přadlena")}); Nastavení konfiguračních atributů strings v tomto případě nenahrazuje výchozí strings hodnoty s těmi ze souboru jazyka zdrojů pomocí jazyka dříve definované. {s} zástupný přistupuje řetězce uložené v strings atributu, buď výchozí volby nebo přeložené ty, pokud je nastavena. {s xxxx} zástupný symbol je ve skutečnosti nic jiného než zástupce do {@ strings.xxxx} zástupný symbol. Nicméně, nejprve jen přístup k řetězce na nejvyšší úrovni, zatímco například {@ strings.xxxx.yyyy.zzzz} by Vám umožní přístup do řetězec hlouběji.
Použití _makeNode v renderUI
Používáme šablonu k vytvoření značky pro naši komponentu. K tomu můžeme říkat MakeNode je _makeNode metody, jako toto:
renderUI: function () { . this.get ("contentBox") append (this._makeNode ()); }
To vyplní contentBox našeho widgetu se značky od zpracování šablony. _makeNode metoda vrátí instanci Y.Node , který může být připojen nebo vložit kdekoliv nebo jen rozhodl pro pozdější použití. Je to nevrátí řetězec, to produkuje Node instance.
_makeNode metoda přebírá dva volitelné argumenty: odkaz na šablonu a objekt vyplnit zástupné symboly, jako Y.substitute dělá. V našem jednoduchém příkladu Spinner je jediná šablona pro celý ovládací prvek, ale další widgety mohou vyžadovat kousky vyrobené z několika šablon. V takovém případě byste obvykle volají _makeNode bez argumentů pro hlavní části a nazývají to opět s různými šablonami vyplnit dodatečné části. Příklad obsahuje tento renderUI metody:
renderUI: function () { var fieldset = this._makeNode (); this.each (function (item) { fieldset.appendChild (this._makeNode (MultipleTemplates.RADIO_TEMPLATE bod)); }, This); this.get ("contentBox") append (fieldset).; }
První výzva k _makeNode vrátí Node instance uložené v proměnné fieldset . Vzorek součást je také rozšířena o Y.ArrayList tak RADIO_TEMPLATE bude naplněn hodnotami odebraných z položek uložených v poli seznamu a následným uzlů připojených k fieldset před tím, než se konečně připojen k contentBox . Zvláštní zástupné symboly jako {@} nebo {p} bude stále odkazovat na atributy nebo vlastnosti, v hlavním objektu. Vnořené položky budou zpracovány stejně jako Y.substitute by.
Metoda _locateNodes
MakeNode dále poskytuje _locateNodes metodu, která se pokusí najít všechny prvky s názvů tříd, deklarovaných v _CLASS_NAMES . Chcete-li vyhledat konkrétní prvky, které lze projít libovolný počet className klíčů, jinak _locateNodes snaží všechny. Pro každý prvek nachází každého className, _locateNodes bude vyrábět vlastní instance vlastnost pomocí podtrhl prefix následovaný název klíče a “Node” přípony. Tedy v našem příkladu Spinner, _locateNodes vygeneruje vlastnosti _inputNode a _upNode a _downNode . Je-li několik prvků mají stejné className, _locateNodes vrátí odkaz na první z nich. Pokud prvek není nalezen, žádný variabilní být vytvořen.
V Spinner složky používáme _locateNodes po vytvoření značky:
renderUI: function () { . this.get (CBX) append (this._makeNode ()); this._locateNodes (); }
_EVENTS Statická vlastnost
Jeden další vlastnost může být definován v duchu _TEMPLATE a _CLASS_NAMES a to je _EVENTS . _EVENTS bude obsahovat hash složený z klíčů název třídy, z nichž každá obsahuje hash typy událostí a metod pro manipulaci s nimi. Je lépe vysvětlit na příkladu:
_EVENTS: { '.': { klíč: { fn: '_onDirectionKey " args: ((Y.UA.opera) "dolů"!? "stiskněte tlačítko:") + "38, 40, 33, 34" } mouseDown: "_onMouseDown" } '..': { MouseUp: "_onDocMouseUp" } Vstup: { Změna: "_onInputChange" } }
_EVENTS je objekt (hash) s libovolným počtem nemovitostí. Názvy vlastností, to znamená, že klíče od hash, identifikovat prvky, jejichž akce budeme poslouchat. Jsou stejné identifikátory používané v _CLASS_NAMES . Existují dva další speciální klávesy "." a ".." . Zatímco className klíče odkazují na prvky vnořené do contentBox , "." klíč odkazuje na boundingBox sám, zatímco ".." se odkazuje na dokument obsahující tento widget. Myslete na ně dělá chdir příkaz, jestliže jsou umístěny na boundingBox úrovni. _EVENTS nemovitost je zpracován po renderUI , bindUI a syncUI metody byly jen tak udělátko Očekává se, že již vložena v textu dokumentu, jinak ".." se nezdaří.
Každá z položek v _EVENTS je další objekt, který používá typ události jako jeho klíče a název metody instance s ní zacházet. _EVENTS , je statická proměnná, nemá přístup k this takže to nemůže vzít skutečné funkční odkazy, jen název metody posluchače událostí. Některé typy událostí potřebovat další argumenty, jako je například key události. V tomto případě, namísto poskytování název obslužné rutiny události můžete poskytnout Objekt s vlastnostmi, fn a args držet název funkce a další argumenty, v případě potřeby.
MakeNode bude používat Node.delegate naslouchat událostem vnořených prvků, i když bude používat Y.on poslouchat na události z boundingBox a textu dokumentu. (Poznámka: poslech na key události na každé vnořené prvek pracuje pouze s verzí 3.4.0pr1 a výše, protože delegace key .. případě nebyl k dispozici dříve, než všechny ostatní funkce pracují s předchozími verzemi také)
V _EVENTS prohlášení jsou kumulativní, kdy složky dědí od sebe. Každá třída v dědické řetězce bude mít svůj vlastní _EVENTS prohlášení zpracována odděleně.
_ATTRS_2_UI Statická vlastnost
Akce pohybovat oběma směry, od uživatelského rozhraní s komponentem a z části na rozhraní. První jsou zpracovány _EVENTS majetku. Pak tam jsou události, pro domácnost na změny atributů hodnoty, které musí být uvedeno v uživatelském rozhraní. Jak jsem se zmínil v předchozím článku, když tam jsou nějaké vedlejší účinky změna konfigurace atributu, měly by být řešeny posluchači události change, ne volitelné setter metody atribut, který by měl řešit normalizaci hodnotu na displeji. Uživatelské rozhraní by mělo odrážet stav konfiguračních atributů, nejprve v syncUI , když je inicializován a pak na každou akci atribut změny. V druhém případě je třeba připojit posluchače událostí, které děláme v bindUI . Widget již stanoví mechanismus, který by to tak jednoduché, který jsem popsal v komentářích k předchozímu článku.
Widget využívá instance vlastnictví _UI_ATTRS , která obsahuje objekt s další dvě vlastnosti, SYNC a BIND . Každý z nich je řada obsahovala jména konfiguračních atributů, které se zpočátku synchronizovaných a pak poslouchal s cílem udržet uživatelské rozhraní, které odráží aktuální hodnoty. Widget očekává, že každý z těchto položek má metodu s ním spojené, pojmenoval podle názvu atributu prefixed _uiSet se první písmeno názvu atributu převedeny na velká písmena mít název metody v řádném případě velblouda. Pokud tedy "value" byla vypsána v některém z _UI_ATTRS polí (buď SYNC nebo BIND ), by se očekávat, že Widget najít _uiSetValue metodu. Tato metoda dostane dva argumenty, value jsou nastaveny a src změny. To je kód pro náš Spinner _uiSetValue metody:
_uiSetValue: function (hodnota, src) { if (src === UI) { návrat; } this._inputNode.set (hodnota, this.get (Formatter) (hodnota)); }
Všechna velká identifikátory, které vidíte v tomto kusu kódu odpovídají konstanty řetězec prohlásil jinde, aby YUI kompresor dělat svou práci lépe. Tato metoda, v podstatě nastaví value atributu v HTML <input> pole na novou hodnotu sady, po formátování. Odkaz na textové pole byla poskytována _locateNodes . src argument je nejprve zkontrolovat, zda nastavena na hodnotu řetězce 'ui' . Pokud tomu tak je, bude žádná opatření. Tak lze zabránit nekonečné smyčky. Pokud uživatel zadá něco do vstupního pole, bude jeho hodnota jít do value atributu konfigurace, které by pak oheň na valueChange událost, která by si _uiSetValue s názvem, který v případě odškrtnutí by pak jít a změnit hodnotu vstupního pole, které by spustit celý proces znovu. Tak, v _uiSetValue , víme-li změna pochází z uživatelského rozhraní, my nic, a tak rozbít smyčku. To však vyžaduje jiný kus kódu jinde. V posluchače pro událost DOM, když jsme konfigurační atribut jsme použít třetí nepovinný argument pro nastavení, jako toto:
_afterValueChange: function (ev) { this.set (hodnota, ev.newVal, {src: UI}); }
Je na nás, abychom zajistili, že změny pocházející z uživatelského rozhraní jsou označeny tak, a pak zkontrolujte, zda stejnou vlajkou, aby se zabránilo smyčky.
S tím řekl, ještě jsem se zmínil o statickou vlastnost _ATTRS_2_UI uvedené v záhlaví tohoto oddílu. Vzhledem k tomu, komentáře v mém předchozím článku ukazuje (přes hrubé chyby jsem udělal v nich) a ujistěte se, že všechny atributy ovlivňující UI jsou správně uvedeny, je poněkud neuspořádaný. Nikdy byste neměli inicializovat _UI_ATTRS od nuly, protože Widget již obsahuje spoustu atributů a ty by se ztratil. Musíte spojit nové názvy atributů za stávajících, což je poněkud těžké si vzpomenout, jak na to právo. Aby to bylo jednoduché, bude číst z MakeNode statické vlastnosti _ATTRS_2_UI a dělat, že zřetězení pro vás. Bude spojit všechny tyto seznamy od každé třídy v dědické řetězce, takže na každé úrovni každá třída může zpracovávat své vlastní atributy. V Spinner, my máme:
_ATTRS_2_UI: { BIND: hodnota, SYNC: VALUE }
MakeNode bude přijímat i řadu jmen, nebo jeden název atributu, jako v tomto případě.
Otázkou přirozeně vzniká, proč dva seznamy, jeden pro vazbu jiný pro synchronizaci? Docela často SYNC pole má méně bodů než BIND seznamu a je to proto, šablona pro prvek by mohl již velmi stejnou výchozí hodnotu jako atribut konfigurace a není potřeba dělat počáteční synchronizaci. Takže, pokud výchozí hodnota pro value atributu konfigurace je prázdný řetězec a <input> prvek v šabloně nemá value atributu, pak není potřeba synchronizovat je na inicializaci.
MakeNode bude zjištění duplicitních záznamů v žádné z těchto polí. Pokud některý objeví, znamená to, že naše třída dědí z komponent již zpracovává tento atribut a nové prohlášení bude s největší pravděpodobností překročí v _uiSetXxxx handler pro něj. Mimochodem, MakeNode také kontroluje duplicitní záznamy v _CLASS_NAMES , které mohou způsobit konflikt v některých, i když ne všichni, okolnosti. MakeNode bude psát zprávu do protokolu o tyto chyby.
Závěr
MakeNode poskytuje velmi jednoduché šablony procesor, s jednoduchou funkcí, které jsou vysoce integrované s třídou nadace Widget. Poskytuje také pomocné metody pro vytváření názvů tříd, které mají být použity v šabloně a používání těchto názvů najít vytvořené uzly. To také poskytuje prostředky pro připojení do událostí generovaných jak uživatelského rozhraní a komponenty jako takové a každá spojit s metodou. To dělá všechny tyto věci, a zároveň dbát na respektování dědictví řetězce rovnou do Widget a na jakékoliv úrovni tříd Můžete definovat.
Neposkytuje pro absolutně všechny možnosti, ale jsou dobré řadu z nich. Nicméně to nebrání tomu, aby vám přináší nové funkce. Možná jen zřídka muset napsat bindUI nebo syncUI metodu, pokud použijete lepidlo poskytnuté MakeNode, ale můžete tak učinit, protože MakeNode nepoužívá je.
Jako bonus pro ty, kteří měli trpělivost dočetli až sem, jsem také modifikovanou Anthony Pipkin na tlačítko sady galerie komponent:
- button.js
- button.css
- Tlačítko-group.js
- Tlačítko-group.css
- background.png
- background-active.png
- icon-sprite.gif
- příklad
API dokumenty lze nalézt zde .
Sdílet a rozšiřovat: Záložka se Del.icio.us | Digg to! | reddit!
Yui a nakladače změny pro 3.4.0
01.7.2011 v 6:34 od DAV skla | V rozvoji a výkonu | 10 KomentářeV 3.4.0 jsme zahájili proces přesunu některých z logiky Loader kolem, nejen aby bylo výkonnější, ale aby byl silnější a snadnější k použití v jiných místech (jako na serveru). Budeme se válí se na další změny v budoucích revizích, ale chtěl jsem nějaký čas trvat, a vysvětlit, co se změnilo, proč došlo ke změně je a jak to může ovlivnit vývojáře. Pro většinu použití, pouzdra, budou vývojáři všimnete nic jiného, kromě toho, že věci jsou trochu rychleji a jejich požadavek stažení jsou trochu menší.
Osivo souboru
První věc, kterou se chci zaměřit, je semeno YUI soubor. V předchozích verzích Yui, naše osivo soubor byl velmi malý a neobsahuje Loader nebo některý z jeho meta-daty. Zjistili jsme, že v 90% užitné případě to není tak výkonný, jak jsme doufali. Běžný uživatel obsahuje semena soubor pak požádá své moduly, což znamená, že osivo je třeba nejprve načíst Loader, pak vypočítat všechny jeho závislosti, pak se stáhne všechny. Nyní cítí, že toto další http požadavek je špatná věc, a tak nový standard osivo soubor obsahuje Loader a jeho meta-data. Ano, bude to první žádost o trochu větší, ale to bude načítání modulů, které mnohem rychleji, protože všechny jeho meta-požadavky na údaje jsou již nyní na stránce.
Pokud chcete použít starou cestu, stačí patří Yui-base semen soubor místo. Obsahuje vše, co je potřebné, aby se YUI běžet v samostatném režimu a navíc obsahuje možnost načítání Loader na požádání. Pokud budete potřebovat ještě jemněji odstupňovaných závislostí, jsme vytvořili Yui-core počáteční soubor, který je přesně to, co staré Yui-base osivo bylo.
/ Build / Yui / Yui-min.js / / YUI semen + nakladač
/ Build / Yui-base / Yui-base-min.js / / Staré YUI semena Loader načíst podporu
/ Build / Yui-core / Yui-core-min.js / / Staré Yui-base bez Loader načíst podporu
Je třeba poznamenat, že tyto adresy URL jsou jiné než předchozí URL. Každý, kdo se pomocí yui/yui-base.js souborů potřebujete repoint je yui-core/yui-core.js . Pokud chcete starší způsob nakládání osiva a okouzlující Loader, měli byste použít yui-base/yui-base.js semen soubor.
Jiné odůvodnění této změny je náš plán na výrobu YUI běžet v co největším počtu míst, jak je to možné. Starý soubor osiva a nakladače v jedné žádosti se seznamem serverů je vše v pořádku a dobře, když máte combo serveru dostupné ve vaší aplikaci. Ale co na serveru? Nebo v offline aplikaci v mobilním zařízení? Tato místa je třeba minimalizovat přístup k souborům a zároveň získat informace, které potřebují.
Kumulativní
Další věc, že jsme změnili byl kumulativní odstranění ze systému a prodlení allowRollup na hodnotu false v Loader config. Co to znamená pro vás? No, snad vůbec nic. Než jsem se vysvětlit dopad změny, dovolte mi vysvětlit, odůvodnění za ním. Hlavním důvodem je opět výkon, společně s užitečným zatížením dodání. Vezměte si tento příklad:
Modul: vyžaduje událost, událost-a-b
Modul B: vyžaduje události-C, akce-d
Když požádáte tak, kumulativní logika před 3.4.0 používá k určení, že byste měli dostat události kumulativní. Což ve skutečnosti znamenalo, že jste se dostat:
event.a, event.b, event.c, event.d, event.e, event.f, event.g, event.h
Můžete skončil s více na své stránky, než si skutečně zapotřebí. Vypnutím kumulativní podporu, bude YUI nyní požádat pouze to, co vlastně požaduje a nic víc. Ve většině případů nepoznáte to. Modul vývojáři, může narazit na situaci, kdy věci, které fungovaly v minulosti, nemusí fungovat teď. Důvodem je to, že skutečně odpracované náhodou dříve. Dovolte mi použít reálného světa příklad: Dial.
V 3.3.0, Dial třeba toto:
vyžaduje: [
"Udělátko",
"Dd-drag",
"Náhražka",
"Událost mouseenter"
"Přechodu",
"Intl"
]
Z velké části Dial pracoval v 3.4.0, nicméně podpora klávesnice nefunguje. Poté, co některé jednoduché vyšetřování, se ukázalo, že kumulativní podpora byla skutečně žádající o celou akci kumulativní (který zahrnuje událostmi pohyb a event-key). Bez kumulativní logiky tahu ve všech případě Dial 3.4.0 už měl všechny své požadavky. Tvorba Dial se požadavky konkrétnější a definování všech svých skutečných závislostí správně dělá to fungovat podle očekávání.
vyžaduje: [
"Udělátko",
"Dd-drag",
"Náhražka",
"Událost mouseenter"
"Akce-move",
"Akce na klíč",
"Přechodu",
"Intl"
]
Pro vývojáře modulů, to je nejlepší praxe, aby se ujistil, že vaše modul vyžaduje přesně to, co je potřeba, aby fungovaly. Nepředpokládejte, že proti proudu modul požadavek je tam. Je to vždy lepší, aby se ujistil, že se zeptáte na to, co potřebujete.
To také znamená, že modul požadavky jsou více dobře definované. Například datatype-date má podporu Intl zabudovaný V předchozích verzích byste přistupovat k Intl takto:
Y.Intl.getAvailableLangs ("datatype-date ');
Ale protože tento modul není skutečně jazyk ( datatype-date-format modul dělá), bude se tak nestalo. Je třeba být konkrétnější a vlastně požádat jazyků pro správné modulu:
Y.Intl.getAvailableLangs ("datatype-date-format");
Build File exploze a submodulu odstranění
Po provedení této změny, další změně jsme se vybuchující adresáře build a odstranění submoduly z jádra systému. Submodul logika nebyla odstraněna, jen naše meta-datová struktura byla změněna. To bude poskytovat zpětnou kompatibilitu pro stávající zařízení.
Submoduly v jádru systému způsobil několik problémů, které jsme potřebovali vyřešit. Prvním důvodem byl výkon. Pokaždé, když Loader potřebné k výpočtu závislostí, je potřeba chodit submodulu / plugin strukturu jednotlivých modulů. Dělají to tisíckrát bolela náš výkon v průběhu výpočtu Loader rutina. Tím, že odstraní podporu submodulů v základním systémem jsme zachránili desítky tisíc funkcí volání a opakování.
Nakladač byl změněn tak, že pokud use majetku v modulu meta-dat definováno více modulů, bude používat tyto moduly namísto pokusu o načtení původní modul. Takže, pokud jste požadoval " dd "by Loader nahlížet" dd "'s meta-data a vidět použití vlastnost, která vypadá nějak takto:
"Dd-DDM-base, dd-DDM, DD-DDM-drop, dd-drag, dd-proxy, dd-omezit, dd-drop, dd-scroll, dd-drop-plugin"
V počáteční základní Yui souboru, jsme také včetně toho, co chceme, virtuální kumulativní nebo aliasy. Tyto moduly definice jsou přesně stejné jako meta-údajů v Loader. Tímto způsobem můžete zahrnout všechny soubory exportované z naši závislost konfigurátoru a používat tyto kumulativní bez Loader dárek na stránce. V budoucích verzích budeme rafinace tento přístup ještě více.
Po provedení této změny jsme se pak předchází explodovat naše budovat soubory. V předchozích verzích se submoduly stanovil moduly cestu k souboru. Například:
"Dd": {
"Submoduly": {
"Dd-drag":
/ / Modul dat
}
}
V 3.3.0, když si postavil "dd", struktura souborů vypadal asi takto:
/ Build / DD / DD-drag.js
/ Build / DD / DD-ddm.js
/ Build / DD / DD-drop.js
Se systémem sestavení explodoval v 3.4.0, "dd" je vybudování soubory nyní bude vypadat takto:
/ Build / dd-drag / dd-drag.js
/ Build / dd-DDM / dd-ddm.js
/ Build / dd-drop / dd-drop.js
To nám umožnilo odstranit "cesta" nemovitosti od všech našich modulu meta-daty stejně, šetří velikost souboru a snížení logiku potřebnou k sestavit moduly url cesty.
Pokud jsou včetně předkonfigurovaných combo URL, musíte přepočítat adresy URL při upgradu.
Nevýhodou této změny je, že pokud jsou včetně pole se seznamem URL modulů, které se "příprava" vaší stránky můžete nejen změnit číslo verze a upgrade. Budete muset znovu Závislost konfigurátoru a vytvářet novou adresu URL s novým modulem struktury.
Budoucnost
Budu se i nadále zdokonalovat, refaktorovat a maximalizovat každý aspekt našeho Loader a Seed strategie. Tyto první kroky byly nutné k pomoci v budoucích změn, které musí být přijato nejen naší straně klienta, ale také strategie našem serveru, příkazový řádek a mobilních zařízení strategií stejně.
Sdílet a rozšiřovat: Záložka se Del.icio.us | Digg to! | reddit!

Copyright © 2006-2012 Yahoo! Inc Všechna práva vyhrazena. Ochrana osobních údajů - Podmínky služby
Powered by WordPress na Yahoo! Web Hosting .
