Nefunkční variabilní formulář

Allconius
Člen | 313
+
0
-

Ahoj, potřeboval bych udělat formulář aby se v něm přidávaly položky na základě parametru (proměnné) $typ, mám to udělané takto :

<?php
 protected function createComponentSaveForm()
    {

        $form = new Form;

        $form->addProtection();

        $obsazeno = $this->dbManager->Obsazeno($this->skoleni);

        $nastaveni = $this->dbManager->nactiNastaveni($this->skoleni);

        foreach ($nastaveni as $id => $row) {
            $typ = $row->typ;
            $termin = $row->cas;

        }

        $form->addGroup('PŘIHLÁSIT NA TENTO TERMÍN')
            ->setOption('description', 'Zbývá '.$obsazeno.' volných míst na tento termín')
            ->setOption('id', 'prihlaseni-legend');

        $form->addHidden('termin', $termin);
        $form->addHidden('skoleni', $this->skoleni);
        $form->addHidden('user', $this->getUser()->getIdentity()->username);

        if ($typ>=1){
        $form->addText('jmeno', 'Příjmení a jméno, titul :')
            ->setRequired('Vyplňte jméno a příjmení.');
        }
        $form->addText('skola', 'Přesný název organizace :')
            ->setRequired('Vyplňte název organizace.');

        if ($typ>=2) {
        $form->addText('ic', 'IČ :')
            ->setRequired('Vyplňte IČ.');
        }
        if ($typ>=3){
        $form->addText('email', 'E-mailová adresa :')
          ->setEmptyValue('@')
          ->addCondition(Form::FILLED)
          ->addRule(Form::EMAIL, 'Email nemá správný formát');
        $form->addText('ucet', 'Číslo účtu plátce :')
            ->setRequired('Vyplňte účet.');
        }


        $form->addSubmit('uloz', 'Přihlásit');

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

        // setup form rendering
        $renderer = $form->getRenderer();
        $renderer->wrappers['controls']['container'] = NULL;
        $renderer->wrappers['pair']['container'] = 'div class=form-group';
        $renderer->wrappers['pair']['.error'] = 'has-error';
        $renderer->wrappers['control']['container'] = 'div class=col-sm-9';
        $renderer->wrappers['label']['container'] = 'div class="col-sm-3 control-label"';
        $renderer->wrappers['control']['description'] = 'span class=help-block';
        $renderer->wrappers['control']['errorcontainer'] = 'span class=help-block';
        // make form and controls compatible with Twitter Bootstrap
        $form->getElementPrototype()->class('form-horizontal');
        foreach ($form->getControls() as $control) {
            if ($control instanceof Controls\Button) {
                $control->getControlPrototype()->addClass(empty($usedPrimary) ? 'btn btn-primary' : 'btn btn-default');
                $usedPrimary = TRUE;
            } elseif ($control instanceof Controls\TextBase || $control instanceof Controls\SelectBox || $control instanceof Controls\MultiSelectBox) {
                $control->getControlPrototype()->addClass('form-control');
            } elseif ($control instanceof Controls\Checkbox || $control instanceof Controls\CheckboxList || $control instanceof Controls\RadioList) {
                $control->getSeparatorPrototype()->setName('div')->addClass($control->getControlPrototype()->type);
            }
        }


        return $form;
    }

public function saveFormSucceeded(Form $form, $values)
    {

        $values = $form->getValues();
        print_r($values);
        exit;
        $this->dbManager->ulozPrihlasku($values);


        $this->redirect('Homepage:');
        exit;
    }

?>

všechno funguje a formulář se generuje na základě proměnné $typ. Problém nastane až při ukládání, i když jsou zobrazeny všechny prvky ($typ=3) dostanu jen tento výstup:

<?php
Nette\Utils\ArrayHash Object (
[termin] => 1580996580
[skoleni] => 199
[user] => michal
[jmeno] => Michal
[skola] => Novák
)
?>

Chybí tam ic, email a ucet.

Pokud zruším tu variabilitu a nechám to takto:

