HTML Select – Success vrací null
- MartinVolenec
- Člen | 36
Dobrý den,
mám formulář a používám v něm Select.
<?php
$form->addSelect('role', 'Role')
->setItems($this->roles);
?>
$this->roles obsahuje toto pole:
<?php
array (3)
1 => "Manager" (7)
2 => "ReadWriteUser" (13)
3 => "ReadUser" (8)
?>
HTML se vygeneruje správně:
<?php
<select name="role" id="frm-inviteUserForm-form-role" class="form-control" data-lfv-initialized="true" data-lfv-message-id="frm-inviteUserForm-form-role_message">
<option value="1">Manager</option>
<option value="2">ReadWriteUser</option>
<option value="3">ReadUser</option>
</select>
?>
Avšak v onSuccess funkci mi hodnota formuláře pod klíčem ‚role‘ (select) vrací NULL. Přičemž ostatní inputy vrací správné hodnoty.
Pokud si pomocí Tracy dumpnu
<?php
$form['role']
?>
, tak mi vrátí následující informace:
<?php
Nette\Forms\Controls\SelectBox #c0e5
options private => array ()
prompt private => false
optionAttributes private => array ()
checkAllowedValues => true
items private => array ()
caption => "Role" (4)
value protected => 1
control protected => Nette\Utils\Html #2922
attrs => array (3)
type => null
name => null
size => null
children protected => array ()
name private => "input" (5)
isEmpty private => true
label protected => Nette\Utils\Html #e0c2
attrs => array ()
children protected => array ()
name private => "label" (5)
isEmpty private => false
disabled protected => false
errors private => array ()
omitted private => null
rules private => Nette\Forms\Rules #81d5
required private => null
rules private => array (1)
0 => Nette\Forms\Rule #4295 { ... }
parent private => null
toggles private => array ()
control private => Nette\Forms\Controls\SelectBox #c0e5 { RECURSION }
translator private => true
parent private => Nette\Application\UI\Form #397c
name private => "role" (4)
monitors private => array (1)
"Nette\Forms\Form" => array (4)
0 => Nette\Application\UI\Form #397c { ... }
1 => 1
2 => "role" (4)
3 => array (1) [ ... ]
options private => array (1)
type => "select" (6)
?>
kde je vidět, že ve value je správná zvolená hodnota.
Nemá někdo zkušenost, proč se toto děje?
Děkuji za pomoc
Editoval MartinVolenec (29. 11. 2018 22:25)
- MartinVolenec
- Člen | 36
K dumpu jsem došel takto:
<?php
Debugger:barDump($form)
?>
v success funkci.
Role nastavuji při vytváření v presenteru:
<?php
public function createComponentInviteUserForm()
{
$control = $this->inviteUserFormFactory->create();
$control->setRoles((array)$this->roles);
return $control;
}
?>
- MartinVolenec
- Člen | 36
@CZechBoY Zapisuji?
Jak jsem již zmínil, v presenteru posílám $roles do Formuláře přes setter.
Poté ve funkci createComponentForm nastavuji selectu hodnoty přes setItems.
Napadlo mě to taktéž vyřešit přes Multiplier, ale ty role jsou furt stejné, takže nevidím význam ho použit.
- Ondřej Kubíček
- Člen | 494
on se ptal na to kdy a kde do té property $roles
, kterou máš
v presenteru, zapišeš to pole, které si vytáhneš z konfigu nebo db nebo
odkudkoli to bereš…
- MartinVolenec
- Člen | 36
Presenter:
<?php
class ManagerPresenter extends BasePresenter
{
/**
* @var InviteUserFormFactory
*/
private $inviteUserFormFactory;
/**
* @var ManagerRequester
*/
private $managerRequester;
/**
* @var array
*/
private $roles;
/**
* ManagerPresenter constructor.
* @param InviteUserFormFactory $inviteUserFormFactory
* @param ManagerRequester $managerRequester
*/
public function __construct(InviteUserFormFactory $inviteUserFormFactory, ManagerRequester $managerRequester)
{
parent::__construct();
$this->inviteUserFormFactory = $inviteUserFormFactory;
$this->managerRequester = $managerRequester;
}
public function renderDefault()
{
$response = $this->managerRequester->requestAccountManagement($this->oauthCookie);
if ($response->getStatusCode() === 200)
{
$content = $response->getBody()->getContents();
$responseValues = json_decode($content);
$this->template->newestNotifications = $responseValues->newestNotifications;
$this->template->customer_channels = $responseValues->customer_channels;
$this->roles = $responseValues->roles;
}
}
/**
* @return \App\Components\InviteUserForm\InviteUserForm
*/
public function createComponentInviteUserForm()
{
$control = $this->inviteUserFormFactory->create();
$control->setRoles((array)$this->roles);
return $control;
}
}
?>
Šablona:
<?php
{block content}
<div class="content-wrapper">
<div class="container-fluid">
<div class="row">
<div class="col-lg-4">
<h1>Přizvat uživatele do systému</h1>
{control inviteUserForm}
</div>
</div>
</div>
</div>
?>
Formulář:
<?php
class InviteUserForm extends UI\Control
{
/**
* @var FormFactory
*/
private $formFactory;
/**
* @var OAuthCookieManager
*/
private $oauthCookieManager;
/**
* @var UserInviteRequester
*/
private $userInviteRequester;
/**
* @var array
*/
private $roles = [];
/**
* InviteUserForm constructor.
* @param FormFactory $formFactory
* @param OAuthCookieManager $authCookieManager
* @param UserInviteRequester $userInviteRequester
*/
public function __construct(FormFactory $formFactory, OAuthCookieManager $authCookieManager, UserInviteRequester $userInviteRequester)
{
parent::__construct();
$this->formFactory = $formFactory;
$this->oauthCookieManager = $authCookieManager;
$this->userInviteRequester = $userInviteRequester;
}
public function setRoles(array $roles)
{
$this->roles = $roles;
}
public function render()
{
$template = $this->template;
$template->setFile(__DIR__ . '/templates/default.latte');
$template->render();
}
protected function createComponentForm() : UI\Form
{
//Debugger::barDump($this->roles);
$form = $this->formFactory->create();
$form->addText('email')
->setRequired('Povinný údaj')
->addRule(UI\Form::EMAIL, 'Zadejte validní e-mail');
$form->addSelect('role', 'Role')
->setItems($this->roles);
$form->addSubmit('submit', 'Pozvat');
$form->onSuccess[] = [$this, 'formSucceeded'];
return $form;
}
public function formSucceeded(UI\Form $form, ArrayHash $values)
{
{* $values->role je zde null *}
}
}
?>
- Ondřej Kubíček
- Člen | 494
zkus tu metodu render změnit na action
zpracování formu se děje dřív než render
- MartinVolenec
- Člen | 36
@OndřejKubíček funguje. Sice moc nechápu proč, ale to je asi jedno. Hlavní je, že to teď funguje. Nebo je snad nějaký lepší způsob ne předávání? O Multiplierovi vím.
Jinak děkuji.
- Ondřej Kubíček
- Člen | 494
mrkni na životní cyklus presenteru – https://doc.nette.org/…n/presenters#…
první se vykonávají action
pak handle (kde se i zpracují odeslané formuláře)
a pak až render
takže jsi to pole nastavoval moc pozdě, proto bylo null