Jak ve vlastním formuláři / komponentě získat parametr z config.neon?
- flamengo
- Člen | 135
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
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
@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
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
@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.
- flamengo
- Člen | 135
@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