Problém s validací při použití low-level formuláře

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

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
+
+2
-

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)

Kor3ik
Člen | 5
+
0
-

Děkuji za radu ;). Ještě takový menší dotaz jak nastavit/upravit , aby se mi otázky zobrazovaly nad možnostmi?
Tvz.:
Otázka
1) možnost A
2) možnost B
3) …

Editoval Kor3ik (25. 5. 2016 12:45)