Zanořený multiplier v dalším multiplieru – defaultní hodnota

MikKuba
Člen | 76
+
0
-

Ahoj,

Mám funkční multiplier a další v něm zanořený (typicky člověk si vytvoří libovolný počet otázek a ke každé otázce libovolný počet odpovědí), vše funguje pro vytváření.
Jenže problém nastává při editaci a načtení hodnot z DB.
Pro úroveň otázek mi to funguje, horší to už je ale s přiřazením odpovědí k jednotlivým otázkám. Stejný princip jako pro odpovědi mi nefunguje správně (= otázky se skládají do pole a postupně vypisují, jenže odpovědi se mi taky naskládají do jednoho pole, takže potom mám pod každou otázkou výpis všech odpovědí bez rozlišení ⇒ když mám 3 otázky a u každé 3 odpovědi uložené, tak při načtení editace mám 3 otázky a u každé 9 stejných odpovědí). Takže odpovědi si natahuji do dvourozměrného pole, klíčem je ID otázky, to je v pohodě.
Nedaří se mi při iterování nad těmi otázkami v multiplieru dosadit proměnnou ID otázky, abych z pole odpovědí vytáhl příslušnou sadu odpovědí.

protected $questions = [];
protected $answers = [];

protected function createComponentForm()
{
//......
$questions = $form->addMultiplier('questions', function (\Nette\Forms\Container $container, Form $form) {
                                                $container->addHidden('id');
                                                $container->addText('question', 'Otázka')
                                                        ->setAttribute('class', 'form-control');
                                                $container->addCheckbox('required', 'Povinná otázka')
                                                        ->setAttribute('class', 'form-control');
                                                $container->addText('points', 'Počet bodů')
                                                        ->addRule(Form::FLOAT)
                                                        ->setRequired()
                                                        ->setAttribute('class', 'form-control');
                                                $answers = $container->addMultiplier('answers', function (\Nette\Forms\Container $container, Form $form) {
                                                        $container->addText('answer', 'Odpověď')->setAttribute('class', 'form-control');
                                                        $container->addCheckbox('right', '')->setAttribute('class', 'form-control');
                                                }, 1, 10);
                                                $answers->addRemoveButton('X', function (Nette\Forms\Controls\SubmitButton $submitter) {
                                                                $submitter->setValidationScope(false);
                                                });
                                                $answers->addCreateButton('+ Přidat odpověď');
                                                dump($container);
                                                $answers->setValues($this->answers[$container->id]);
                                            }, 1, 10);
                        $questions->addRemoveButton('Smazat otázku', function (Nette\Forms\Controls\SubmitButton $submitter) {
                                        $submitter->setValidationScope(false);
                        });
                        $questions->addCreateButton('+ Přidat otázku');
                        $questions->setValues($this->questions);
}


public function load($id){
                        $this->id = $id;
                        $data = $this->getData($id);
                        $questions = $this->getQuestions($id);
                        foreach($questions as $question){
                                $this->questions[] = [
                                        'id' => $question->id,
                                        'question' => $question->question,
                                        'required' => $question->required,
                                        'points' => $question->points
                                ];
                                foreach(Json::decode($question->answers) as $answer){
                                        $this->answers[$question->id][] = [
                                                'answer' => $answer->value,
                                                'right' => $answer->right
                                        ];
                                }
                        }
                        $this['form']->setDefaults($data->toArray());
                }

Předem díky za jakékoliv tipy! :)

MikKuba
Člen | 76
+
0
-

VYŘEŠENO:
Hmmm, tak jsem nemusel psát a stačilo chvíli zkoušet, nicméně se podělím s řešením, případně mi můžete dát feedback zda to není třeba nějaké úplně shit řešení :)

Vystačil jsem si s jedním polem pro formulář, kdy nejprve naplním vše takto:

public function load($id){
         $this->id = $id;
         $data = $this->getData($id);
         $questions = $this->getQuestions($id);
         foreach($questions as $question){
                 foreach(Json::decode($question->answers) as $answer){
                       $this->answers[$question->id][] = [
                                  'answer' => $answer->value,
                                  'right' => $answer->right
                       ];
                 }
                 $this->questions[] = [
                             'id' => $question->id,
                             'question' => $question->question,
                             'required' => $question->required,
                             'points' => $question->points,
                             'answers' => $this->answers[$question->id]
                 ];

          }
          $this['form']->setDefaults($data->toArray());
}

No a potom ve formuláři nevolám načítání uvnitř zanořeného multiplieru, ale jen zavolání pole po vypsání všech multiplierů, takže jen tu část ve formuláři jsem ponechal:

$questions->setValues($this->questions);

Editoval MikKuba (18. 10. 2020 17:33)