Interaktivní generátor formulářů a seznamů ze struktury MySQL databáze

Martin
Člen | 171
+
+1
-

Generovaný výsledek s vazbami 1:N i M:N (DefaultFormRenderer):

Vazba M:N

Ahoj.

V Nette programuju výjimečně a jen ve volném čase. Takže na jednu stranu mám velké mezery v tom, jak by se věci měly řešit a nestíhám sledovat novinky. Na druhou stranu vím, jak se programuje v jiných oborech, než je webové programování, a mnoho nástrojů ulehčujících a urychlujících práci mi v Nette i obecně v PHP chybí.

Při občasné práci v Nette jsem zjistil, že například při tvorbě formulářů mnoho věcí stále opakuji v několika víceméně podobných variantách. Trochu pomáhají pluginy do NetBeans nebo jiných prostředí, nejčastěji používám generátor z výpisu Admineru od Michala Mikoláše a zatím jsem se moc neprokousal zajímavým projektem Nette CRUD generátoru. Ale pořád používám nejčastěji Copy/Paste a opakované úpravy. Kromě toho si nejsem jist, jaké jsou vlastně současné best practices vzhledem k bezpečnosti a znovupoužitelnosti.

Prošel jsem samozřejmě několik souvisejících diskusí a znám výsledný názor, že automatické generování je proti smyslu Nette. Proto bych raději než automatický generátor měl k dispozici cosi jako expertní systém, který poradí, jak některé standardní kroky tvorby formulářů udělat co nejlépe. Sám se pak po odsouhlasení postará o vygenerování standardních součástí, umožní ale jejich libovolnou modifikaci podle přání uživatele.

Nakonec jsem na podzim začal psát vlastní generátor, který by po dokončení měl vycházet z následujících požadavků:

1. Bude napsaný v Nette, bezpečný, co nejmenší, co nejjednodušší a v mezích možností rozšiřitelný.

2. Bude produkovat kód se zajištěnou bezpečností a natolik dobře napsaný, že bude moci sloužit i k výuce začátečníků (mezi které se stále počítám), jak některé požadavky řešit.

3. Bude použitelný minimálně v češtině a angličtině, s jednoduchou rozšiřitelností slovníků.

4. Půjde o visuální nástroj podobný ClassWizardu z Visual Studia, který před uložením do presenterů, šablon, modelů a dalších struktur umožní funkční preview vzhledu a funkčnosti každého formuláře.

5. Bude spolehlivě řešit nejen cizí klíče ve vztahu 1:N, ale nabídne i použitelná řešení pro vztah M:N. Umožní a navrhne přidat i multiselectboxy s pomocnými formuláři z předpokládané vazební tabulky (v příkladu použitém dále např. členství jedné osoby ve více sportovních oddílech, vhodné u omezených množin jako např. počet sportovních oddílů v jedné jednotě), nebo pomocí přidávání řádků (typicky „další telefonní číslo“). Pro větší vazební tabulky vytvoří samostatný formulář s gridem, checkboxy a rozvinutelnými podformuláři.

6. Pro každý prvek formuláře nabídne sám nejvhodnější i méně vhodné variantu/varianty, umožní ale i použití varianty dle „jeho“ názoru nevhodné s tím, že na ni jasně upozorní (například editace cizího klíče users_id v textovém poli apod).

7. Umožní jednoduše přidat či ubrat více formulářových prvků pro jeden sloupec databáze (pokud to pro některý sloupec má smysl).

8. Umožní jednoduchou správu vytvořených projektů – schemat návrhů formulářů.

9. Bude použitelný z mobilu nebo tabletu (vyváření formulářů cestou do zaměstnání).

10. V případě změny výchozích struktur (tabulek v databázi) využije již vytvořené čísti schématu odpovídající nezměněné části struktur a umožní interaktivně k nim dodefinovat nové.

11. Výhledově by generátor mohl vycházet i z jiných databází nebo entit.

