Nefunkční variabilní formulář
- Allconius
- Člen | 317
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 | 317
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 | 317
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 :-)