Interaktivní generátor formulářů a seznamů ze struktury MySQL databáze
- Martin
- Člen | 171
Generovaný výsledek s vazbami 1:N i M:N (DefaultFormRenderer):
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‘:
Editoval Martin (18. 1. 2018 11:07)