Jak ve vlastním formuláři / komponentě získat parametr z config.neon?

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

Ahoj, jakým způsobem získám ve svém formuláři, který dědí od základního Nette\Application\UI\Form, hodnoty z config.neon?

config.neon

parameters:
	upload:
		max_file_size: 5242880 #5MB

MyForm.php

class MyForm extends \Nette\Application\UI\Form{
	// nastavení renderu atd.
}

Předpokládám, že následující cesta není správná (ale funguje):

class MyForm extends \Nette\Application\UI\Form{

	/** @var int */
	public $max_file_size;

	protected function attached($obj){
		parent::attached($obj);
		$this->max_file_size = $this->getPresenter()->getContext()->parameters['upload']['max_file_size']);
	}
}

Předem díky za rady.

Felix
Nette Core | 1245
+
+3
-

Na tohle se skvele hodi mit factory na formular.

class MyFormFactory {

	/** @var int */
	private $maxFileSize;

	public function __construct($maxFileSize) {
		$this->maxFileSize = $maxFileSize;
	}

	public function create() {
		$form = new Form();
		// ..
		return $form;
	}
}

Factory staci zaregistrovat do neonu a je to.

services:
	- MyFormFactory(%max_file_size%)
flamengo
Člen | 135
+
0
-

@Felix Pomocí továrničky mě to také napadlo. Nicméně to potom musím do všech presenterů, kde vytvářím formulář, injectovat tuto továrničku. A do všech komponent, kde vytvářím formulář, bych musel také nějak dostat tuto továrničku. V rozdělaném projektu bych musel změnit a předělat hromadu kódu. Není nějaká jiná a správná cesta?

CZechBoY
Člen | 3608
+
0
-

Decorator treba.

decorator:
    App\MujForm:
        setup:
            - setMujParametr(%mujParametr%)
class MujForm
{
    private $mujParametr;
    public function setMujParametr($mujParametr)
    {
        $this->mujParametr = $mujParametr;
    }
}

Asi by to slo i pres konstruktor. Jak ten formular vytvaris? Pres DI jako sluzbu a pak si vyzadas form v presenteru/komponente nebo delas rucne novou instanci?

Editoval CZechBoY (25. 9. 2016 13:19)

Felix
Nette Core | 1245
+
0
-

@flamengo Jestli to potrebujes aplikovat plosne na vsechny formulare, tak bych si byt tebou udelal nejaky svuj formular. V neonu si definovat konstantu MAX_FILE_SIZE a v tom svym formulari si ji aplikoval.

Pripadne si pres Form::extensionMethod definuj svuj vlastni uploadovaci input a tam si to muzes definovat sam.

Pokud to nechces udelat „ciste“, tak je to pak jenom na tobe jak to udelas. :-)

Zmeny kodu se ale nevyhnes.

CZechBoY
Člen | 3608
+
0
-

Nebo pokud vsechny formy dedi od nejaky tvoji baseform tridy tak muzes prepsat addUpload metodu a implicitne by si tam nastavil pravidlo s max file size.

flamengo
Člen | 135
+
+1
-

@Felix

V neonu si definovat konstantu MAX_FILE_SIZE

Tohle by bylo asi nejjednodušší řešení dle mého.

Pripadne si pres Form::extensionMethod definuj svuj vlastni uploadovaci input a tam si to muzes definovat sam.

To by také šlo, vznikne mi nový formulářový prvek.

@CZechBoY

Nebo pokud vsechny formy dedi od nejaky tvoji baseform tridy tak muzes prepsat addUpload metodu a implicitne by si tam nastavil pravidlo s max file size.

To by také šlo :)

Jak ten formular vytvaris?

Ručně, viz kód níže.

Decorator treba.

Toto vůbec neznám, vyzkoušel a nejede :( Zkusil jsme na příkladu https://github.com/…te-decorator a u presenteru mi to funguje, u komponenty nikoliv, nevím co mám špatně.

MyForm.php

<?php
namespace Forms;

class MyForm extends \Nette\Application\UI\Form{

    public $foo = 'MyForm not set';

    public function setFoo($foo){
        $this->foo = $foo;
    }
}

config.neon

decorator:
	App\Presenters\BasePresenter:
		setup:
			- setFoo('BasePresenter bar')
	Forms\MyForm:
		setup:
			- setFoo('MyForm bar')

BasePresenter.php

<?php
namespace App\Presenters;
class BasePresenter extends \Nette\Application\UI\Presenter{

	protected $foo = 'BasePresenter not set';

	public function setFoo($foo){
		$this->foo = $foo;
	}
}

HomepagePresenter.php

<?php
namespace App\Presenters;

class HomepagePresenter extends BasePresenter
{

	public function renderDefault(){
	}

	protected function createComponentForm(){
		$form = new \Forms\MyForm;

		dump($this->foo);
		dump($form->foo);

		return $form;
	}
}

default.latte

{block content}
{control form}

Výsledek:

"BasePresenter bar" (17) // foo proměnná presenteru nastavena
"MyForm not set" (14) // foo proměnná komponenty MyForm Nenastavena
CZechBoY
Člen | 3608
+
0
-

Aha no, takže nepoužíváš formy jako služby.
Tak pak si vyber jedno z těch řešení co jsme nabízeli bez služeb/di.

flamengo
Člen | 135
+
0
-

@CZechBoY Díky moc. Můžu se jen zeptat, jak používat formulář/komponentu, abych mohl použít způsob decorator?

CZechBoY
Člen | 3608
+
0
-

Používej factory jak psal @Felix.