Problém s ajaxovým formulářem

před 12 dny

Dominik
Člen | 1
+
0
-

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();
    }

před 6 dny

admin@easyweb4u.cz
Backer | 86
+
0
-

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();
    }