removeGroup() ktera obsahuje Container zpusobi vyjimku
- toretak
- Člen | 6
V aktualní verzi Nette (2.0.3 revize eb558ae) jsem narazil na problém s odebráním groupy, která obsahovala Container.
Upravil jsem aktualní implementaci https://github.com/…rms/Form.php#L266
na
<?php
public function removeGroup($name){
if (is_string($name) && isset($this->groups[$name])) {
$group = $this->groups[$name];
} elseif ($name instanceof ControlGroup && in_array($name, $this->groups, TRUE)) {
$group = $name;
$name = array_search($group, $this->groups, TRUE);
} else {
throw new Nette\InvalidArgumentException("Group not found in form '$this->name'");
}
foreach ($group->getControls() as $control) {
if($control->parent instanceof \Nette\Forms\Container){
if(isSet($this->components[$control->parent->getName()])) $this->removeComponent($control->parent);
}else{
$this->removeComponent($control);
}
}
unset($this->groups[$name]);
}
?>
tedy v případě, že rodič nějakého prvku je Container odebere se rodič, nikoli prvek samotný. Groupa totiž neví, že obsahuje Container a zná pouze Controly.
Možná jsem něco přehlédl, ale zdá se mi, že se jedná o drobnou chybičku.
- Filip Procházka
- Moderator | 4668
To určitě není správně. V jednom containeru můžou být prvky v několika různých skupinách.
- toretak
- Člen | 6
HosipLan napsal(a):
To určitě není správně. V jednom containeru můžou být prvky v několika různých skupinách.
V tom případě by bylo vhodné doplnit alespoň kontrolu existence komponenty pred jejím odebráním, aby bylo možné odebrat prvky ručně.
Editoval toretak (19. 7. 2012 11:45)
- Filip Procházka
- Moderator | 4668
Správně takto
foreach ($group->getControls() as $control) {
$control->parent->removeComponent($control);
}
Pošleš si pullrequest, nebo to mám udělat já? :)