Nenalezena vlastni komponenta/sluzba
- martinJanousek
- Člen | 5
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
Dej tam
{control basket}
to se totiz dovozuje od toho jak nazves tu metodu createComponent
a ty tam mas
createComponentBasket()
- martinJanousek
- Člen | 5
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
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
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
zkus si to – preda se to automaticky.. (stejne jako se v tom prikladu v doc predava automaticky UserManager)
- Jiří Nápravník
- Člen | 710
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
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
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
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.