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
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?