Jak na tyto widgety/komponenty?
- jiri.medved
- Člen | 33
Mám aplikaci rozdělenou na moduly AdminModule, FrontModule. V AdminModule mám složky: presenters, templates, zde chci přidat složku widgets, kde budou uložené widgety takto:
- widgets
- admin-menu-mini
- Presenter.php
- template.latte
- admin-menu-logo
- Presenter.php
- template.latte
- admin-menu-mini
Jak mám postupovat, když chci pak v AdminModule v @layout.latte zavolat widget tímto způsobem:
<?php echo $this->renderWidget('adminmodule.admin-menu-mini'); ?>
<?php echo $this->renderWidget('adminmodule.admin-menu-logo'); ?>
- Filip Procházka
- Moderator | 4668
Mám pocit, že se snažíš přenést nějaký svůj zvyk z jiného frameworku/cms/…
Takže, v Nette neříkáme widgety, ale komponenty. Komponenty si můžeš ukládat kamkoliv. Pokud je dáš do složky indexované RobotLoaderem, tak je najde.
Taková komponenta může vypadat takto
namespace AdminModule;
class MenuMiniControl extends \Nette\Application\UI\Control
{
private $menuModel;
/** MenuModel bude nějaká tvoje třída, které bude tvoje menu třeba načítat z databáze */
public function __construct(MenuModel $menuModel)
{
parent::__construct();
$this->menuModel = $menuModel;
}
public function render($menuId)
{
// toto automaticky nastaví šablonu na tu ve stejné složce
$this->template->setFile(__DIR__ . '/template.latte');
$this->template->menu = $this->menuModel->find($menuId);
$this->template->render();
}
}
potom si ji v presenteru připojíš
protected function createComponentMenuMini()
{
return new MenuMini($this->context->menuModel);
}
a v šabloně vykreslíš
{control menuMini 15}
Editoval HosipLan (20. 9. 2011 16:00)
- jiri.medved
- Člen | 33
Ano, přecházím ze Zendu na Nette :))
Moc Ti děkuji, maximálně jsi mi pomohl. Díky.
- Filip Procházka
- Moderator | 4668
Doporučil bych ti pokračovat studiem v naší krásné nové a voňavé dokumentaci :)
- Filip Procházka
- Moderator | 4668
Pak jsi pravděpodobně špatně napsal továrničku. Ale nemůžu ti poradit, dokud neuvidím kód ;)
- jiri.medved
- Člen | 33
Komponenta:
namespace AdminModule;
class MenuControl extends \Nette\Application\UI\Control
{
public function render()
{
$this->template->setFile(__DIR__ . '/template.latte');
$this->template->render();
}
}
Továrnička v presenteru:
public function createComponentMenu()
{
return new MenuControl();
}
V @layout.latte:
{control menu}
- Filip Procházka
- Moderator | 4668
A ukážeš mi laděnku? Zdá se mi, že jsi komponentu pojmenoval
menu
, nikoliv menuMini
. Takže chyba teď nejspíš
vypadá jinak ne? Nebo už to funguje?
- jiri.medved
- Člen | 33
Jsem to prejmenoval.
Ladenka:
Component with name 'menu' does not exist
<body>
50: <!-- TOP HEADER BAR -->
51: <div id="global_header_wrapper">
52: <div id="global_header">
53: <?php $_ctrl = $control->getWidget("menu"); if ($_ctrl instanceof Nette\Application\UI\IPartiallyRenderable) $_ctrl->validateControl(); $_ctrl->render() ?>
54: </div>
55: </div>
56: </body>
- Filip Procházka
- Moderator | 4668
Malý detail. createComponent<Name>
je vždy
protected
.
Ukaž více kódu, nebo se ujisti, že je všechno na svých místech. Včetně továrničky ve správném presenteru.
- jiri.medved
- Člen | 33
Stahnul jsem si cisty sandbox a tam vse naprosto ok … Tak mam asi nejaky bordel v tech modulech :-( … Moc vam dekuji za pomoc … Zacnu od znovu …
- bojovyletoun
- Člen | 667
trochu mi smrdí takováhle úprava konstruktoru – viz https://forum.nette.org/…i-textu-z-db#…
Editoval bojovyletoun (20. 9. 2011 15:50)
- Filip Procházka
- Moderator | 4668
Takovéhle úpravy konstruktoru jsou naprosto v pořádku.
Zapomenuté volání parent::__construct();
jsem přidal.