addSelect vrací NULL hodnotu

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

Zdravím,
když odesílám formulář, tak se mi vyhodí error, že nemůžu do NOT NULL sloupce v databázi hodit NULL hodnotu. Z toho jsem usoudil, že formulář, když vyberu hodnotu ze selectBoxu (ano, hodnoty se mi normálně načtou) a odešlu ho, tak neuloží hodnotu vybrané hodnoty ze selectBoxu

<?php
namespace DashboardModule;

use Nette,
	Nette\Application\UI\Form;

class MessagePresenter extends BasePresenter {

	private $employeeRepository;
	private $announcementRepository;
	private $messageRepository;

	private $applicationSettings;

	private $employees;

	protected function startup() {
		parent::startup();
		$this->employeeRepository = $this->context->employeeRepository;
		$this->announcementRepository = $this->context->announcementRepository;
		$this->messageRepository = $this->context->messageRepository;

		$this->applicationSettings = $this->context->applicationSettings;
	}

	/* RENDER PRESENTERU */

	public function beforeRender() {

		if(!$this->getUser()->isLoggedIn()) {
			$this->redirect(':Front:Sign:default');
		}

		$this->template->first_name = $this->getUser()->getIdentity()->first_name;
		$this->template->last_name = $this->getUser()->getIdentity()->last_name;

		$this->employees = $this->employeeRepository->findAll()->fetchPairs('employee_id', 'last_name');

		//print_r($this->employees);

		$this->template->announcements = $this->announcementRepository->findAll();
		$this->template->appBuild = $this->applicationSettings->getAppBuild();
	}

	public function renderDefault() {
		$this->template->recivedMessages = $this->messageRepository->showRecivedMessages($this->getUser()->getIdentity()->id);
		$this->template->sentMessages = $this->messageRepository->showSentMessages($this->getUser()->getIdentity()->id);
	}

	/* KOMPONENTY */

	protected function createComponentSendMessageForm($name) {

		$form = new Form($this, $name);
		$form->addSelect('reciver', 'Příjemce', $this->employees)->setPrompt('Zvolte příjemce');
		$form->addTextArea('text', 'Text', 500)->setAttribute('class', 'field span12')->addRule(Form::FILLED, 'Je nutné zadat text zprávy');
		$form->addSubmit('create', 'Odeslat zprávu')->setAttribute('class', 'btn btn-primary')->onClick[] = callback($this, "sendMessageFormSubmitted");

		return $form;
	}

	public function sendMessageFormSubmitted(Nette\Forms\Controls\SubmitButton $btn) {
		$form = $btn->form;

		$this->messageRepository->sendMessage($form->values->text, $this->getUser()->getId(), $form->values->reciver);
    	$this->flashMessage('Zpráva odeslána.', 'success');
    	$this->redirect('this');

	}

}

Ještě bych zmínil, že pokud natvrdo vložím, jaká hodnota se má odelsat do metody sendMessage, tak to funguje, tudíž v modelu chyba nebude.

Mohl by mi někdo prosím poradit?

BigCharlie
Člen | 283
+
0
-

Trochu mě zarazil ten parametr u sendMessageFormSubmitted. Zkusils to takto:

public function sendMessageFormSubmitted(Nette\Application\UI\Form $form) {
        $this->messageRepository->sendMessage($form->values->text, $this->getUser()->getId(), $form->values->reciver);
        $this->flashMessage('Zpráva odeslána.', 'success');
        $this->redirect('this');

    }
jiri.pudil
Nette Blogger | 1032
+
0
-

@connor Pes je zakopaný v tom, že plníš $this->employees v metodě beforeRender(), zatímco zpracování formuláře je signál, a tedy k němu dojde dříve. Nette pak vrátí NULL, protože odeslaná hodnota není mezi definovanými (je to kontrola, aby ti nikdo nemohl podstrčit něco, co nechceš). Přesuň plnění $this->employees do action*() metody, popř. do startup(), má-li být k dispozici ve všech akcích presenteru.

@BigCharlie SubmitButton je tam správně, protože je handler navěšený na onClick tlačítka.

duke
Člen | 650
+
0
-

Je to jak říká jiri.pudil.

Alternativně také můžeš nahradit $this->employees za $this->getEmployees(), která bude vypadat následovně:

private function getEmployees()
{
	if (!isset($this->employees)) {
		$this->employees = $this->employeeRepository->findAll()->fetchPairs('employee_id', 'last_name');
	}
	return $this->employees;
}

A mimochodem máš překlep v „Recived“ – má být „Received“.

BigCharlie
Člen | 283
+
0
-

@jiri.pudil nojo, to jsem úplně přehlédl, člověk se pořád učí…

connor
Člen | 15
+
0
-

Díky moc za pomoc! Funguje to :)