Nette formulář – nepředání parametru ID

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Hyli
Člen | 5
+
+1
-

Zdravím,

mám formulář jako komponentu:

class CategoryFormFactory extends BaseForm
{
    /**
     * @var CategoryRepository
     */
    private $categoryRepository;

    /**
     * @var EntityManager
     */
    private $em;

    public function __construct(CategoryRepository $categoryRepository, EntityManager $em)
    {
        $this->categoryRepository = $categoryRepository;
        $this->em = $em;
    }

    /**
     * @param null $id
     * @param callable $onSuccess
     * @return Form
     */
    public function create($id = NULL, callable $onSuccess)
    {
        $category_ids = $this->categoryRepository->fetchPairs($id);

        $form = new Form();

        $form->addText('name', 'Název kategorie')
            ->setRequired('Zadejte název kategorie');

        $form->addSelect('subcategory_to', 'Podkategorie k:', $category_ids)
            ->setPrompt('');

        $form->addSubmit('send', 'Uložit');

        if ($id) {
            $form->addHidden('id', $id);
            $category = $this->categoryRepository->find($id);
            $defaults = $category->toArray();
            if ($category->parent) {
                $defaults['subcategory_to'] = $category->parent->id;
            }
            $form->setDefaults($defaults);
        }

        $form->onValidate[] = [$this, 'validateForm'];
        $form->onSuccess[] = function($form, $values) use ($onSuccess) {
            $this->successForm($form, $values, $onSuccess);
        };

        $this->setStandardFormDesign($form);
        return $form;
    }

    public function validateForm(Form $form, $values)
    {
        if (isset($form->getHttpData($form::DATA_TEXT)['id'])) {
            $id = $form->getHttpData($form::DATA_TEXT)['id'];
            if ($values->subcategory_to == $id OR in_array($values->subcategory_to, $this->categoryRepository->find($id)->children->toArray())) {
                $form->addError('Nemůžete přidat kategorii jako svojí podkategorii');
            }
        }
    }

    /**
     * @param Form $form
     * @param $values
     */
    public function successForm(Form $form, $values, callable $onSuccess)
    {
        if (isset($form->getHttpData($form::DATA_TEXT)['id'])) {
            $id = $form->getHttpData($form::DATA_TEXT)['id'];
            $category = $this->categoryRepository->find($id);
        } else {
            $category = new Category();
        }

        $category->name = $values->name;
        $category->slug = Strings::webalize($values->name);
        if ($values->subcategory_to) {
            $category->parent = $this->categoryRepository->find($values->subcategory_to);
        } else {
            $category->parent = NULL;
        }

        $this->em->persist($category);
        $this->em->flush();

        call_user_func($onSuccess);
    }
}

A tu volám v presenteru přes

protected function createComponentCategoryForm()
{
    $id = $this->getParameter('id');
    $form = $this->categoryFormFactory->create($id, function () {
        $this->redirect('default');
    });

    return $form;
}

A můj problém je, že po odeslání formuláře se zahodí parametr ID, který je v hidden (to je důvod proč ho sosám z low level v onSuccess). Parametr zmizí i z adresního řádku. Nesetkal se někdo s podobným problémem, popř. nevíte někdo, jak to vyřešit?

CZechBoY
Člen | 3608
+
+1
-

Vytvor prazdnou akci s parametrem $id. Idealne si ten parametr i uloz do property a pristupuj k id pres tu property.

Hyli
Člen | 5
+
0
-

Zkusil jsem vytvořit property ve třídě CategoryFormPresenter $id a té přiřadím $id z create(), ale i tak, když se jí pak pokouším načíst v metodě onSuccess, tak vypíše NULL.

CZechBoY
Člen | 3608
+
0
-

A tu akci si vytvoril?

Hyli
Člen | 5
+
0
-

Netuším co by ta akce měla dělat. Mohl bys mi uvést prosím příklad?

Hyli
Člen | 5
+
+2
-

Vyřešeno. Stačilo přidat actionEdit($id) do presenteru.