Vlastní formulářový prvek tak, aby šlo použít $form->addMyInput()

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

Zdravím, vytvořil jsem si několik formulářových prvků, které plánuji na jednom projektu používat ve větší míře. Prozatím jsem je používal pouze ve stylu

$form['date'] = new DateInput('Date:');
$form['date']->setDefaultValue(new DateTime);

Ale rád bych je používal jako „normální“ prvky:

$form->addMyInput(...);

Což mě zavedlo do třídy Nette\Forms\Container, kde pokud hodím něco jako tohle, tak to funguje v pořádku.

public function addMyInput($name, $label = NULL, $cols = NULL, $maxLength = NULL) {
	$control = new Controls\MyInput($label, $maxLength);
	$control->setAttribute('size', $cols);
	return $this[$name] = $control;
}

Samozřejmě, tohle asi není ideální, takže jsem si vytvořil „MyContainer“, který jsem podědil z „Container“ a tam přidal tuhle metodu.

Otázka tedy zní, jestli na to jdu správně a pokud ano, tak jak donutit Nette, aby bral můj „MyContainer“ místo toho defaultního? :)

David Matějka
Moderator | 6445
+
0
-

Muzes pouzit rozsirujici metody, viz treba pouziti v replicatoru

akadlec
Člen | 1326
+
0
-

Asi ideální postup je si ten registrátor přidat do jednotlivých Control prvků a ty pak registrovat.

class TvujNovyControl extends Forms\Controls\TextInput
{
	public static function register($method = 'addCokoliv')
	{
		$class = function_exists('get_called_class')?get_called_class():__CLASS__;
		\Nette\Forms\Container::extensionMethod(
			$method, function (\Nette\Forms\Container $form, $name, $label = NULL) use ($class) {
				$component = new $class($label);
				$form->addComponent($component, $name);
				return $component;
			}
		);
	}
}
Mysteria
Člen | 797
+
0
-

Díky vám oběma. :)