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
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? :)
- akadlec
- Člen | 1326
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;
}
);
}
}