Zapouzdření více formulářových prvků do jednoho
- Peetee
- Člen | 75
Ahoj,
snažím se o takovou rošádu s formulářovými prvky a protože se mi v projektu bude často opakovat, tak v rámci DRY bych chtěl zapouzdřit pro jednoduché, budoucí použití. V současné době mám při vytváření formuláře:
<?php
$form->addRadioList('create_select', '',Array('create' => 'Vytvořit novou aplikaci','select' => 'Vybrat aplikaci ze seznamu'));
$form->addSelect('application', 'Aplikace', $myArray);
$form->addText('application_name','Název aplikace:');
?>
Při zpracovávání formuláře:
<?php
$data = $form->values;
if ($data['create_select'] == 'create') {
// vytvoří její v db a získá ID prvku
//...
$data['application'] = $id
}
unset($data['create_select']);
unset($data['application_name']);
?>
(psáno z hlavy, nevím, jestli tam nejsou nějaké překlepy)
Chtěl bych to celé zapouzdřit do jednoho ovládacího prvku. Který bych mohl použít:
<?php
$form->addAplication('application','Aplikace:');
?>
(ano, tohle řešení by očekávalo, že by komponenta měla přístup do db). Pokoušel jsem se takovou komponentu vytvořit, ale nedokážu pochopit jak zařídit, aby v rámci jedné komponenty bylo více ovládacích prvků, které se budou chovat tak jak jsem v Nette zvyklí…
Díky za každou radu.
- Nox
- Člen | 378
Buď extensionMethod viz https://componette.org/search/?…
Nebo si udělat vlastní (abstraktní pokud máš spešl třídu na každý formulář) formulář(e) a tam si dát co potřebuješ
Druhé má výhodu minimálně v tom, že bude napovídat IDE
Editoval Nox (2. 11. 2011 10:44)
- Nox
- Člen | 378
namespace MyProject;
use Nette;
class Form extends Nette\Application\UI\Form {
public function addApplication($nejakeArgumenty) {
$this->addText(/*...*/);
$this->something();
$a = 5;
$this->somethingX($a);
}
}
/* --------- */
/* místo $form = new Nette\Application\UI\Form */
$form = new MyProject\Form(/*...*/);
$form->addApplication($stuff);
/*...*/
Pokud ale má člověk k dispozici třeba víc různých knihovních základních tříd, anebo prostě obecně by člověk chtěl něco jako vícenásobnou dědičnost… na tohle by asi byly lepší traits z PHP5.4 …
… což je v podstatě zhruba to co je extensionMethod, v tom případě pak můžeš použít tu
Editoval Nox (2. 11. 2011 11:06)
- Ot@s
- Backer | 476
Ukázka form. prvku složeného ze 2 textovych inputů (pole s indexy A a B).
Def. nového form. objektu
use Nette\Forms, Nette\Utils\Html;
class MyInput extends \Nette\Forms\Controls\BaseControl {
public function getControl() {
$container=Html::el();
$control = parent::getControl();
// vytvoreni inputu A
$inputA = clone $control;
$inputA->name .= '[a]';
if (isset($this->value['a'])) $inputA->value = $this->value['a'];
$container->add($inputA);
// vytvoreni inputu B
$inputB = clone $control;
$inputB->name .= '[b]';
if (isset($this->value['b'])) $inputB->value = $this->value['b'];
$container->add($inputB);
return $container;
}
}
Registrace (třeba v bootstrap.php):
\Nette\Forms\Container::extensionMethod('addMyInput', function (\Nette\Forms\Container $container, $name, $label = NULL) {
return $container[$name] = new MyInput($label);
});
Použití:
// v $form je def. nette formulare
$form->addMyInput('prosoucet', 'Zadej hodnoty A a B');
// dosazeni vychozich hodnot
// $form['prosoucet']->setDefaultValue(array('a'=>15, 'b'=>20));
Editoval Ot@s (2. 11. 2011 11:14)