Přidávání formulářových prvků ve foreach – nevrací hodnotu při zpracování

hyneks
Člen | 4
+
0
-

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

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)