Zanořený multiplier v dalším multiplieru – defaultní hodnota
- MikKuba
- Člen | 83
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 | 83
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)