Rozšíření pro Adminer
Školení, která pořádám
Adminer dovoluje vytvářet přizpůsobení, pomocí kterých lze chování poměrně zásadním způsobem upravit. Největším přizpůsobením je Adminer Editor, který slouží k manipulaci s daty (a nikoliv už se strukturou tabulek) a je určen pro koncové uživatele. Ten slouží jako dobrý základ pro administrační rozhraní, které lze pomocí dalšího přizpůsobení dále upravovat.
Sám tato přizpůsobení běžně vytvářím, ale pravda je taková, že nevím o nikom dalším, kdo by to dokázal. Příklad sice existuje a dokumentace je kompletní, ale možná je kvůli své hutnosti těžko pochopitelná. Dokonce ani účastníkům školení se mi tvorbu přizpůsobení na první pokus příliš dobře vysvětlit nepodařilo. Možnost tvorby přizpůsobení se tak nejlépe hodí v případě, kdy chce někdo do Admineru přidat nějakou obskurní funkčnost, kterou tam dávat nechci – v tom případě ho odkážu na dokumentaci a případně mu i trochu pomůžu.
Tvorba přizpůsobení má také jednu zásadní nevýhodu: kód není znovupoužitelný – co udělám v jednom projektu, to do druhého projektu mohu přenést jedině zkopírováním kódu. Rozhodl jsem se proto způsob upravování Admineru zjednodušit – kromě stávajících přizpůsobení (která lze i nadále vytvářet) je možné použít také rozšíření (plugin). Hlavním rozdílem je mnohem jednodušší použití – zkopírujete si soubor s rozšířením, v řídícím skriptu určíte, že ho chcete používat, a je hotovo.
Slibuji si od toho také to, že se ostatní programátoři naučí rozšíření snadněji vytvářet. Přeci jen – když chci udělat třeba rozšíření pro PDF export a mám k dispozici rozšíření pro XML export, tak je to podstatně jednodušší, než když musím zjišťovat, které všechny metody se pro to používají, jaké přijímají parametry a co mají vracet.
Výborné mi na tom přijde, že rozšíření lze používat i se staršími verzemi Admineru (většinu z nich už od verze 2). Jsou totiž implementované pomocí přizpůsobení, které je před použitím kteréhokoliv rozšíření potřeba načíst. Možná nativní podporu pro rozšíření časem doplním i přímo do Admineru, ale spíš to nechám tak, jak to je – ona to totiž není žádná věda:
<?php
include "./plugins/plugin.php"; // přizpůsobení obsluhující rozšíření
// načtení všech požadovaných rozšíření:
include "./plugins/dump-xml.php";
include "./plugins/file-upload.php";
// nebo prostě:
foreach (glob("plugins/*.php") as $filename) {
include "./$filename";
}
?>
Viz kompletní příklad.
Existující rozšíření
Zveřejnil jsem všechna univerzální rozšíření, která jsem dosud vytvořil. Z kompletního seznamu vyberu: export do XML, upload souborů, tvorba SEO URL, HTML editor, překlad administrace. Ještě mám v plánu zveřejnit možnost odesílání HTML e-mailů a JavaScriptový kalendář pro editaci datumových políček, to ale ještě nemám hotové.
Co se toho kalendáře týče – všude se píše: „Nevynalézejte kolo, použijte existující knihovny.“ Ale já většinou, když hledám nějakou vhodnou knihovnu, tak mě to hrozně frustruje – strávím tím spoustu času a nakonec nenajdu nic, co by mi přesně vyhovovalo. A pak lituji, že jsem si ve vymezeném čase radši něco nenapsal sám. Na DatePicker mám možná poněkud neobvyklé požadavky:
- Možnost zadat datum nebo datum s časem včetně sekund, pokud možno od roku 1000 do roku 9999.
- Aktivace pokud možno vstupem do políčka, nikoliv ikonou.
- Funkčnost pokud možno bez nutnosti připojit styl (ale přinejhorším by se to obešlo i s ním), ideálně i bez obrázků.
- Pokud možno bez textů nebo naopak včetně jejich překladu do všech jazyků, které podporuje Adminer.
- Funkční pokud možno bez frameworku, přinejhorším s jQuery.
- Svobodná licence a zdrojáky v Gitu.
Pokud byste o takové knihovně věděli, tak budu rád za odkaz. Ještě více mě zajímají vaše tipy na další užitečná rozšíření.
Přijďte si o tomto tématu popovídat na školení Jak vytvářím webové aplikace.
Diskuse
https://github.com/chrishulbert/datepicker vypadá celkem zajímavě, ale bohužel by se musel trochu předělat. Čas se asi nenechá zadávat do stejného políčka. Aktivovat by se to nechalo i vstupem do políčka. Bez stylů se zobrazuje celkem pěkně. Žádný framework, v gitu, ale nevím jak je to s licencí.
Jinak k Admineru: používám datový typ bit(1) jako obdobu boleanu a když zadám do textového pole 0, tak se uloží 1. Prázdné políčko je převedeno na 0.
Typ bit: díky za upozornění, opravil jsem to v Gitu. Ono se totiž MySQL chová trochu zvláštně – když se do tohoto typu uloží '1', tak se neuloží číslo 1 jako u všech ostatních číselných typů, ale ASCII hodnota znaku 1 (tedy 49). Před verzí 5 se tak navíc nechovalo. Alespoň jsem to mohl vyřadit z oficiálního TODO…
A také nefungují výchozí hodnoty pro bit na stránce úpravy tabulky.
Lukáš:
Adminer Editor zřejmě s typem bit bojuje taky. Při vyhledávání ano/ne hází syntax error. Že by přílišné escapování?
Visitor:
Někdo se na to zeptat musí...
Proč ne DatePicker nebo DateTimePicker z jQuery UI?
Většině podmínek snad vyhovuje a hlavně je za tím dost velká komunita spokojených uživatelů.
Jakub Vrána :
Přemýšlel jsem o něm jako o prvním, ale: Nedovoluje zadat čas, závisí na stylu a potřebuje jQuery.
Visitor:
- DateTimePicker - podporuje čas
- CSS je možné dotahovat z CDN
- jQuery dneska už neberu jako zlo, ale jako přidanou hodnotu
Ale jsou to tvoje pravidla...
Vladimír K. Kocourek:
CSS (a jQuery) je možné dotahovat z CDN, ale co potom uživatelé, kteří používají Adminer tam, kde není připojení k internetu? Myslím, že hlavně na ty Jakub myslí, když vyžaduje "script bez závislostí".
Jakub Vrána :
Za DateTimePickerem na rozdíl od jQuery UI už nestojí žádná silná komunita. Navíc zdá se nepodporuje sekundy.
Jakub Vrána :
Díky, nakonec jsem použil ten Timepicker. Sice to nesplňuje všechny mé nároky a integrace je mnohem složitější, než bych si představoval, ale je to bohužel asi to nejlepší, co se dá najít.
Aichi:
Chtěl jsem ti nabídnout http://jak.seznam.cz/example/widgets/#calendar ale bohužel nesplňuje některé věci. S předěláním aby se dalo zadat sekundy a nebo aby se otevřel při kliknuti do inputu bych klidně pomohl, to není v tomto případě nic složitého.
Smasty:
V prípade DatePickeru by som bol za použitie možností HTML 5 - <input type=date> alebo <input type=datetime> aspoň ako fallback pri vypnutom JS.
clrsrc():
Jakube,
pokud kalendářík ještě nemáš, pak ti rád nabídnu něco, z čeho bys možná mohl vycházet -
http://clrsrc.ic.cz/temp/calendar2.html
...pro přizpůsobení. Vytvoří kalendářovou tabulku v jedné vrstvičce (přes DOM), kterou zobrazí pod vstupním políčkem. Indikaci toho, že políčko je datum (popř. toho, jestli má obsahovat i čas) je zvoleno přes stylové třídy. Chybí skrývání tabulky při blur() a asociace tohoto chování vstupním políčkům. Zatím je to kupodivu jen asi 60 řádků kódu, takže není žádná sci-fi mít těch pár řádek navíc jako součást Admineru.
Tomáš Kapler:
ahoj, nevím jestli jsi to ještě nevyřešil, ale co takhle prostě a jednoduše používat HTML5 datetime input
<input type="datetime">
případně tam kde víš že se pracuje s date tak <input type="date">
a tam kde s časem tak
<input type="time">
asi by to vyžadovalo nějaký drobný js, který by to po vložení předělal do očekávaného formátu ale zas by to bylo takové pěkné standardní.
Případně s fallback na to jquery, viz třeba tady http://diveintohtml5.org/forms.html
Lukáš Fiala:
Je už k dispozici rozšíření pro možnost odesílání HTML e-mailů?
Díky za info
Diskuse je zrušena z důvodu spamu.