Problém s ajaxovým formulářem
- Dominik
- Člen | 7
Dobrý den,
potřeboval bych poradit s formulářem v Bootstrap modalu,
submitovaným přes ajax. Mám více submitů, které řeší různé funkce.
Všechny jsou prováděný přes ajax a následně by měly překleslit
formulář s novýmy daty. Ajax normálně funguje, mám na formuláři class
„ajax“ a přidaný js pro nette ajax. Myslím si, že problém je v tom,
že po kliku na submit nedostanu správné id a formulář se pak nepřekreslí
se správným id. Takto vypadá moje form factory (momentálně mám místo
onSuccess onValidate z důvodu, že onValidate jde lépe debugovat):
public function createNew(Presenter $presenter, $callableForm, $componentId = null, $currentComponent = null)
{
$form = $this->formFactory->create();
//tu je normálně část kódu, kde dostávám vše potřebné
$form->addText('component_key', 'Klíč komponenty: ')
->setDefaultValue($componentArr['key'])
->setRequired();
$form->addText('component_heading', 'Název komponenty: ')
->setDefaultValue($componentArr['heading']);
$form->addCheckbox('component_admin_edit', 'Admin může upravovat: ')
->setDefaultValue($componentArr['admin_edit']);
foreach ($componentArr['items'] as $item_id => $item) {
$itemContainer = $form->addContainer('item_' . $item['key']);
if(count($componentArr['items']) > 1){
$itemContainer->addSubmit('delete_item', 'odebrat položku')
->setOption('item_id', $item_id);
}
$itemContainer->addText('item_key', 'Klíč položky: ')
->setDefaultValue($item['key'])
->setRequired();
$itemContainer->addText('item_heading', 'Název položky: ')
->setDefaultValue($item['heading']);
$itemContainer->addCheckbox('item_administrator_add', 'Superadmin může přidávat: ')
->setDefaultValue($item['administrator_add'])
->addCondition(Form::EQUAL, true)
->toggle('items_user_add_' . ($item_id));
$itemContainer->addCheckbox('item_admin_add', 'Admin může přidávat: ')
->setDefaultValue($item['admin_add'])
->setHtmlId('items_user_add_' . ($item_id));
$itemContainer->addCheckbox('item_admin_edit', 'Admin může editovat: ')
->setDefaultValue($item['admin_edit']);
$itemContainer->addCheckbox('item_visibility', 'Admin může editovat: ')
->setDefaultValue($item['visibility']);
$param_index = 0;
foreach ($item['params'] as $param_id => $param) {
$paramContainer = $itemContainer->addContainer('param_' . $param_id);
if(count($item['params']) > 1){
$paramContainer->addSubmit('delete_parameter', 'odebrat parametr')
->setOption('item_id', $param_id);
}
$paramContainer->addText('param_name', 'Název parametru: ')
->setDefaultValue($param['heading']);
$paramContainer->addSelect('param_type', 'Typ parametru: ', $types)
->setDefaultValue($param['type'])
->setRequired();
$paramContainer->addCheckbox('param_admin_edit', 'Admin může editovat: ')
->setDefaultValue($param['admin_edit']);
if (count($item['params']) - 1 === $param_index) {
$paramContainer->addSubmit('add_parameter', 'Přidat parametr')
->setOption('item_id', 'item_' . $item['key']);
}
$param_index++;
}
}
$form->addHidden('component_id_form', $componentId);
$form->addSubmit('add_item', 'Přidat položku');
$form->addSubmit('add', 'Provést změny');
$form->onValidate[] = function (Form $form, $values) use ($presenter, $componentId, $callableForm) {
if ($this->formFactory->user->isAllowed('Components', 'add')) {
if($componentId === null || $componentId < 0){
$componentId = (int)$values->component_id_form;
}
if($this->component_id !== null && $this->component_id > -1){
$componentId = $this->component_id;
}
if($componentId === -1){
$componentId = null;
}
$editValues = clone $values;
$component = null;
unset($editValues->component_id_form);
if ($componentId === null) {
$component = $this->formFactory->componentsRepository->addComponentNew($editValues);
} else {
$component = $this->formFactory->componentsRepository->editComponentNew($componentId, $editValues);
}
if($component === "UniqueConstraintViolationException"){
$component = $this->formFactory->componentsRepository->editComponentNew($componentId, $editValues);
}
if ($component === null) {
$presenter->flashMessage('Chyba při ukládání komponenty nebo je položka již vytvořená s tímto klíčem!', 'danger');
$presenter->redirect('this');
} elseif ($componentId === null) {
$componentId = $component->id;
}
if($form->isSubmitted()->name !== "add"){
if ($form->isSubmitted()->name === "add_item") {
$this->formFactory->componentsRepository->addComponentItem($componentId);
$callableForm($componentId);
}elseif($form->isSubmitted()->name === "delete_item"){
$itemSaveRes = $this->formFactory->componentsRepository->deleteItemById($form->isSubmitted()->getOption('item_id'));
$callableForm($componentId);
}elseif($form->isSubmitted()->name === "add_parameter"){
$item_key = $values[$form->isSubmitted()->getOption('item_id')]['item_key'];
$item_id = $this->formFactory->componentsRepository->getItemIdByKey($item_key);
$parameterSaveRes = $this->formFactory->componentsRepository->addItemParameter($item_id);
$callableForm($componentId);
}elseif($form->isSubmitted()->name === "delete_parameter"){
$parameterSaveRes = $this->formFactory->componentsRepository->deleteParameterById($form->isSubmitted()->getOption('item_id'));
$callableForm($componentId);
}
}else{
$presenter->flashMessage('Uloženo','success');
$presenter->redirect('Components:default', ['component_id' => $componentId]);
}
}
};
return $form;
}
Ještě přidávám kousek php kódu, kde se mi vytváří formulář:
protected function createComponentAddComponentNewForm(){
if ($this->user->isAllowed('Components', 'add')) {
$form = $this->componentAddFormFactory->createNew($this, function ($id){
//toto je persistent proměnná
$this->component_id = $id;
$this->currComponent = $this->componentsRepository->getComponents($this->component_id,true);
$this->currComponent = reset($this->currComponent);
$this->removeComponent($this->getComponent('addComponentNewForm'));
$this->addComponent($this->createComponentAddComponentNewForm(), 'addComponentNewForm');
$this->redrawModal($this, true);
$this->redrawControl('addCompSnippet', true);
},$this->component_id, $this->currComponent);
return $form;
}
return new UI\Form();
}
- admin@easyweb4u.cz
- Backer | 143
Ahoj, nedávno se mi stala podobná věc, nepřenášel se z AJAX formuláře parametr id. Vyřešila to actionDefault() v presenteru.
public function actionDefault($id) {
$this->id = $id
}
pak se ani $id nemusí přidávat do formuláře (addHidden)
Dominik napsal(a):
Dobrý den,
potřeboval bych poradit s formulářem v Bootstrap modalu, submitovaným přes ajax. Mám více submitů, které řeší různé funkce. Všechny jsou prováděný přes ajax a následně by měly překleslit formulář s novýmy daty. Ajax normálně funguje, mám na formuláři class „ajax“ a přidaný js pro nette ajax. Myslím si, že problém je v tom, že po kliku na submit nedostanu správné id a formulář se pak nepřekreslí se správným id. Takto vypadá moje form factory (momentálně mám místo onSuccess onValidate z důvodu, že onValidate jde lépe debugovat):public function createNew(Presenter $presenter, $callableForm, $componentId = null, $currentComponent = null) { $form = $this->formFactory->create(); //tu je normálně část kódu, kde dostávám vše potřebné $form->addText('component_key', 'Klíč komponenty: ') ->setDefaultValue($componentArr['key']) ->setRequired(); $form->addText('component_heading', 'Název komponenty: ') ->setDefaultValue($componentArr['heading']); $form->addCheckbox('component_admin_edit', 'Admin může upravovat: ') ->setDefaultValue($componentArr['admin_edit']); foreach ($componentArr['items'] as $item_id => $item) { $itemContainer = $form->addContainer('item_' . $item['key']); if(count($componentArr['items']) > 1){ $itemContainer->addSubmit('delete_item', 'odebrat položku') ->setOption('item_id', $item_id); } $itemContainer->addText('item_key', 'Klíč položky: ') ->setDefaultValue($item['key']) ->setRequired(); $itemContainer->addText('item_heading', 'Název položky: ') ->setDefaultValue($item['heading']); $itemContainer->addCheckbox('item_administrator_add', 'Superadmin může přidávat: ') ->setDefaultValue($item['administrator_add']) ->addCondition(Form::EQUAL, true) ->toggle('items_user_add_' . ($item_id)); $itemContainer->addCheckbox('item_admin_add', 'Admin může přidávat: ') ->setDefaultValue($item['admin_add']) ->setHtmlId('items_user_add_' . ($item_id)); $itemContainer->addCheckbox('item_admin_edit', 'Admin může editovat: ') ->setDefaultValue($item['admin_edit']); $itemContainer->addCheckbox('item_visibility', 'Admin může editovat: ') ->setDefaultValue($item['visibility']); $param_index = 0; foreach ($item['params'] as $param_id => $param) { $paramContainer = $itemContainer->addContainer('param_' . $param_id); if(count($item['params']) > 1){ $paramContainer->addSubmit('delete_parameter', 'odebrat parametr') ->setOption('item_id', $param_id); } $paramContainer->addText('param_name', 'Název parametru: ') ->setDefaultValue($param['heading']); $paramContainer->addSelect('param_type', 'Typ parametru: ', $types) ->setDefaultValue($param['type']) ->setRequired(); $paramContainer->addCheckbox('param_admin_edit', 'Admin může editovat: ') ->setDefaultValue($param['admin_edit']); if (count($item['params']) - 1 === $param_index) { $paramContainer->addSubmit('add_parameter', 'Přidat parametr') ->setOption('item_id', 'item_' . $item['key']); } $param_index++; } } $form->addHidden('component_id_form', $componentId); $form->addSubmit('add_item', 'Přidat položku'); $form->addSubmit('add', 'Provést změny'); $form->onValidate[] = function (Form $form, $values) use ($presenter, $componentId, $callableForm) { if ($this->formFactory->user->isAllowed('Components', 'add')) { if($componentId === null || $componentId < 0){ $componentId = (int)$values->component_id_form; } if($this->component_id !== null && $this->component_id > -1){ $componentId = $this->component_id; } if($componentId === -1){ $componentId = null; } $editValues = clone $values; $component = null; unset($editValues->component_id_form); if ($componentId === null) { $component = $this->formFactory->componentsRepository->addComponentNew($editValues); } else { $component = $this->formFactory->componentsRepository->editComponentNew($componentId, $editValues); } if($component === "UniqueConstraintViolationException"){ $component = $this->formFactory->componentsRepository->editComponentNew($componentId, $editValues); } if ($component === null) { $presenter->flashMessage('Chyba při ukládání komponenty nebo je položka již vytvořená s tímto klíčem!', 'danger'); $presenter->redirect('this'); } elseif ($componentId === null) { $componentId = $component->id; } if($form->isSubmitted()->name !== "add"){ if ($form->isSubmitted()->name === "add_item") { $this->formFactory->componentsRepository->addComponentItem($componentId); $callableForm($componentId); }elseif($form->isSubmitted()->name === "delete_item"){ $itemSaveRes = $this->formFactory->componentsRepository->deleteItemById($form->isSubmitted()->getOption('item_id')); $callableForm($componentId); }elseif($form->isSubmitted()->name === "add_parameter"){ $item_key = $values[$form->isSubmitted()->getOption('item_id')]['item_key']; $item_id = $this->formFactory->componentsRepository->getItemIdByKey($item_key); $parameterSaveRes = $this->formFactory->componentsRepository->addItemParameter($item_id); $callableForm($componentId); }elseif($form->isSubmitted()->name === "delete_parameter"){ $parameterSaveRes = $this->formFactory->componentsRepository->deleteParameterById($form->isSubmitted()->getOption('item_id')); $callableForm($componentId); } }else{ $presenter->flashMessage('Uloženo','success'); $presenter->redirect('Components:default', ['component_id' => $componentId]); } } }; return $form; }
Ještě přidávám kousek php kódu, kde se mi vytváří formulář:
protected function createComponentAddComponentNewForm(){ if ($this->user->isAllowed('Components', 'add')) { $form = $this->componentAddFormFactory->createNew($this, function ($id){ //toto je persistent proměnná $this->component_id = $id; $this->currComponent = $this->componentsRepository->getComponents($this->component_id,true); $this->currComponent = reset($this->currComponent); $this->removeComponent($this->getComponent('addComponentNewForm')); $this->addComponent($this->createComponentAddComponentNewForm(), 'addComponentNewForm'); $this->redrawModal($this, true); $this->redrawControl('addCompSnippet', true); },$this->component_id, $this->currComponent); return $form; } return new UI\Form(); }