Component with name * does not exist
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- Tomsgu
- Člen | 2
Zdravim,
podle navodu
se snazim vytvorit menu komponentu. Dostanu hlasku viz. titulek. Nevite, cim by
to mohlo byt?
app/components/AddressBookMenuControl.php
<?php
declare(strict_types=1);
namespace App\Components;
use App\Model\AddressBookManager;
use Nette\Application\UI\Control;
class AddressBookMenuControl extends Control
{
/**
* @var AddressBookManager
*/
private $manager;
/**
* @var string
*/
private $menuTemplate;
/**
* AddressBookMenuComponent constructor.
*
* @param AddressBookManager $manager
*/
public function __construct(AddressBookManager $manager)
{
parent::__construct();
$this->manager = $manager;
$this->menuTemplate = __DIR__ . '/templates/menu.latte';
}
/**
* Render the menu component.
*/
public function render()
{
$this->template->setFile($this->menuTemplate);
$this->template->addressBooks = $this->manager->getAddressBooks();
$this->template->render();
}
}
app/components/templates/menu.latte
<nav class="menu">
<a href="{plink AddressBook:show $addressBook->getId()}"
n:foreach="$addressBooks as $addressBook"
class="menu-item">
{$addressBook->getName()}
</a>
</nav>
app/components/IAddressBookMenuControlFactory.php
<?php
declare(strict_types=1);
namespace App\Components;
interface IAddressBookMenuControlFactory
{
/**
* @return AddressBookMenuControl
*/
public function create();
}
config.neon
services:
- App\Components\IAddressBookMenuControlFactory
app\presenters\BasePresenter.php
<?php
declare(strict_types=1);
namespace App\Presenters;
use App\Components\AddressBookMenuControl;
use App\Components\IAddressBookMenuControlFactory;
use Nette;
/**
* Base presenter for all application presenters.
*/
class BasePresenter extends Nette\Application\UI\Presenter
{
/**
* @var IAddressBookMenuControlFactory @inject
*/
public $menuFactory;
/**
* @return AddressBookMenuControl
*/
protected function createAddressBookMenuControl()
{
return $this->menuFactory->create();
}
}
A v posledni rade @layout.latte
{control addressBookMenu}
Editoval Tomsgu (29. 3. 2017 17:20)
- jiri.pudil
- Nette Blogger | 1028
V presenteru se ta metoda musí jmenovat
createComponentAddressBookMenu
, tj.
- chybí ti
Component
(konvence) a - přebývá ti
Control
(nebo ho tam nech, ale v šabloně pak musíš odkazovat celým názvem:{control addressBookMenuControl}
).
- Tomsgu
- Člen | 2
Jasne. Diky moc! Te magie je tam nejak hodne.
jiri.pudil napsal(a):
V presenteru se ta metoda musí jmenovat
createComponentAddressBookMenu
, tj.
- chybí ti
Component
(konvence) a- přebývá ti
Control
(nebo ho tam nech, ale v šabloně pak musíš odkazovat celým názvem:{control addressBookMenuControl}
).
- CZechBoY
- Člen | 3608
No ona tam moc žádná magie není, spíš jen konvence. https://api.nette.org/…ner.php.html#…