addSelect vrací NULL hodnotu
- connor
- Člen | 15
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
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
@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
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“.