Injektování do modelu formuláře

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

Ahoj, asi se zeptám blbě, ale je nějaká možnost injektovat mimo presenter například do formuláře ?

mám např. třídu

class MyForm extends UI\Form
{
//a tohle bych potřeboval zprovoznit
    /**
     * @var Model\DbTable\Articles
     * @inject
     */
    public $articles;

.
.
.
}

Jde mi o to, že potřebuju naplnit selecty nějakými daty, které tahám z db. Určitě je možnost si tydata předávat v konstruktoru již z presenteru nebo v setteru, ale já bych to chtěl mít pouze čistě v tom modelu. Abych nemusel pokaždé při vytváření toho formuláře ještě předávat ty data. Díky

David Matějka
Moderator | 6445
+
+2
-

neded UI\Form, bud si na form vytvor tovarnu, nebo komponentu. Oba zpusoby jsou popsany na planette

kleinpetr
Člen | 480
+
0
-

aha..

mám totiž něco takového

class MyForm extends UI\Forms
{
	//tohle potřebuji
    /**
     * @var Model\DbTable\Authors
     * @inject
     */
    public $authors;

	.
	.
	.

	public function getElement($type){
		if($type == 'authors'){
			return $this->addSelect('authors','Autoři',$this->authors->getAll());
		} elseif(...){

		}
	.
	.
	.
	}
}

class MyCustomForm extends MyForm
{
	.
	.
	.
	public function renderForm(){
		$this->getElement('authors');
		$this->getElement('dalsi');
		$this->getElement('dalsi');
		$this->getElement('dalsi');
	}
}

Takhle dědím několik formů od MyForm, protože u všech používám třeba stejné elementy pouze jinak poskládané, atp. a teď hledám tedy způsob jak nejlépe vyřešit ty závislosti..

Editoval kleinpetr (31. 3. 2015 20:09)

kleinpetr
Člen | 480
+
0
-

Takže jsem to vyřešil takto:

Tohle je Model kterej se stará o takový to obecný nastavení elementů

class FormParser extends Nette\Object
{
    protected $authors;
    protected $articles;
    protected $form;

    public function __construct(Model\DbTable\Authors $authors, Model\DbTable\Articles $articles)
    {
        $this->authors = $authors;
        $this->articles = $articles;
        $this->form = new Nette\Application\UI\Form;
    }

    protected final function getElement($type,$form)
    {
        $values = [];

        if ($type == 'authors') {
            foreach ($this->authors->getAll() as $value) {
                $values[$value->id] = $value->name;
            }
            $element = $form->addSelect('authors','Autoři', $values);
        } elseif ($type == 'articles') {
            foreach ($this->articles->getAll() as $value) {
                $values[$value->id] = $value->title;
            }
            $element = $form->addSelect('articles', 'Články', $values);
        }

		.
		.
		.

        return $element;
    }
}

Nepředávám si jen připojení k db, protože v těchto modelech ještě řeším cachování atp, takže si je musím předávat postupně, dle použití.

Poté už jen napíši nějaký vlastní form

class MyCustomForm extends FormParser
{
	public function render(){
		$form = $this->form;

		$element = $this->getElement($form,'authors');
		$element->setOption(..);

		$element = $this->getElement($form,'articles');
		$element->setOption(..);

		.
		.
		.

		return $form;
	}
}

Zaregistruju službu do configu a v presenteru si pak injectnu MyCustomForm a vytvořím z něho komponentu

/**
 * @var Forms\MyCustomForm
 * @inject
 */
public $myCustomForm;

protected function createComponentMyCustomForm()
{
    $form = $this->myCustomForm;

    return $form->render();
}

Kdyby měl někdo nějakou radu na vylepšení nebo cokoliv, tak budu jedině rád ;)

Editoval kleinpetr (1. 4. 2015 1:57)