Vložení hotového kontejneru do dané skupiny

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

Zdravím, řeším zdánlivě jednoduchý problém, vložit hotový container do formuláře se skupinami na správné místo. Zkoušel jsem využít argument insertBefore u addComponent (dočetl jsem se však, že nefunguje ve spojení se skupinami) nebo i setCurrentGroup pro celý container, ale vše se stejným výsledkem – tedy že všechny prvky containeru se vykreslí až za vším ostatním.

Ukázkový kód:

	// this je potomek třídy Form
	$this->addGroup("Kontaktní údaje");
	$this->addText('phone', "Telefon");

	$contactAddrGroup = $this->addGroup("Kontaktní adresa");
	$this['address'] = new Containers\AddressContainer();
	$this['address']->setCurrentGroup($contactAddrGroup); // no effect

	$this->addGroup();
	$this->addSubmit('submit', "Uložit");

Je tedy nějaký způsob jak toto (elegantně) vyřešit?

Casper
Člen | 253
+
0
-

Tak nakonec vyřešeno už ve třídě kontejneru:

class AddressContainer extends \Nette\Forms\Container {
	public function __construct($form, $addToGroup = NULL) {
		parent::__construct();
		$this->setCurrentGroup($form->getGroup($addToGroup));
		$this->addText('city', "Město");
	}
}
kedrigern
Člen | 102
+
0
-

Tvoje řešení jsem pochopil takto:

class part extends Nette\Forms\Container
{
  public function __construct($form, $addToGroup = NULL)
  {
    parent::__construct();
    $this->setCurrentGroup($form->getGroup($addToGroup));
    $this->addText("street", "Ulice:");
  }
}

class formular extends Nette\Application\UI\Form
{
  public function __construct()
  {
    parent::__construct();
    $group = $this->addGroup("Adresa");
    $this['address'] = new AddressForm($this, $group);

    $this->addGroup("Doplňující údaje");
    $this->addText("tel", "Telefon:");
  }
}

Nicméně to se chová zcela jako, kdybych s těmi skupinami nic nedělal – skupina Adresa se nezobrazí a celý Container je až úplně na konci formuláře.

Dle https://api.nette.org/…ms/Form.html#… tam je však chyba, getGroup přijímá string a ne třídu Nette\Forms\ControlGroup, kterou vrací addGroup (https://api.nette.org/…ms/Form.html#…).

No vyzkoušel jsem různé kombinace, ale mě se to tedy nedaří. Mohl bych poprosil o ukázku celých tříd?

Horyczech
Člen | 6
+
0
-

Mno, ten priklad je postaven tak, ze predas nazev groupy:

class AddressForm extends Nette\Forms\Container
{
  public function __construct($form, $addToGroup = NULL)
  {
    parent::__construct();
    $this->setCurrentGroup($form->getGroup($addToGroup));
    $this->addText("street", "Ulice:");
  }
}

class formular extends Nette\Application\UI\Form
{
  public function __construct()
  {
    parent::__construct();
    $group = $this->addGroup("Adresa");
    $this['address'] = new AddressForm($this, "Adresa");

    $this->addGroup("Doplňující údaje");
    $this->addText("tel", "Telefon:");
  }
}

Po tvem by to bylo takto:

class AddressForm extends Nette\Forms\Container
{
  public function __construct($addToGroup = NULL)
  {
    parent::__construct();
    $this->setCurrentGroup($addToGroup);
    $this->addText("street", "Ulice:");
  }
}

class formular extends Nette\Application\UI\Form
{
  public function __construct()
  {
    parent::__construct();
    $group = $this->addGroup("Adresa");
    $this['address'] = new AddressForm($group);

    $this->addGroup("Doplňující údaje");
    $this->addText("tel", "Telefon:");
  }
}

Editoval Horyczech (9. 8. 2012 19:14)

Filip Procházka
Moderator | 4668
+
0
-

Doporučoval bych ti použít raději to řešení co mám zde pod čarou, protože to omezí duplikování kódu a vypadá to o dost lépe ;)