<?php
   protected function createComponentSaveForm()
    {

        $form = new Form;

        $form->addProtection();

        $obsazeno = $this->dbManager->Obsazeno($this->skoleni);

        $nastaveni = $this->dbManager->nactiNastaveni($this->skoleni);

        foreach ($nastaveni as $id => $row) {
            $typ = $row->typ;
            $termin = $row->cas;

        }

        $form->addGroup('PŘIHLÁSIT NA TENTO TERMÍN')
            ->setOption('description', 'Zbývá '.$obsazeno.' volných míst na tento termín')
            ->setOption('id', 'prihlaseni-legend');

        $form->addHidden('termin', $termin);
        $form->addHidden('skoleni', $this->skoleni);
        $form->addHidden('user', $this->getUser()->getIdentity()->username);
        $form->addText('jmeno', 'Příjmení a jméno, titul :')
            ->setRequired('Vyplňte jméno a příjmení.');

        $form->addText('skola', 'Přesný název organizace :')
            ->setRequired('Vyplňte název organizace.');

        $form->addText('ic', 'IČ :')
            ->setRequired('Vyplňte IČ.');

        $form->addText('email', 'E-mailová adresa :')
          ->setEmptyValue('@')
          ->addCondition(Form::FILLED)
          ->addRule(Form::EMAIL, 'Email nemá správný formát');

        $form->addText('ucet', 'Číslo účtu plátce :')
            ->setRequired('Vyplňte účet.');



        $form->addSubmit('uloz', 'Přihlásit');

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

        // setup form rendering
        $renderer = $form->getRenderer();
        $renderer->wrappers['controls']['container'] = NULL;
        $renderer->wrappers['pair']['container'] = 'div class=form-group';
        $renderer->wrappers['pair']['.error'] = 'has-error';
        $renderer->wrappers['control']['container'] = 'div class=col-sm-9';
        $renderer->wrappers['label']['container'] = 'div class="col-sm-3 control-label"';
        $renderer->wrappers['control']['description'] = 'span class=help-block';
        $renderer->wrappers['control']['errorcontainer'] = 'span class=help-block';
        // make form and controls compatible with Twitter Bootstrap
        $form->getElementPrototype()->class('form-horizontal');
        foreach ($form->getControls() as $control) {
            if ($control instanceof Controls\Button) {
                $control->getControlPrototype()->addClass(empty($usedPrimary) ? 'btn btn-primary' : 'btn btn-default');
                $usedPrimary = TRUE;
            } elseif ($control instanceof Controls\TextBase || $control instanceof Controls\SelectBox || $control instanceof Controls\MultiSelectBox) {
                $control->getControlPrototype()->addClass('form-control');
            } elseif ($control instanceof Controls\Checkbox || $control instanceof Controls\CheckboxList || $control instanceof Controls\RadioList) {
                $control->getSeparatorPrototype()->setName('div')->addClass($control->getControlPrototype()->type);
            }
        }


        return $form;
    }
?>

tak je výstup správně:

<?php
Nette\Utils\ArrayHash Object (
[termin] => 1580996580
[skoleni] => 199
[user] => michal
[jmeno] => Michal
[skola] => Novák
[ic] => 11312313131
[email] => muj@mail.cz
[ucet] => 131313313213/2525
)

?>

Nechápu proč to neukládá všechny prvky, když už je vygeneruje ?

Allconius
Člen | 313
+
0
-

Divný je že u toho $typ=0 se uložení neprovede vůbec, zkoušel jsem to ještě upravit takto:

<?php
        if ($typ==0){
            $form->addText('skola', 'Přesný název organizace :')
                ->setRequired('Vyplňte název organizace.');

        }

        if ($typ==1){
            $form->addText('jmeno', 'Příjmení a jméno, titul :')
                ->setRequired('Vyplňte jméno a příjmení.');
            $form->addText('skola', 'Přesný název organizace :')
                ->setRequired('Vyplňte název organizace.');

        }

        if ($typ==2) {
            $form->addText('jmeno', 'Příjmení a jméno, titul :')
                ->setRequired('Vyplňte jméno a příjmení.');
            $form->addText('skola', 'Přesný název organizace :')
                ->setRequired('Vyplňte název organizace.');
            $form->addText('ic', 'IČ :')
                ->setRequired('Vyplňte IČ.');
        }
        if ($typ==3){
            $form->addText('jmeno', 'Příjmení a jméno, titul :')
                ->setRequired('Vyplňte jméno a příjmení.');
            $form->addText('skola', 'Přesný název organizace :')
                ->setRequired('Vyplňte název organizace.');
            $form->addText('ic', 'IČ :')
                ->setRequired('Vyplňte IČ.');
            $form->addText('email', 'E-mailová adresa :')
                ->setEmptyValue('@')
                ->addCondition(Form::FILLED)
                ->addRule(Form::EMAIL, 'Email nemá správný formát');
            $form->addText('ucet', 'Číslo účtu plátce :')
                ->setRequired('Vyplňte účet.');
        }

?>

a tímto výsledkem:

$typ=0:

  • jen problikne a Nette\Utils\ArrayHash Object vůbec nevytvoří :-(

$typ=1: Nette\Utils\ArrayHash Object ( [termin] ⇒ 1580996580 [skoleni] ⇒ 199 [user] ⇒ michal [jmeno] ⇒ Jan [skola] ⇒ Novák )

  • tohle je správně

$typ=2: Nette\Utils\ArrayHash Object ( [termin] ⇒ 1580996580 [skoleni] ⇒ 199 [user] ⇒ michal [jmeno] ⇒ Jan [skola] ⇒ Novák )

  • chybí ic

$typ=3: Nette\Utils\ArrayHash Object ( [termin] ⇒ 1580996580 [skoleni] ⇒ 199 [user] ⇒ michal [jmeno] ⇒ Jan [skola] ⇒ Novák )

  • chybí ic, email a ucet
Allconius
Člen | 313
+
0
-

ale pravda je, že jsem to musel něčím „rozdrbat“, protože ze začátku jak jsem tu aplikaci vytvářel, tak to ukládalo i s tou variabilitou… :-(

Allconius
Člen | 313
+
0
-

funguje to akorát když jsem vytvořil funkci pro každou variantu, tj:

<?php
protected function createComponentSave0Form()
protected function createComponentSave1Form()
protected function createComponentSave2Form()
protected function createComponentSave3Form()
?>

a pak v šabloně:

<?php
    {if ($typ==0)}{control save0Form}{/if}
    {if ($typ==1)}{control save1Form}{/if}
    {if ($typ==2)}{control save2Form}{/if}
    {if ($typ==3)}{control save3Form}{/if}
?>

akorát mám teď zbytečně „nefouklej“ presenter :-)