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

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.

PetrP
Člen | 587
+
0
-

A přidat je jako kontejnery nelze?

$searchForm['personalData'] = $personalDataForm;
$searchForm['companyData'] = $companyDataForm;
Milhauz
Člen | 26
+
0
-

To vyhazuje InvalidStateException: Component already has a parent. Z toho důvodu právě procházím všechny prvky a přidávám clone $control.

Milhauz
Člen | 26
+
0
-

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

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;
PetrP
Člen | 587
+
0
-

hm bohužel, a i kdyby neměli už rodiče tak to stroskotá na Nested forms are forbidden na Form nemůžeš připojit Form.

Řešením by asi bylo že by $personalDataForm a $companyDataForm byli FormContainer