HTML Select – Success vrací null

MartinVolenec
Člen | 36
+
0
-

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)

h4kuna
Backer | 740
+
0
-

V tom dumpu vidím value protected ⇒ 1. Jak jsi došel k tomu dumpu?

takhle?

$form->onSuccess[] = function($form, $values) {
	dumpe($values->role);
};
CZechBoY
Člen | 3608
+
0
-

No ja tam hlavne vidim options ⇒ array(), takze se ti nenastavujou polozky.
Kdy beres $this->roles a kdy je zapisujes do te property?

Editoval CZechBoY (30. 11. 2018 9:21)

MartinVolenec
Člen | 36
+
0
-

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;
    }
?>
CZechBoY
Člen | 3608
+
0
-

No a kdy teda zapisuješ do property $this->roles?

MartinVolenec
Člen | 36
+
0
-

@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
+
0
-

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

@OndřejKubíček při renderDefault funkci.

h4kuna
Backer | 740
+
0
-

Nasypal jsi nám celkem málo drobků abychom sestavili rohlík. Bylo by dobré postnout presenter a všechny závislé služby kterých se to týká.

MartinVolenec
Člen | 36
+
0
-

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

zkus tu metodu render změnit na action

zpracování formu se děje dřív než render

MartinVolenec
Člen | 36
+
0
-

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

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

CZechBoY
Člen | 3608
+
0
-

A nejspíš proto si tam měl to přetypování na array, normálně by nemělo být potřeba.