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

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

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

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

No ona tam moc žádná magie není, spíš jen konvence. https://api.nette.org/…ner.php.html#…