Form::removeGroup()

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Jan Tvrdík
Nette guru | 2595
+
0
-

Pokus o opravu Form::removeGroup z revize 476. Ještě by to měl ale někdo překopat a hlavně celé pořádně překontrolovat.

	/**
	 * Remove fieldset group from form.
	 * @param  string|FormGroup
	 * @return void
	 */
	public function removeGroup($name)
	{
		if (is_string($name) && isset($this->groups[$name])) {
			$group = $this->groups[$name];

		} elseif ($name instanceof FormGroup) {
			$group = $name;
			$name = $group->getOption('caption');
			if (!isset($name)) {
				$name = array_search($group, $this->groups);
				if ($name === FALSE) {
					throw new InvalidArgumentException("Group not found in form '$this->name'");
				}
			}

			if (!isset($this->groups[$name])) {
				throw new InvalidArgumentException("Group '$name' not found in form '$this->name'");
			}

		} else {
			if (is_string($name))
				throw new InvalidArgumentException("Group '$name' not found in form '$this->name'");
			else
				throw new InvalidArgumentException("Group not found in form '$this->name'");
		}

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

		unset($this->groups[$name]);
	}

Editoval Jan Tvrdík (6. 8. 2009 9:18)

PetrP
Člen | 587
+
0
-

A co rovnou podobně rozšířit i FormContainer::setCurrentGroup() aby se mu mohl taky dát i název groupy

	/**
	 * @param  FormGroup|string
	 * @return void
	 */
	public function setCurrentGroup($group = NULL)
	{
		if ($group === NULL) {
			$this->currentGroup = NULL;

		} else if ($group instanceof FormGroup) {
			$this->currentGroup = $group;

		}	else if (is_string($group) AND $form = $this->getForm(FALSE)) {

			$formGroup = $form->getGroup($group);

			if (isset($formGroup)) {
				$this->currentGroup = $formGroup;

			} else {
				throw new InvalidArgumentException("Group '$group' not found in form '$form->name'");
			}
		} else {
			throw new InvalidArgumentException("Expected FromGroup, '".(is_object($group)?get_class($group):gettype($group))."' given.");
		}
	}
romansklenar
Člen | 655
+
0
-

Jan Tvrdík: Zbytečně komplikované a taky jsou tam chyby.

Překvapilo mě, že taková metoda ve formulářích není. Pak mi ale došlo, proč nejspíše David tuto metodu neimplementoval a to jsou nepojmenované skupiny.

$form->addGroup();
$form->addGroup('group');
$form->addGroup();

Není je podle čeho odstranit. S tím se budem muset smířit. Celé by to mohlo vypadat takto:

	/**
	 * Remove fieldset group from form.
	 * @param  string|FormGroup
	 * @return void
	 */
	public function removeGroup($name)
	{
		if ($name instanceof FormGroup) {
			$name = $name->getOption('label');
		}

		if ($name === NULL) {
			throw new InvalidArgumentException("Name of group must be given, non-named groups cannot be removed.");
		}

		$group = $this->getGroup($name);

		if (!$group instanceof FormGroup) {
			throw new InvalidArgumentException("Group '$name' not found in form '$this->name'");
		}

		if ($this->currentGroup === $group) {
			$this->setCurrentGroup();
		}

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

		unset($this->groups[$name]);
	}
LM
Člen | 206
+
0
-

A co takhle?

public function removeGroup($group)
{
        if ($group instanceof FormGroup) {
		foreach ($this->groups as $name => $tmp) {
			if ($group === $tmp) break;
		}

		throw new *Exception(...);

        } else {
		$name = $group;
	}

	...
}

Editoval LM (6. 8. 2009 15:01)

romansklenar
Člen | 655
+
0
-

No jasně to by šlo! …dneska už bych neměl nic dělat :)