Formulář – vložení tlačítek do divu – nelze volat getControl

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

Dobrý den, mám třídu která mi sdružuje tlačítka formuláře a chci je všechny vykreslit do div. narazil jsem na problém že nemůžu volat getControl(). hlásí to Component '' is not attached to ‚Nette\Forms\Form‘.
takto vypadá kod:

class ButtonGroup extends BaseControl{

    /** @var MyButton[] */
    private $buttons;

    public function __construct() {
        parent::__construct(null);
    }

    /**
     * @param MyButton[] $buttons
     * @return ButtonGroup
     */
    public function setButtons($buttons) {
        $this->buttons = $buttons;
        return $this;
    }

    /**
     * @param MyButton $button
     * @return ButtonGroup
     */
    public function addMyButton(MyButton $button){
        $this->buttons[] = $button;
        return $this;
    }

    public function getControl() {
        $wrapper = Html::el('div class="btn-group"');
        foreach ($this->buttons as $button) {
            $wrapper->add($button->getControl());
        }
        return $wrapper;
    }


}

Objekt MyButton jsou potomek třídy Nette\Forms\Controls\Button.
díky za radu.

Azathoth
Člen | 495
+
0
-

A jak vypadá celý formulář? Skoro to vypadá, že to nemůže najít ta tlačítka v instanci formuláře, který jsi vytvořil.

bluray
Člen | 178
+
0
-

Mám třídu která dědí od Form:

class MyForm extends Nette\Application\UI\Form{

       public function addButtonGroup($name, array $buttons){
        $control = new ButtonGroup();
        $control->setButtons($buttons);
        $this[$name] = $control;
        return $control;
    }
}

A v presenteru pak mám toto:

public function createComponentPokusForm(){
	$form = new MyForm();
	$form->addButtonGroup("tlacitka", [new MyButton("Button1"), new MyButton("Button2")]);
}
Unlink
Člen | 298
+
0
-

Problém je podľa mňa v tom, že tie tvoje buttony niesu pripojené ku formuláru a teda na nich nemôžeš volať tú metódu getControl() ale ako to spraviť ma nenapadá

bluray
Člen | 178
+
0
-

Co znamená že nejsou připojené k formuláři?

Unlink
Člen | 298
+
0
-

To by chcelo názor niekoho kto sa do toho viac vyzná, načo tlačidlo potrebuje formulár.

Ale formulár ako taký je komponenta ktorá je zložená z ďalších komponent (používa sa nette component model)
Pri každom volaní $form->addNeco sa komponenta pripojí do stromu komponent.

BaseControl má metódu getForm ktorá získa form ku ktorému je komponenta pripojená a keď nieje nikde pripojená tak vyhadzuje tú výnimku.
https://api.nette.org/…rol.php.html#110

A tak už viem
https://api.nette.org/…rol.php.html#140
tuna je potrebné aby to bolo pripojené ku formuláru, aby vedelo vygenerovať idčko.

Editoval Unlink (29. 6. 2015 15:00)

bluray
Člen | 178
+
0
-

aháá už tomu rozumím. já ty MyButton musím přidávat do formuláře aby získaly ID. takže já můžu volat $form->addButton a nakonec bych mohl zavolat $form->addButtonGroup a v té metodě bych nějak ze stromu komponent formuláře získal část kde jsou buttony…