Tovarnicka na komponentu v Nette 2.3

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

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)

CZechBoY
Člen | 3608
+
+2
-

Máš v tom trošku zmatek.
V komponentě už metodu create nepotřebuješ, jen render().
V presenteru jen vytvoříš komponentu přes tu továrnu a potom vykreslíš v šabloně přes {control nazevKomponenty}.

mlk
Člen | 5
+
0
-

Dakujem, uz som to konecne pochopil :)

Ages
Člen | 129
+
+2
-

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)

CZechBoY
Člen | 3608
+
+1
-

Pořád nechápu proč tam musí být metoda ReportGenerator::create. Renderovací metoda by se měla jmenovat render, potom se i sama zavolá při výpisu přes makro {control}.

Ages
Člen | 129
+
0
-

CZechBoY napsal(a):

Pořád nechápu proč tam musí být metoda ReportGenerator::create. Renderovací metoda by se měla jmenovat render, 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
+
0
-

CZechBoY napsal(a):

Pořád nechápu proč tam musí být metoda ReportGenerator::create. Renderovací metoda by se měla jmenovat render, 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 :)