Po rozšíření formulářů, nelze formuláře skládat
- Pan Dobrman
- Člen | 45
Dobrý den, napsal jsem si třídu ExtendForm, která dědí od Nette\Forms\Form a která mi rozšiřuje funkčnost formulářů. Narazil jsem ale na jeden malý zádrhel. Používám skládání formulářů, které jsem našel zde (řešení pod čarou). V řešení jsem přepsal \Nette\Forms\Form na \ExtendsForm, ale při pokusu o zavolání metody z třídy ExtendsForm dostanu výjimku, že zadaná metoda neexistuje (metody z Nette\Forms\Form ale fungují).
- Vojtěch Dobeš
- Gold Partner | 1316
Pokud ti ExtendForm extenduje Nette\Forms\Container
(což je
v řešení pod čarou), tak na instanci formuláře její metody
nezavoláš.
- Pan Dobrman
- Člen | 45
Špatně jsem to popsal. ExtendForm dědí od Nette\Forms\Form, ale komponenty formulářů dědí od BaseContainer, který vypadá takto:
abstract class BaseContainer extends Nette\Forms\Container
{
public function __construct()
{
parent::__construct();
$this->monitor('\ExtendForm');
}
protected function attached($obj)
{
parent::attached($obj);
if ($obj instanceof \ExtendForm) {
$this->currentGroup = $this->form->currentGroup;
$this->configure();
}
}
abstract protected function configure();
}
- Pan Dobrman
- Člen | 45
Výjimku o nenalezené metodě vznikala, protože jsem zapomněl dědit ExtendForm. Zde je aktuální kód.
<?php
use Nette\Forms\Form;
class ExtendForm extends Form
{
public function addExtendSelect()
{
//...
}
}
abstract class BaseContainer extends ExtendForm
{
public function __construct()
{
parent::__construct();
$this->monitor('\ExtendForm');
}
protected function attached($obj)
{
parent::attached($obj); //Nette\InvalidStateException: Nested forms are forbidden.
if ($obj instanceof \ExtendForm) {
$this->currentGroup = $this->form->currentGroup;
$this->configure();
}
}
abstract protected function configure();
}
class AddressContainer extends BaseContainer
{
protected function configure()
{
$this->addExtendSelect('select');
}
}
- Filip Procházka
- Moderator | 4668
Tak si znovu zkopíruj řešení pod čarou, ale tentokrát použij CTRL+C a CTRL+V a bude ti to fungovat.
Formulářový container má jiný význam, než formulář samotný. Pokud chceš přidávat metody do obou, použij extensionMethod
Nette\Forms\Container::extensionMethod('addExtendSelect', function ($_this, $name, $arg) {
$_this[$name] = new ExtendSelect($arg);
});
Nemůžeš dědit „container“ od fomuláře a pak vkládat formulář do formuláře. Nette tohle neumí.
Editoval HosipLan (25. 8. 2012 21:37)