více stejných komponent s různým id

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

Potřebuji několik stejných formulářů na jedné stránce, ovšem s rozdílnou skrytou položkou id. Vytvořil jsem si tedy komponentu:

<?php
class Rate extends Control {

    private $id_t;

    protected function createComponentRateForm() {
        $form = new MyForm;
        $form->getElementPrototype()->class('ajax');
        $stars = array(
            '20' => '1',
            '40' => '2',
            '60' => '3',
            '80' => '4',
            '100' => '5',
        );
        $form->addRadioList('star', 'Hodnocení', $stars)
                ->getControlPrototype()->setClass('');
        $form->addHidden('b_id')->setDefaultValue($this->id_t);

        $form->addSubmit('save', 'Ohodnotit');
        $form->onSubmit[] = callback($this, 'processRatingForm');

        return $form;
    }

    public function processRatingForm(Form $form) {
        $values = $form->getValues();
        $this->flashMessage($values['star']);
        if($values['star']=='')$values['star']=0;
        $this->reputationModel->userRating($values['b_id'], $values['star']);
        if (!$this->isAjax())
            $this->redirect('this');
        else {
            $this->invalidateControl('hodnoceni');
        }
    }

    public function render($id_t) {
        $this->id_t = $id_t;
        echo $this['rateForm'];

    }
}
?>

V prezenteru pak mam:

<?php
        public function createComponentRate(){
          $rate = new Rate;
          return $rate;
	}
?>

V šabloně pak mám v cyklu:
{control rate $r->b_id}

U všech mi to ovšem vloží stejné id, konkrétně první položky. Kdysi jsem podobnou věc vyřešil, že id bylo součástí názvu komponenty, jejíž název jsem pak parsoval, ovšem takhle by to bylo asi o dost pěknější, jenže bohužel nefunkční :) Jakoukoliv radu, případně i jiný způsob, jak by se to dalo dělat, uvítám :)

srigi
Nette Blogger | 558
+
0
-

Dovodom preco sa to nenastavi je zivotny cyklus. V render fazi (ked sa lazy sposobom vytvori komponenta a zaroven Form) je uz neskoro na nastavenie setDefaultValue($this->id_t). Budes sa asi musiet vzdat lazy sposobu natahovania componenty Rate a zapisat to explicitne v Presenteri do nejakej jej property.

Zaroven vsak potom mozes zjednodusit kod a zjednodusit volanie Presenter => Rate => RateForm na Presenter => RateForm.

BTW precitaj si toto vlakno

Editoval srigi (22. 1. 2011 21:33)