Zapouzdření více formulářových prvků do jednoho

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

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
+
0
-

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)

Peetee
Člen | 75
+
0
-

Nox napsal(a):
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š

Přiznám se, že nevím jak to myslíš? Myslel jsem, že řešení bude vytvořit vlastní prvek do formuláře. Může prosím přidat nějaký příklad?

Nox
Člen | 378
+
0
-
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
+
0
-

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)

Peetee
Člen | 75
+
0
-

Nox napsal(a):

class Form extends Nette\Application\UI\Form {
    public function addApplication($nejakeArgumenty) {
    }
}

Děkuji za odpověď. Funguje suprově.