zpracovani dat ve formulari (addHidden problem)

adferg
Člen | 31
+
0
-

Ahoj, resim takovou zapeklitost a nezbyva mi nez pozadat o radu :). Jde mi o toto: Vysledkem je, ze predlozim uzivateli otazku k tomu nabidnu tri mozne odpovedi formou radio listu. Toto se taha z databazeravne odpovedi. A ted k problemum:

Takhle vypada muj presenter.

	protected function createComponentQuestionForm(): Form
	{
		$numOfQuestions = $this->questionsManager->getNumOfQuestions(); //zjisti, kolik otazek je v databazi

		$randomNumber = $this->questionsManager->getRandomNumber($numOfQuestions); // vygeneruje nahodne cislo otazky

		$questionAll = $this->questionsManager->getQuestion($randomNumber); // vezme z databaze zaznam s otazkou a odpovedmi

		$answers = ['1' => $questionAll->answer1, '2' => $questionAll->answer2, '3' => $questionAll->answer3]; //pole s odpovedmi do radio listu


		$form = new Form;

		$form->addRadioList('answers', '', $answers) // radio list s navrhy odpovedi
			->setRequired();

		$form->addHidden('correctAnswer', $questionAll->correct_answer); // tady se snazim ziskat cislo spravne odpovedi

		$form->addSubmit('send', 'Odpověď');

		$form->onSuccess[] = [$this, 'formSucceeded'];

		return $form;
	}

	public function formSucceeded(Form $form, $data): void
	{
		bdump($data->correctAnswer); // tady mi to bdumpuje prazdny retezec a ne cislo otazky
	}
  1. nevim, jak poslat do sablony otazku, kdyz ji ziskavam z databaze az ve formulari
  2. nevim, jak do vyhodnoceni formularovych dat predat cislo se spravnou odpovedi

Dekuju a vazim si vsech rad.

aha009
Člen | 50
+
0
-

Ahoj,
asi bych to udělal takto:
1.

	protected function createComponentQuestionForm(): Form
	{
		$question = $this->questionsManager->getQuestion($randomNumber);
		$answers = $this->questionsManager->getAnswer('question_id = ?', $question);

        $form->addRadioList('answers', $question , $answers)
        ->setRequired();

2. V DB bych si udělal sloupec, kde bych označil správné odpovědi.

	public function formSucceeded($form, array $values): void
	{
		bdump($values['answers']);
	}

https://doc.nette.org/…rms/controls#…

adferg
Člen | 31
+
0
-

aha009 napsal(a):

Ahoj,
asi bych to udělal takto:
1.

	protected function createComponentQuestionForm(): Form
	{
		$question = $this->questionsManager->getQuestion($randomNumber);
		$answers = $this->questionsManager->getAnswer('question_id = ?', $question);

        $form->addRadioList('answers', $question , $answers)
        ->setRequired();

2. V DB bych si udělal sloupec, kde bych označil správné odpovědi.

	public function formSucceeded($form, array $values): void
	{
		bdump($values['answers']);
	}

https://doc.nette.org/…rms/controls#…

Aha, diky, tohle vlastne mam a funguje mi to. Co jsem resil je, ze nevim jak predat ty data z databaze do toho callbacku, abych mohl overit, ze se shoduje volba radiolistu a spravna odpoved. Zkousel jsem to pres addHidden. Podle ruznych postupu co jsem nasel jsem pochopil, ze by to mohlo vypadat addHidden(‚nazev‘, $hodnota), ale bdump(‚nazev‘) vraci jen prazdny string.

Ale je mozny, ze to mam cely postaveny blbe a dela se to jinak

Editoval adferg (24. 8. 2021 10:55)

Michal Kumžák
Člen | 106
+
0
-

Možnosti:

  1. Přes addHidden si tam posílej číslo otázky a ve formSucceeded si to můžeš vyhodnotit dotazem do $this->questionsManager.
  2. Načítej odpovědi se skutečnými ID v DB a následně ve formSucceeded se zeptej v $this->questionsManager zda je ID odpovědi správné.