Tovarnicka na komponentu v Nette 2.3
- mlk
- Člen | 5
Ahojte, prosim Vas o pomoc s pochopenim tovarniciek v nette 2.3:
Mam componentu:
<?php
namespace App\ReportModule\Components;
use Nette;
use App\ReportModule\Model\ReportRepository as repo;
use App\AppModule\Model\AppRepository as apprepo;
class ReportGenerator extends Nette\Application\UI\Control
{
/** @var repo */
protected $reportRepo;
/** @var apprepo */
protected $appRepo;
public function __construct(repo $reportRepo, apprepo $appRepo)
{
parent::__construct();
$this->reportRepo = $reportRepo;
$this->appRepo = $appRepo;
}
public function create()
{
//....pouzitie __construct, ktore konci latte templatom.....
// ...
$template->parameter1 = ...;
$template->parameter2 = ...;
}
}
interface IReportGeneratorFactory {
/** @return ReportGenerator */
function create();
}
Dalej, mam v config.neon:
services:
router: App\RouterFactory::createRouter
ReportRepo: App\ReportModule\Model\ReportRepository(@database.ia.connection)
AppRepo: App\AppModule\Model\AppRepository(@database.default.connection)
- App\ReportModule\Components\IReportGeneratorFactory
a nasledne presenter:
<?php
namespace App\ReportModule\Presenters;
use Nette;
class ViewPresenter extends Nette\Application\UI\Presenter
{
/** @var \App\ReportModule\Components\IReportGeneratorFactory @inject */
public $reportGeneratorFactory;
protected function startup()
{
parent::startup();
if (!$this->getUser()->isLoggedIn()) {
$this->redirect(':Sign:default');
}
}
public function renderDefaut()
{
}
public function renderBi()
{
$received = $this->reportGeneratorFactory->create();
$received->template->render();
}
}
a hadze mi to chybovu hlasku:
Component '' is not attached to 'Nette\Application\UI\Presenter'
Co mam zle?
PS: dalej sa chcem opytat ako to je v nette 3.0? Je to uz nejako zjednodusene?
Editoval mlk (14. 5. 2018 20:36)
- Ages
- Člen | 129
Přidámvám upravený kód jak to popisoval @CZechBoY
<?php
namespace App\ReportModule\Components;
use Nette;
use App\ReportModule\Model\ReportRepository as repo;
use App\AppModule\Model\AppRepository as apprepo;
class ReportGenerator extends Nette\Application\UI\Control
{
/** @var repo */
protected $reportRepo;
/** @var apprepo */
protected $appRepo;
public function __construct(repo $reportRepo, apprepo $appRepo)
{
parent::__construct();
$this->reportRepo = $reportRepo;
$this->appRepo = $appRepo;
}
public function render()
{
$this->template->param1= 'foo';
//Šablona komponenty
$this->template->setFile(__DIR__ . '/templates/generatorControl.latte');
$this->template->render();
}
}
interface IReportGeneratorFactory {
/** @return ReportGenerator */
function create();
}
<?php
namespace App\ReportModule\Presenters;
use Nette;
class ViewPresenter extends Nette\Application\UI\Presenter
{
protected function startup()
{
parent::startup();
if (!$this->getUser()->isLoggedIn()) {
$this->redirect(':Sign:default');
}
}
public function renderDefaut()
{
}
public function renderBi()
{
}
}
/** @var \App\ReportModule\Components\IReportGeneratorFactory @inject */
public $reportControl;
public function createComponentReportGeneratorControl() {
$control = $this->reportControl->create();
return $control;
}
<!-- bi.latte -->
{control reportGeneratorControl}
Editoval Ages (15. 5. 2018 13:07)
- Ages
- Člen | 129
CZechBoY napsal(a):
Pořád nechápu proč tam musí být metoda
ReportGenerator::create
. Renderovací metoda by se měla jmenovatrender
, potom se i sama zavolá při výpisu přes makro{control}
.
To je samozřejmě pravda, upravoval jsem původní kód a zapomněl přepsat
název metody.
Už jsem to opravil
- mlk
- Člen | 5
CZechBoY napsal(a):
Pořád nechápu proč tam musí být metoda
ReportGenerator::create
. Renderovací metoda by se měla jmenovatrender
, potom se i sama zavolá při výpisu přes makro{control}
.
Mne to s tym render() funguje paradne :)
Dakujem Vam za objasnenie :) necakal som, ze je to az take automaticke :)