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 :)