Nenalezena vlastni komponenta/sluzba

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

Dobry den, delsi dobu resim problem a nemohu na nej nalezt odpoved ani zjistit v cem mam chybu.
Vytvarim komponentu BasketControl – mala komponenta ktera bude zobrazovat aktualni pocet zbozi v eshopu, ktere jsou ulozene v session.

BasketControl.php

<?php

namespace Control;

use Nette\Application\UI,
    Nette\Database\Context,
    Nette\Http\Session,
    Control\BasketControl;

class BasketControl extends UI\Control {


/** \Nette\Http\SessionSection */
    protected $SessionSection;

    public function __construct(\Nette\Http\Session $session)
    {
        $this->SessionSection = $session->getSection('sesUser');
    }

    public function render() {

        // a získáme přístup do sekce 'myCounter':
        //$myCounter = $session->getSection('sesUser');

        $this->template->count = $SessionSection->Item;

        $this->template->render(__DIR__ . "\basketcontrol.latte");
        //$this->template->render();


    }

}
?>

BasketControl.latte


<p>{$count}</p>

BasePresenter.php – ze ktereho komponentu/sluzbu volam aby byla pristupna vsem.


<?php

namespace App\Presenters;

use Nette,
	App\Model,
    Control\BasketControl,
    Nette\Http\Session;


/**
 * Base presenter for all application presenters.
 */
abstract class BasePresenter extends Nette\Application\UI\Presenter
{

    private $database;

    //toto
    // private $session;

    /** @var BasketControl @inject */
    public $Basket;

    public function __construct(Nette\Database\Context $database)
    {
        $this->database = $database;
    }

//toto
    // protected function createComponentBasket(){

    //     $control = new BasketControl($this->session);

    //     return $control;

    // }

	public function beforeRender()
    {
        parent::beforeRender(); // nezapomeňte volat metodu předka, stejně jako u startup()
        $this->template->menuItems = array(
            'Domů' => 'Homepage:',
            'Skicaky' => 'Zbozi:skicaky',
            'Pastelky' => 'Zbozi:pastelky',
            'Onas' => 'Onas:',
        );


        $this->template->menuItemsAdmin = array(
            'Domů' => 'Homepage:',
            'Pastelky' => 'Zbozi:pastelky',
            'Skicaky' => 'Zbozi:skicaky',
            'Zakaznici' => 'Zakaznik:',
            'Dodavatele' => 'Dodavatel:',
            'Objednavky' => 'Objednavka:',
        );
    }

}

A config.neon kde sluzbu registruji



parameters:

php:
	date.timezone: Europe/Prague


nette:
	application:
		errorPresenter: Error
		mapping:
			*: App\*Module\Presenters\*Presenter

	session:
		expiration: 14 days


services:
	- App\Model\UserManager
	- App\RouterFactory
	basketControl: Control\BasketControl
	router: @App\RouterFactory::createRouter

Takhle volam komponentu v layoutu: {control basketControl}
pricemz zde mi to hlasi chybu:

Component with name ‚basketControl‘ does not exist

Jiří Nápravník
Člen | 710
+
0
-

Dej tam
{control basket}

to se totiz dovozuje od toho jak nazves tu metodu createComponent
a ty tam mas
createComponentBasket()

martinJanousek
Člen | 5
+
0
-

To createComponentBasket je zakomentovane(pardon, to je moje chyba nemel sem to tam davat). Jde o to, ze pri vytvoreni instance BasketControl je potreba $session-coz BasePresenter nevlastni a tudiz jsem chtel vyuzit Dependency Injection a proto jsem to registroval jako sluzbu, bez tovarnicky createComponentBasket. Napada vas neco jineho?

David Matějka
Moderator | 6445
+
0
-

Kdyz registrujes neco jako sluzbu, tak to neni dostupne jako komponenta. A komponenty by se vubec jako sluzby registrovat nemely.

Pouzij tovarnicku na komponentu – https://doc.nette.org/…dependencies#…

martinJanousek
Člen | 5
+
0
-

Tovarne ale nemam odkud predat $session abych mohl vytvorit BasketControl. Je to zamotane, kvuli tomu, ze to potrebuji z BasePresenteru.

David Matějka
Moderator | 6445
+
0
-

zkus si to – preda se to automaticky.. (stejne jako se v tom prikladu v doc predava automaticky UserManager)

Jiří Nápravník
Člen | 710
+
0
-

Ten priklad pokud se nemylim, by ti mel takto fungovat (i kdyz neni spravne, jak pise matej, pouzij tovarnicky). Proste to odkomentuj

a ty tam mas
createComponentBasket
a v layoutu volas
{control basketControl}
musis tam mit
{control basket}
to tucne se musi shodovat

martinJanousek
Člen | 5
+
0
-

Zkusil jsem odkomentovat a prejmenovat, ale hlasi mi to chybu v souboru BasketControl: „Undefined variable: SessionSection“. Zkusim predelat podle Mateje. Jinak zatim moc dekuji za Vas cas.

Jiří Nápravník
Člen | 710
+
0
-

Coz ti v podstate rika, ze neexistuje ta promenna, predpokladam, ze to haze tady:

        $this->template->count = $SessionSection->Item;

musis tam totiz mit

        $this->template->count = $this->SessionSection->Item;

ale to uz jsou spise zaklady php…

martinJanousek
Člen | 5
+
+1
-

Tak to me dostalo. Divam se tak moc do Nette, az se zapominam divat i do sveho kodu. Omlouvam se a dekuji za pomoc. Moc jste mi pomohli.