Vložení hotového kontejneru do dané skupiny
- Casper
- Člen | 253
Zdravím, řeším zdánlivě jednoduchý problém, vložit hotový container do formuláře se skupinami na správné místo. Zkoušel jsem využít argument insertBefore u addComponent (dočetl jsem se však, že nefunguje ve spojení se skupinami) nebo i setCurrentGroup pro celý container, ale vše se stejným výsledkem – tedy že všechny prvky containeru se vykreslí až za vším ostatním.
Ukázkový kód:
// this je potomek třídy Form
$this->addGroup("Kontaktní údaje");
$this->addText('phone', "Telefon");
$contactAddrGroup = $this->addGroup("Kontaktní adresa");
$this['address'] = new Containers\AddressContainer();
$this['address']->setCurrentGroup($contactAddrGroup); // no effect
$this->addGroup();
$this->addSubmit('submit', "Uložit");
Je tedy nějaký způsob jak toto (elegantně) vyřešit?
- kedrigern
- Člen | 102
Tvoje řešení jsem pochopil takto:
class part extends Nette\Forms\Container
{
public function __construct($form, $addToGroup = NULL)
{
parent::__construct();
$this->setCurrentGroup($form->getGroup($addToGroup));
$this->addText("street", "Ulice:");
}
}
class formular extends Nette\Application\UI\Form
{
public function __construct()
{
parent::__construct();
$group = $this->addGroup("Adresa");
$this['address'] = new AddressForm($this, $group);
$this->addGroup("Doplňující údaje");
$this->addText("tel", "Telefon:");
}
}
Nicméně to se chová zcela jako, kdybych s těmi skupinami nic nedělal – skupina Adresa se nezobrazí a celý Container je až úplně na konci formuláře.
Dle https://api.nette.org/…ms/Form.html#… tam je však chyba, getGroup přijímá string a ne třídu Nette\Forms\ControlGroup, kterou vrací addGroup (https://api.nette.org/…ms/Form.html#…).
No vyzkoušel jsem různé kombinace, ale mě se to tedy nedaří. Mohl bych poprosil o ukázku celých tříd?
- Horyczech
- Člen | 6
Mno, ten priklad je postaven tak, ze predas nazev groupy:
class AddressForm extends Nette\Forms\Container
{
public function __construct($form, $addToGroup = NULL)
{
parent::__construct();
$this->setCurrentGroup($form->getGroup($addToGroup));
$this->addText("street", "Ulice:");
}
}
class formular extends Nette\Application\UI\Form
{
public function __construct()
{
parent::__construct();
$group = $this->addGroup("Adresa");
$this['address'] = new AddressForm($this, "Adresa");
$this->addGroup("Doplňující údaje");
$this->addText("tel", "Telefon:");
}
}
Po tvem by to bylo takto:
class AddressForm extends Nette\Forms\Container
{
public function __construct($addToGroup = NULL)
{
parent::__construct();
$this->setCurrentGroup($addToGroup);
$this->addText("street", "Ulice:");
}
}
class formular extends Nette\Application\UI\Form
{
public function __construct()
{
parent::__construct();
$group = $this->addGroup("Adresa");
$this['address'] = new AddressForm($group);
$this->addGroup("Doplňující údaje");
$this->addText("tel", "Telefon:");
}
}
Editoval Horyczech (9. 8. 2012 19:14)
- Filip Procházka
- Moderator | 4668
Doporučoval bych ti použít raději to řešení co mám zde pod čarou, protože to omezí duplikování kódu a vypadá to o dost lépe ;)