Přidávání formulářových prvků ve foreach – nevrací hodnotu při zpracování
- hyneks
- Člen | 4
Zdravím,
mám problém s dynamickým přidáváním prvků do formuláře. Snažím
se udělat form., který ve foreach roztočí pole, ve kterém jsou prvky,
které se mají vykreslit. To proběhne v pořádku, prvky dostanu na stránku,
kde se mi v šabloně úspěšně vykreslí. Tudíž existují. Ale pak ve
funkci, která formulář zpracovává po odeslání, se hodnoty tváří, jako
by prvky dodané ve foreach vůbec neexistovaly. Nedostanu z nich žádnou
hodnotu, ale ani nevrátí například 'text' => NULL
.
Nevíte prosím někdo, jak tento problém vyřešit? Přikládám kód:
PagesPresenter.php
public function createComponentEditPageForm()
{
$form = new Form();
$elements = $this->database->table('pages_items')->select('*')->where('pages', $this->getParameter('id'))->where('locale', $this->language)->fetchAll();
foreach ($elements as $element) {
if ($element['type'] == 'textarea') {
$form->addTextArea($element['key'], $element['name'])->setDefaultValue($element['value']);
} else if ($element['type'] == 'text') {
$form->addText($element['key'], $element['name'])->setDefaultValue($element['value']);
}
}
$form->addHidden('locale', $this->language);
$form->addHidden('id', $this->getParameter('id'));
$form->addSubmit('edit', 'Upravit');
$form->onSuccess[] = [$this, 'editPage'];
return $form;
}
public function editPage($form)
{
$values = $form->getValues(true);
$lang = $values['locale'];
$id = $values['id'];
unset($values['locale']);
unset($values['id']);
$success = 1;
foreach ($values as $key => $value) {
$update = $this->database->table('pages_items')->where('pages', $id)->where('locale', $lang)->where('key', $key)->update('value', $value);
if ($update) {
$success = 1;
} else {
$success = 0;
}
}
if ($success === 1) {
$this->redirect('this', ['id' => $id, 'edit' => 1]);
} else {
$this->redirect('this', ['id' => $id, 'edit' => 2]);
}
}
detail.latte
{form editPageForm}
{foreach $form->getComponents() as $key => $component}
{if $component instanceof Nette\Forms\Controls\TextArea}
<div class="form-group">
{label $key}
<textarea n:name="$key"></textarea>
<script type="text/javascript" n:syntax="double">
CKEDITOR.replace({{$key}}, {
filebrowserBrowseUrl: '/plugins/kcfinder/browse.php?type=files',
filebrowserImageBrowseUrl: '/plugins/kcfinder/browse.php?type=images',
filebrowserFlashBrowseUrl: '/plugins/kcfinder/browse.php?type=flash',
filebrowserUploadUrl: '/plugins/kcfinder/upload.php?type=files',
filebrowserImageUploadUrl: '/plugins/kcfinder/upload.php?type=images',
filebrowserFlashUploadUrl: '/plugins/kcfinder/upload.php?type=flash'
});
</script>
<script type="text/javascript" n:syntax="double">
window.onload = function () {
CKEDITOR.replace({{$key}}, {
filebrowserBrowseUrl: '/plugins/kcfinder/browse.php?type=files',
filebrowserImageBrowseUrl: '/plugins/kcfinder/browse.php?type=images',
filebrowserFlashBrowseUrl: '/plugins/kcfinder/browse.php?type=flash',
filebrowserUploadUrl: '/plugins/kcfinder/upload.php?type=files',
filebrowserImageUploadUrl: '/plugins/kcfinder/upload.php?type=images',
filebrowserFlashUploadUrl: '/plugins/kcfinder/upload.php?type=flash'
});
};
</script>
</div>
{elseif $component instanceof Nette\Forms\Controls\TextInput}
<div class="form-group">
<md-input-container flex>
<md-icon md-svg-src="/dist/img/icons/ic_subject_24px.svg"></md-icon>
{label $key}
{input $key}
</md-input-container>
</div>
{elseif $component instanceof Nette\Forms\Controls\SubmitButton}
<div class="form-group">
<input type="submit" n:name="{$key}" value="Upravit stránku" class="btn-width-large btn-block btn-lg md-primary md-raised md-button md-ink-ripple" style="right: 0.65%;" />
</div>
{/if}
{/foreach}
{/form}
Editoval hyneks (8. 4. 2018 22:14)
- David Matějka
- Moderator | 6445
ahoj, kdyz se zpracovava formular, je nutne, aby se sestavil stejne, jako pri vykreslovani – tedy aby tam vsechny ty prvky byly. v tvem pripade bude asi problem v tom, ze se ti ztrati parametry id a/nebo language. vzhledem k tomu, ze language vypada jako persistentni, tak bych to spise tipoval na to id. aby se id zachovalo, staci jej pridat do actionDetail metody jako parametr, tedy treba
public function actionDetail($id)