Spojení více formulářů do jednoho
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- Milhauz
- Člen | 26
Zdravím,
zajímalo by mě, jestli lze nějak „elegantně“ spojit více
formulářů do jednoho. V aplikaci mám například formulář pro
vytvoření/editaci osoby a společnosti. Pak mám vyhledávací formulář,
který je sloučením těchto dvou.
Momentálně to řeším přímo v presenteru tak, že si vezmu oba
formuláře, vytvořim nový a do něj přiřadím prvky těch
předchozích.
$personalDataForm = $this->getComponent('PersonalDataForm');
$companyDataForm = $this->getComponent('CompanyDataForm');
## Creates search form
$searchForm = new BaseAppForm($this, 'searchForm');
## Adds personal data controls to search form
$searchForm->addContainer('personalData');
foreach($personalDataForm->getControls() as $control) {
$searchForm['personalData']->addComponent(clone $control, $control->getName());
}
## Adds company's controls to search form
$searchForm->addContainer('companyData');
foreach($companyDataForm->getControls() as $control) {
$searchForm['companyData']->addComponent(clone $control, $control->getName());
}
Řešíte to podobně nebo zcela jinak? Díky za každou připomínku.
- Milhauz
- Člen | 26
PetrP napsal(a):
Pravda a co změnit rodiče?
$personalDataForm->setParent($searchForm);
To jsem taky zkoušel, ale stejná chyba. Metoda setParent
nastavuje rodiče komponentě, která ještě rodiče nastaveného nemá. Pokud
má, vyhodí stejnou exception, viz. úsek kódu metody
setParent
:
// A component cannot be given a parent if it already has a parent.
if ($this->parent !== NULL && $parent !== NULL) {
throw new InvalidStateException('Component already has a parent.');
}
- romansklenar
- Člen | 655
A co toto?
$personalDataForm = $this['personalDataForm'];
$companyDataForm = $this['companyDataForm'];
$this->removeComponent($personalDataForm);
$this->removeComponent($companyDataForm);
$searchForm = new BaseAppForm($this, 'searchForm');
$searchForm['personalData'] = $personalDataForm;
$searchForm['companyData'] = $companyDataForm;