Přidání jednoho prvku z Container-u do formuláře

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

Lze nějakým způsobem vytvořit Container, kde si nadefinuji formulářové prvky a poté je z něj ty prvky mohu vytáhnout a přiřadit do formuláře?

Takhle cca vypadá ve zkratce Car Container.

class CarContainer extends Nette\Forms\Container {
    public function __construct() {
        parent::__construct();
        $this->monitor('Nette\Forms\Form');
    }
    protected function attached($obj) {
        parent::attached($obj);
        if ($obj instanceof \Nette\Forms\Form) {
            $this->configure();
        }
    }
    protected function configure() {
	$this->addText('name', 'Name:');
	$this->addSelect('type', array(...));
    }
}

Rád bych, aby se komponenty z CarContaineru daly vytáhnout nějakým podobným způsobem:

class TestForm extends Nette\Application\UI\Form{
    function __construct() {
	$car = new CarContainer;
	$this->addCompomnent('type', $car['type']);
	}
}

Takto to ale nelze, pač se vyhodí chyba: „Component ‚type‘ already has a parent.“.

(pozn.: Nechci přiřadit celý CarContainer, ale jen některé jeho prvky.)

Editoval czm4rty (2. 4. 2013 13:35)

jiri.pudil
Nette Blogger | 1032
+
0
-

Nepomohlo by

$this->addCompomnent('type', clone $car['type']);

?

czm4rty
Člen | 29
+
0
-

Teď to hlásí: Component ‚type‘ is not attached to ‚Nette\Forms\Form‘.

David Matějka
Moderator | 6445
+
0
-

jestli nepotrebujes ten container, tak bych to resil spis nejak takhle:

class CarInputsFactory
{
	public function createNameInput()
	{
		$input = new TextInput;
		...
		return $input;
	}
}

//a form:
$factory = new CarInputsFactory;
$form = new Form;
$form['name'] = $factory->createNameInput();
czm4rty
Člen | 29
+
0
-

@matej21 Díky za tvé řešení, já právě potřebuji občas použít celý Container, někde zas jen část…

David Matějka
Moderator | 6445
+
0
-

tak to bych tam do toho CarInputsFactory dal metodu treba createContainer s nejakym takovymhle obsahem:

public function createContainer()
{
	$container = new Container();
	$container['name'] = $this->createNameInput();
	...
	return $container;
}
czm4rty
Člen | 29
+
0
-

Když těch komponent bude hodně, tak se upíšu. Ale tak když to nejde, tak to nejde. NEvadí. V každým případě díky za odpovědi.

Editoval czm4rty (2. 4. 2013 21:41)

Šaman
Člen | 2666
+
0
-

Když potřebuješ jen část, tak nepotřebuješ kontejner. Kontejner chápu jako skupinu inputů, které patří k sobě a vlastně tak trochu tvoří samostatný i když složený input (třeba adresa).
Jestli tím chceš řešit jednotnou definici polí, které se mohou vyskytovat jak v kontejneru, tak samostatně, tak bych si je nejprve v nějaké třídě definoval a pak z nich jen poskládal ten kontejner, nebo je umístil do formuláře.

Editoval Šaman (2. 4. 2013 22:18)