Trošku jsem s generátorem pokročil teď o svátcích, kdy jsem ležel s teplotou a nevěnoval jsem se tolik svým běžným pracovním úkolům. Bohužel není zdaleka hotový, na předvedení filozofie fungování i tvorbu jednodušších formulářů to už snad stačí. Ocenil bych, kdybyste zkusili demo a napsali připomínky. Definice pro jednotlivé typy prvků formuláře stále doplňuji, ty nedokončené jsou v demu zatím uvedeny v závorkách. Zatím chybí předpokládaná podpora pro vazby M:N (bod 5) viz poznámka dole, potřebuji poradit s jazykovými mutacemi (bod 3 + omlouvám se za svoji czangličtinu v demu) a zkontrolovat best practices u produkovaného kódu. Také důležitý bod 10 mám zatím jen částečně rozpracovaný a jakákoli konzultace mi přijde vhod. Přijde-li někomu projekt zajímavý, zveřejním zdrojové kódy. Jen zatím netuším, jak se pracuje s Gitem, v zaměstnání máme striktně interní verzování a zálohování. Takže bych případně uvítal pomoc i s tím, na studium návodů nemám naprosto žádný čas.

Základní demostránka projektu je na adrese http://oddily.php5.cz/ , kde najdete i odkaz na vyčištění session pro případ nenadálého „zauzlení“ generátoru do doby, než se vychytají všechny počáteční „mouchy“ a převzatý primitivní session editor za stejným účelem. Ještě bych potřeboval poradit, jak zařídit a napsat odkaz na smazání cache Nette a Latte.

Vlastní generátor najdete na adrese http://oddily.php5.cz/formgenerator/ . Dočasně bude fungovat bez autorizace se zapnutou laděnkou kvůli jednoduššímu vyzkoušení a záměrně zatím neumožňuje zápis souborů presenterů, modelů a šablon generuje presentery, modely a šablony, seznam je dole. Nahoře si můžete vybrat některé z již uložených schemat, nebo vybrat tabulku z databáze a vytvořit pro ni schema nové.

Generování se spouští tlačítkem Generate Code from the settings entered above (unsaved Code will be overwritten!).

Po zkontrolování a případné úpravě vygenerovaného kódu stiskněte tlačítko Update previews below by prepared Code without saving schema or Code , v dolní části se vytvoří visuální náhled vygenerovaného formuláře a stručného seznamu s voláním akcí New a Edit. V seznamu zatím chybí stránkování, ale data nejsou rozsáhlá. Obě Preview lze odkazem dole přenést do samostatného okna nebo záložky prohlížeče (podle nastavení chování targetu „_blank“ v prohlížeči).

Stejně je možné do další záložky odeslat i zobrazení Admineru z horní části generátoru. Přístupové údaje k databázi v Admineru jsou czoddily:NetteFormGenerator na serveru localhost. Spodní tlačítka Save prepared ... a Save all ... zatím dělají jen část z toho, k čemu jsou určena.

Vytvořené a upravené schéma můžete uložit pod novým názvem pomocí tlačítka Save all settings and generated/rewritten Code, thereafter update previews nahoře.

Schema databáze najdete na tomto odkazu . Jde o databázi pro jednoduchou webovou aplikaci na evidenci členské základny jedné malé sportovní jednoty včetně rozvrhů hodin oddílů a plateb členských příspěvků, kterou jsem slíbil ve volném čase zprovoznit. Budu rád i za připomínky k návrhu databáze a výsledným formulářům. Data jsou zčásti vyplněná z veřejných náhodných generátorů, některé tabulky jsou zatím prázdné. V ideálním případě by měl být je generátor časem schopný celou tuto aplikaci navrhnout a vygenerovat sám tak, aby programátor na konci udělal už jen kosmetické změny a přidal grafiku.

Generátor by mohl přispět ke strmější křivce učení a popularizaci frameworku navrhováním „správných“ variant. I zkušení programátoři by možná mohli podobný generátor použít k rychlému prototypování částí aplikace třeba při konzultaci se zákazníkem.

Pro pochopení zamýšlené logiky doporučuji nejprve nahoře načíst již hotové schéma „Tabulka ‚clen‘ s přepsáním popisků pro selectBoxy“ a dole se poté podívat na Preview, případně si jej otevřít na samostatné stránce http://oddily.php5.cz/…ator/listing (ta se před vygenerováním nebo načtením hotového schematu zobrazuje prázdná) a klikat na odkazy „New“ a „Edit“.

Poznámka:

Pro vazbu M:N zatím generátor vytváří kód pro Kdyby\Replicator pomocí návrhu na obrázku dále. Pro cizí klíče navrhuje první textové pole vzdálené tabulky. V tomto případě pro tabulku ‚člen‘ navrhne Kdyby\Replicator s přidáním členství v oddílu podle Select[Název oddílu] a dvěma kalendáři pro vložení členství ‚od‘ a ‚do‘:

Vazba M:N

Editoval Martin (18. 1. 2018 11:07)