Problém s validací při použití low-level formuláře
- Kor3ik
- Člen | 5
Zdravím, chtěl bych se zeptat, jestli by si nikdo nevěděl rady, jak pokračovat dále. Jedná se o tvorbu dotazníku. Otázky a možnosti generuji z databáze. Předem netuším kolik jich bude, proto jsem zvolil metodu „low-level formulář“. V šabloně jsem si bez problému vygeneroval otázky a možnosti, kterým jsem přiřadil „radio“ viz. přiložení kód.
Šablona
{foreach $questions as $question}
<h2>{$question->otazka}</h2>
<h3><input type=checkbox name="sel[{$question->otazka_id}]" value={$question->otazka_id}> {$question->answerA}</h3>
<h3><p><input type=checkbox name="sel[{$question->otazka_id}]" value={$question->otazka_id}>{$question->answerB}</p></h3>
<h3><p><input type=checkbox name="sel[{$question->otazka_id}]" value={$question->otazka_id}>{$question->answerC}</p></h3>
{/foreach}
{control odeslani}
Ale nemůžu přijít na to, jak dát talčítku, aby při stisku zkontrolovalo, jestli jsou označené radiolisty u každé otázky (jen jedna správná odpověď) a následně uložila počet označeních odpovědí u každé otázky do nové vytvořené databáze.
Presenter
<?php
namespace App\Presenters;
use App\Model\DotaznikManager;
use App\Presenters\BasePresenter;
use Nette\Application\BadRequestException;
use Nette\Database\UniqueConstraintViolationException;
use Nette\Utils\ArrayHash;
class StudentPresenter extends BasePresenter
{
/** @var \PostsRepository */
protected $dotaznikManager;
/**
* Konstruktor s injektovaným modelem pro práci.
* @param DotaznikManager $dotaznikManager automaticky injektovaná třída modelu pro práci
*/
public function __construct(DotaznikManager $dotaznikManager)
{
parent::__construct();
$this->dotaznikManager = $dotaznikManager;
}
protected function createComponentOdeslani()
{
$form = new Form();
$form->addSubmit('odeslat', 'Odeslat');
$form->onSuccess[] = array($this, 'saveAnswers');
return $form ;
}
// volá se po úspěšném odeslání formuláře
public function saveAnswers($form)
{
/* @var $values type */
$values = $form->getHttpData($form::DATA_TEXT | $form::DATA_KEYS, 'sel[]');
}
/**
* Odesílá data do šablony s názvem Student
*/
public function renderStudent()
{
$this->template->questions = $this->dotaznikManager->getDotazniky();
}
}
?>
Model
<?php
namespace App\Model;
use App\Model\BaseManager;
use Nette\Database\Table\IRow;
use Nette\Database\Table\Selection;
use Nette\Utils\ArrayHash;
/**
* Třída poskytuje metody pro správu dotazníků
* @package App\Model
*/
class DotaznikManager extends BaseManager
{
/** Konstanty pro manipulaci s modelem. */
const
TABLE_NAME = 'question',
COLUMN_ID = 'otazka_id',
COLUMN_QUESTION = 'otazka';
/**
* Vrátí seznam z databáze.
* @return Selection seznam otázek
*/
public function getDotazniky()
{
return $this->database->table(self::TABLE_NAME)->order(self::COLUMN_ID. ' ASC');
}
}
?>
Předem děkuji za odpovědi.
- David Matějka
- Moderator | 6445
Na low-level formulare se vykasli, tady nejsou potreba :) Ty otazky si vytahni tak, aby uz byly dostupny v createComponent metode (tedy nejlepe presun ten dotaz na manager do action, tam si vysledek ulozis do tridni promenne a potom v renderu to posles do sablony)
V createComponent pak akorat iterujes nad tim vysledkem a pridas pro kazdou otazku checkboxlist (nebo radiolist dle potreby)