Jak na inject modelu ve formuláři děděném z control

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

Ahoj,
mám tu ještě snad jeden krátký dotaz – kvůli možnosti šablony mám speciální komponentu na vytvoření formuláře která je rozšiřením \Nette\Application\UI\Control a do této komponenty potřebuji nalinkovat třídy z modelu, jak na to nejlépe?
Co nejde:
1.Metody s inject* v této komponentě nefungují – nehodí chybu ale neprovedou se – tohle by dle mě bylo nejlepší kdyby to fungovalo.
2.Nemůžu model připojit přes parametry __construct() ani při createComponentHledani(), protože pokud jsem správně pochopil, těmto dvěma metodám presenter už při vytváření dosadí jiné parametry jsou už z presenteru volány (u contruct je dosazena instance presenteru a u createComponent nějaké označení toho daného formuláře/komponenty)
3.našel jsem konstrukci, která si sahá přes presenter na daný model nastavený v presenteru, ale to se mi též úplně nezdá
Samozřejmě asi bych mohl udělat v komponentě setter, kterým si do nějaké vnitřní proměnné nastavím daný model, ale to se mi nezdá jako nejlepší řešení, protože při každé inicializaci formuláře musím zavolat ještě tento setter. Jak se tohle tedy nejlíp řeší? Děkuji

David Matějka
Moderator | 6445
+
0
-

Inject* metody se defaultne volaji pouze u presenteru, necha se to ale zapnout, pokud pouzivas tovarny na komponenty (viz doc). v neonu pak mas:

services:
	fooComponentFactory:
		implement: IFooComponentFactory
		inject: true #tohle to zapne

V masteru je pak decorator extension, kterym ten inject muzes zapnout treba pro vsechny potomky base controlu


EDIT:
Ale ty inject metody pouzivej pouze v base controlu, v konkretnich komponentach si zavislosti predavej pres konstruktor prave s vyuzitim tech generovanych tovarnicek

Editoval matej21 (2. 1. 2015 14:01)

argosovo
Člen | 54
+
0
-

Asi z toho nejsem úplně moudrý – jsem přece jen pořád začátečník – takže jestli můžu – komponentu z presenteru volám takhle:

<?php

        protected function createComponentHledaniMain($name)
        {
            $form = new \App\FrontModule\Forms\HledaniMain($this,$name);
            return $form;
        }
?>

komponenta vypadá takhle:

<?php
namespace App\FrontModule\forms;
use \Nette\Application\UI,
    Nette\ComponentModel\IContainer,
    Nette\Forms;
use Nette\Application\UI\form;
use Nette\Diagnostics\Debugger;

class HledaniMain extends \Nette\Application\UI\Control
{

    private $select,$form;
    private $inzeratyModel, $ciselnikyModel;
    private $databaseOne = ['1', '2', '3'];
	private $databaseTwo = [
		['11', '12', '13'],
		['22', '23', '24'],
		['33', '34', '35'],
	];
	private $databaseThree = [
		[
			['111', '112', '113'],
			['121', '122', '123'],
			['131', '132', '133'],
		],
		[
			['222', '223', '224'],
			['232', '233', '234'],
			['242', '243', '244'],
		],
		[
			['333', '334', '335'],
			['343', '344', '345'],
			['353', '354', '355'],
		],
	];
    //tohle nefunguje
	//public function injectModel(\Model\AdminModule\Ciselniky $ciselniky){
    //    $this->ciselniky = $ciselniky;
    //}
    public function __construct()
    {
    }

    public function render()
    {

      $template = $this->createTemplate();
      $template->setFile(__DIR__ . '/templates/hledaniMain.latte');
      $template->registerFilter(new \Nette\Latte\Engine());
      $template->render();
    }

    protected function createComponentHledaniMain($name){
        $this->form = new \Nette\Application\UI\Form;
        $this->template->__form = $this->form;
       	$this->form->addSelect('one', 'One', $this->databaseOne)->setDefaultValue(1);
        $this->form->addSelect('two', 'Two', $this->databaseTwo[$this->form['one']->value])->setDefaultValue(1);
	$this->form->addSelect('three', 'Three', $this->databaseThree[$this->form['two']->value][1])->setDefaultValue(1);
	$this->form->addSubmit('send', 'Odeslat');
	$this->form->onSuccess[] = $this->success;
     return $this->form;


    }
    public function success(UI\Form $form, $vals) {
		dump($vals);
    }

    public function handleInvalidateTwo($value) {
                $this['hledaniMain']['two']->setItems($this->databaseTwo[$value]);
		$this['hledaniMain']['three']->setItems($this->databaseThree[$value][0]);
		$this->redrawControl();
    }
    public function handleInvalidateThree($valueOne, $valueTwo) {
		$this['hledaniMain']['three']->setItems($this->databaseThree[$valueOne][$valueTwo]);
		$this->redrawControl('three');
    }
}
?>

co a jak mám upravit abych například u handleInvalidateTwo($value){} mohl použít \Model\Ciselniky $ciselniky – tak abych mohl plnit selecty reálnými daty a ne pouze fiktivní databází uvnitř komponenty… jestli na to někdo můžete kouknout prosím, jsem fakt zmaten. (do __construct() což mi asi bylo porazeno to nelze přidat, napíše to že byla předána instance Presenter a ne \Model\Ciselniky.