Po rozšíření formulářů, nelze formuláře skládat

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

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

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

Š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();

}
Vojtěch Dobeš
Gold Partner | 1316
+
0
-

A jaký kód ti vyhazuje tu chybu?

Pan Dobrman
Člen | 45
+
0
-

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

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)