Jak na tyto widgety/komponenty?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
jiri.medved
Člen | 33
+
0
-

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

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
+
0
-

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
+
0
-

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
+
0
-

Doporučil bych ti pokračovat studiem v naší krásné nové a voňavé dokumentaci :)

jiri.medved
Člen | 33
+
0
-

Tak mi to píše:
Component with name ‚menuMini‘ does not exist.

Filip Procházka
Moderator | 4668
+
0
-

Pak jsi pravděpodobně špatně napsal továrničku. Ale nemůžu ti poradit, dokud neuvidím kód ;)

jiri.medved
Člen | 33
+
0
-

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
+
0
-

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
+
0
-

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>
Nox
Člen | 378
+
0
-

Tohle je jen hláška z laděnky, bylo myšleno dát odkaz na ten .html soubor

Je ta továrna ve správném Presenteru?

Editoval Nox (17. 8. 2011 12:33)

Filip Procházka
Moderator | 4668
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

Takovéhle úpravy konstruktoru jsou naprosto v pořádku.

Zapomenuté volání parent::__construct(); jsem přidal.