Zabudovaná nápověda v Nette aplikaci
- DefenestrationPraha
- Člen | 120
Následující téma řeším spíš jako „nice to have“, ale bylo by to velmi „nice to have“.
Programuji teď v Nette aplikaci, která je určena pro odborné publikum. Převážně ji mají užívat administrátoři a další lidé pracující v IT.
Nicméně ta aplikace má hodně různých nastavení atd., navíc odlišných podle toho, jaká práva ten uživatel má. Proto jsem zvažoval mít tam „zabudovanou nápovědu“ v podobě nějakého panelu, který by se jen tak vznášel někde v rohu a ukazoval třeba „Nápověda: 4 související témata“. A při najetí myší by se ta témata rozbalila a při kliknutí se příslušné téma zobrazilo třeba v nějakém okně (snippetu).
Dělal někdy někdo něco podobného? Třeba pomocí vlastní komponenty? Jde mi o to, abych třeba speciálním blokem mohl nadefinovat, která témata jsou vůči dané stránce relevantní, tj. kromě {block content} měl v šabloně i něco jako {block help-topics}, ze kterého by si pak ta komponenta vyzobala, co má zobrazit.
Každý tip, nápad apod. ocením. Webová podoba mé aplikace je založena na Sneat Bootstrap Dashboardu, který jsem trochu zjednodušil.
- Kamil Valenta
- Člen | 799
Ano, pokud si pamatuji, tak nějak takto:
{control help, 'slug'}
V místě použití se zobrazil btn s otazníkem. Po kliku se otevřel content v modalu. Komponenta v první řadě zohledňovala Presenter:action/view, volitelně se dalo zapsat nějaký slug, pokud bylo potřeba vykreslit komponentu vícekrát na jedné stránce.
- DefenestrationPraha
- Člen | 120
Kamil Valenta napsal(a):
Ano, pokud si pamatuji, tak nějak takto:
{control help, 'slug'}
V místě použití se zobrazil btn s otazníkem. Po kliku se otevřel content v modalu. Komponenta v první řadě zohledňovala Presenter:action/view, volitelně se dalo zapsat nějaký slug, pokud bylo potřeba vykreslit komponentu vícekrát na jedné stránce.
A jak bys zadefinoval ta související témata tak, aby nemusela být zadrátovaná přímo v komponentě? Třeba pomocí nějaké arraye coby argumentu té control? Ještě jsem nezkoušel psát control s parametry, ale snad by to nemuselo být moc těžké.
- DefenestrationPraha
- Člen | 120
mystik napsal(a):
Dalsi moznost je si v layout nadefinovat blok „help“ a v sablone presenteru/akce do nej doplnit obsah.
Díky, a máš nějaký tip, jak v kombinaci Nette / Bootstrap elegantně udělat modální okno?
- Kamil Valenta
- Člen | 799
DefenestrationPraha napsal(a):
A jak bys zadefinoval ta související témata tak, aby nemusela být zadrátovaná přímo v komponentě? Třeba pomocí nějaké arraye coby argumentu té control? Ještě jsem nezkoušel psát control s parametry, ale snad by to nemuselo být moc těžké.
Obsah (i související) je v databázi.
- Kamil Valenta
- Člen | 799
mystik napsal(a):
Dalsi moznost je si v layout nadefinovat blok „help“ a v sablone presenteru/akce do nej doplnit obsah.
Což ale nese omezení jedné nápovědy na jednu stránku. Pokud je stránka dlouhá, může být fajn mít možnost rozdělit nápovědu více kontextově.
- DefenestrationPraha
- Člen | 120
Kamil Valenta napsal(a):
mystik napsal(a):
Dalsi moznost je si v layout nadefinovat blok „help“ a v sablone presenteru/akce do nej doplnit obsah.
Což ale nese omezení jedné nápovědy na jednu stránku. Pokud je stránka dlouhá, může být fajn mít možnost rozdělit nápovědu více kontextově.
Mám takovou myšlenku, jak to udělat bez DB, ale docela by mě v této souvislosti zajímalo, zda je někde v prezentéru nebo šabloně uložená skutečná cesta k templatu, který se momentálně vykresluje.
Rád bych totiž udělal latte soubory s nápovědou, které by se párovaly k aktuální stránce jen jménem a cestou. Takže např. pro akci
User/create
by existoval adresář
help/User/create/
ve kterém by byly jednotlivé latte soubory s tématy nápovědy. Ale znamená to vědět, kde se v rámci souborového stromu vlastně nacházím.
- m.brecher
- Generous Backer | 837
@DefenestrationPraha
zda je někde v prezentéru nebo šabloně uložená skutečná cesta k templatu, který se momentálně vykresluje.
existuje metoda $presenter->template->getFile(), která ale vrací nějakou hodnotu pouze pokud se předtím nastaví cesta k šabloně natvrdo pomocí $presenter->template->setFile(), pokud se hledají soubory podle konvence Nette tak tam nic mít nebudeš. Ale můžeš si zpětně odvodit cestu šabloně hledané konvencí podle modulu, presenteru a akce. Ale můžeš texty k nápovědě odvozovat rovnou z aktuálního $presenterName + $action a nemusíš znát cestu k šabloně.
- Martk
- Člen | 660
Dělám to takhle:
interface ComponentFactory {
public function create(ComponentItem[] $array): Component;
}
class Component extends Control { }
/* trait */class Presenter {
protected function createComponentHelp() { return $this->componentFactory->create($this->getHelpItems()); }
abstract protected function getHelpItems(): ComponentItem[];
}
ComponentItem může být klidně interface, který se sám bude starat o rendering, takže to může být šablona, string, něco z databáze apod.