formulář v samostatné komponentě

trta911
Člen | 32
+
0
-

Ahoj, mám drobný problém s daty formuláře po odeslání.
Mám samostatnou komponentu:

use Nette\Application\UI;
use Nette\Application\UI\Form;
use Nette\Http\Url;


class PollControl extends UI\Control
{

    private $database;

    private $questions;

    public $pollID;


    public function __construct( \Nette\Database\Context $database)
    {
        $this->database = $database;
    }


    public function render($pollID)
    {
        $poll = $this->database->table('poll')->where('id',$pollID)->where('enabled',1)->limit(1)->fetch();
        $pollQ = $this->database->table('poll_question')->where('poll_id',$poll->id)->fetchPairs('id','question');

        $this->pollID = $pollID;
        $this->questions = $pollQ;

            $this->template->poll = $poll;
            $this->template->render(__DIR__ . '/PollControl.latte');

    }

    protected function createComponentPollForm()
    {
        $form = new Form;
        $form->addRadioList('question','',$this->questions);
        $form->addSubmit('submit', 'Hlasovat');
        $form->onSuccess[] = [$this, 'pollSuccess'];

        return $form;
    }

    public function pollSuccess(Form $form)
    {
        $values = $form->getValues();
        $data = [
            'ip' => '987.654.321',
            'poll_id' => 1,
            'poll_question_id' => $values['question']
        ];
    }


}

a problém je, že po odeslání formuláře se sice provede, ale měl by vrátit vyplněnou hodnotu question (pro další zpracování) ale tu vrací null. Už do toho čumím dlouho, kde prosím dělám chybu?

divispet
Člen | 29
+
0
-

Ahoj,

metoda pollSuccess(Form $form) vypadá ok. Nebude chyba někde v latte šabloně?

David Matějka
Moderator | 6445
+
+3
-

Proměnou questions naplnujes až v render metodě. To je sice při vykreslování ok, ale nikoliv už při zpracování, jelikož i v okamžiku zpracování musí být formulář vytvořen identicky – tedy se stejnými fieldy a v případě select, radiolistu atd. i se stejnými options.

Ale bohužel ti do toho trochu háže vydle to, že si id ankety předáváš ze šablony (osobně doporučuji nikdy nepredavat parametry ze šablony do komponenty.
Pokud máš tu anketu na stránce jen jednu a už v presenteru znáš její id, tak jej predej přímo v createComponent do komponenty. Pokud jich vykreslujes víc (třeba přes foreach), tak použij multiplier