[BUG] Odebrání groupy, jejíž prvky jsme odebrali z formuláře, způsobí výjimku

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
_Martin_
Generous Backer | 679
+
0
-

Ahoj,
pokud si definuji formulář a použiji groupy, následně odeberu prvek, který je v nějaké groupě a následně i tu groupu, dojde k výjimce. Jde o to, že groupa si uchovává reference na komponenty, takže pokud jí odeberu z formuláře, zůstane instance u groupy – a při odebrání groupy se formulář pokusí odebrat komponentu, kterou v sobě už vlastně nemá.

Řešením je testování (stejně jako při vykreslování v ConventionalRendereru), zda je komponenta přiřazena k danému formuláři. Tj. v metodě Form::removeGroup změnit:

foreach ($group->getControls() as $control) {
	$this->removeComponent($control);
}

na

foreach ($group->getControls() as $control) {
	if($control->getForm(FALSE) === $this) {
		$this->removeComponent($control);
	}
}
David Grudl
Nette Core | 8228
+
0
-

Možná by bylo ještě rozumnější tam dát

			if ($control->getParent()) {
				$control->getParent()->removeComponent($control);
			}