removeGroup() ktera obsahuje Container zpusobi vyjimku

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
toretak
Člen | 6
+
0
-

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

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

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

Správně takto

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

Pošleš si pullrequest, nebo to mám udělat já? :)

toretak
Člen | 6
+
0
-

HosipLan napsal(a):

Správně takto

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

Pošleš si pullrequest, nebo to mám udělat já? :)

Tak je to Tvoje implementace :-) .. tak Ty