Autor | Zpráva | ||
---|---|---|---|
KarelEben Profil |
#1 · Zasláno: 23. 1. 2015, 08:28:11
Zdravím,
v současné době dělám na jednom projektu a teď se vstekám s formulářem. Má to dělat to že po kliknutí na add v formuláří addMealBlockForm se AJAXem odešlou data do db a znova se překreslí do snippetu listDietGroups a jako položky v mealBlock v addMealForm. Dále se má po odeslání formuláře addMealForm překreslit listDietGroups. Na serveru používáme Doctrine. Šablona: <div class="meal-bar edit"> {snippet addMealBlock} {form addMealBlockForm, class => "meal-form ajax"} <div class="row"> {input mealBlock, class => "meal-headline required"} {input add, class => "no-button add-item add-block to-left"} </div> {/form} {/snippet} {snippet addMeal} {form addMealForm, class => "last meal-form ajax"} <div class="row"> {input mealName, class => "name required"} {input moreInfo, class => "more-info"} {input mealBlock} {input add, class => "no-button add-item add-meal"} {input price, class => "price required"} <div class="error" n:if="$form['price']->getError()">{_$form['price']->getError()}</div> </div> {/form} {/snippet} <div class="required-info">{_admin.settings.meal-list.required-info}</div> {snippet listDietGroups} <div class="generated"> {foreach $company->dietGroups as $dietGroup} <div class="meal-block" id="MB_{$dietGroup->id}"> <div class="meal-headline">{$dietGroup->name}<a class="ajax" n:href="deleteMealBlock!, id => $dietGroup->id"><span class="delete delete-block"></span></a></div> {foreach $dietGroup->dietItems as $dietItem} <div class="meal"> <span class="name">{$dietItem->name}</span> <span class="more-info">{$dietItem->description}</span> <a class="ajax" n:href="deleteMeal!, id => $dietItem->id"><span class="delete"></span></a> <span class="price">{$dietItem->price},-</span> </div> {/foreach} </div> {/foreach} </div> {/snippet} </div> Presenter: /** * @var DietGroupFacade * @inject */ public $dietGroupFacade; /** * @var CompanyFacade * @inject */ public $companyFacade; . . public function renderDefault() { $this->template->company = $this->company; . . } . . . public function createComponentAddMealBlockForm() { $form = new Form; $form->setTranslator($this->translator); $form->addText('mealBlock') ->setAttribute('placeholder', 'admin.settings.meal-list.category-name') ->setRequired('common.form.fill'); $form->addSubmit('add', ''); $form->onSuccess[] = $this->addMealBlockFormSucceeded; return $form; } public function addMealBlockFormSucceeded(Form $form) { $values = $form->getValues(); $this->dietGroupFacade->addDietGroup($values->mealBlock, $this->company); $this->flashMessage('common.database.operation-success', FlashMessage::GOOD); if($this->isAjax()) { $this->redrawControl('flash-message'); $this->redrawControl('addMeal'); $this->redrawControl('listDietGroups'); $form->setValues(array(), TRUE); } else { $this->redirect('this'); } } public function handleDeleteMealBlock($id) { $this->dietGroupFacade->deleteDietGroup($id, $this->company); $this->flashMessage('common.database.operation-success', FlashMessage::GOOD); //$this->redirect('this#meal-list'); $this->redrawControl('flash-message'); $this->redrawControl('add-meal-block-form-edit'); } public function createComponentAddMealForm() { $form = new Form; $form->setTranslator($this->translator); $form->addText('mealName') ->setAttribute('placeholder', 'admin.settings.meal-list.meal') ->setRequired('common.form.fill'); $form->addText('moreInfo') ->setAttribute('placeholder', 'admin.settings.meal-list.simple-discription'); $form->addText('price') ->addRule(Form::FLOAT, 'admin.settings.meal-list.price-num') ->setAttribute('placeholder', 'admin.settings.meal-list.price') ->setRequired('common.form.fill'); $mealBlocks = array(); foreach ($this->company->dietGroups as $dietGroup) { $mealBlocks[$dietGroup->id] = $dietGroup->name; } $form->addSelect('mealBlock', '', $mealBlocks) ->setPrompt('admin.settings.meal-list.choose-group') ->setRequired('common.form.fill'); $form->addSubmit('add', ''); $form->onSuccess[] = $this->addMealFormSucceeded; return $form; } public function addMealFormSucceeded(Form $form) { $values = $form->getValues(); $dietGroup = $this->dietGroupFacade->getDietGroupById($values->mealBlock); $this->dietItemFacade->addDietItem( $values->mealName, $dietGroup, $values->price, $values->moreInfo); $this->flashMessage('common.database.operation-success', FlashMessage::GOOD); //$this->redirect('this#meal-list'); if($this->isAjax()) { $this->redrawControl('flash-message'); $this->redrawControl('addMeal'); $this->redrawControl('listDietGroups'); $form->setValues(array(), TRUE); } else { $this->redirect('this'); } } public function handleDeleteMeal($id) { $this->dietItemFacade->deleteDietItem($id, $this->company); $this->flashMessage('common.database.operation-success', FlashMessage::GOOD); //$this->redirect('this#meal-list'); $this->redrawControl('flash-message'); $this->redrawControl('add-meal-block-form-edit'); } Javascript: <script type="text/javascript"> . . . $(function () { $.nette.init(); }); . . . </script> Bohužel se nezobrazí žádná chyba, žádná exception ani v konzoli, nikde... |
||
Jan Tvrdík Profil |
#2 · Zasláno: 23. 1. 2015, 08:45:01
A co to tedy dělá? Co vrací server jako odpověď na to odeslání formuláře? Posíláš ten formulář určitě AJAXem? Jak vypadá ten požadavek?
|
||
KarelEben Profil |
#3 · Zasláno: 23. 1. 2015, 08:53:17 · Upravil/a: KarelEben
Tak menší změna kodu.
Presenter: public function actionDefault() { $this->redrawControl('addMeal'); $this->redrawControl('listDietGroups'); $this->redrawControl('addMealBlock'); } public function renderDefault() { $this->template->company = $this->company; $this->template->attributes = $this->attributeFacade->getAttributes(); $this->template->activeAttributes = $this->company->getAttributesPairs(); } public function addMealBlockFormSucceeded(Form $form) { $values = $form->getValues(); $this->dietGroupFacade->addDietGroup($values->mealBlock, $this->company); $this->flashMessage('common.database.operation-success', FlashMessage::GOOD); if($this->isAjax()) { $form->setValues(array(), TRUE); } else { $this->redirect('this'); } } public function handleDeleteMealBlock($id) { $this->dietGroupFacade->deleteDietGroup($id, $this->company); $this->flashMessage('common.database.operation-success', FlashMessage::GOOD); //$this->redirect('this#meal-list'); $this->redrawControl('flash-message'); $this->redrawControl('add-meal-block-form-edit'); } public function createComponentAddMealForm() { $form = new Form; $form->setTranslator($this->translator); $form->addText('mealName') ->setAttribute('placeholder', 'admin.settings.meal-list.meal') ->setRequired('common.form.fill'); $form->addText('moreInfo') ->setAttribute('placeholder', 'admin.settings.meal-list.simple-discription'); $form->addText('price') ->addRule(Form::FLOAT, 'admin.settings.meal-list.price-num') ->setAttribute('placeholder', 'admin.settings.meal-list.price') ->setRequired('common.form.fill'); $mealBlocks = array(); foreach ($this->company->dietGroups as $dietGroup) { $mealBlocks[$dietGroup->id] = $dietGroup->name; } $form->addSelect('mealBlock', '', $mealBlocks) ->setPrompt('admin.settings.meal-list.choose-group') ->setRequired('common.form.fill'); $form->addSubmit('add', ''); $form->onSuccess[] = $this->addMealFormSucceeded; return $form; } public function addMealFormSucceeded(Form $form) { $values = $form->getValues(); $dietGroup = $this->dietGroupFacade->getDietGroupById($values->mealBlock); $this->dietItemFacade->addDietItem( $values->mealName, $dietGroup, $values->price, $values->moreInfo); $this->flashMessage('common.database.operation-success', FlashMessage::GOOD); //$this->redirect('this#meal-list'); if($this->isAjax()) { $this->redrawControl('flash-message'); $this->redrawControl('addMeal'); $this->redrawControl('listDietGroups'); $form->setValues(array(), TRUE); } else { $this->redirect('this'); } } public function handleDeleteMeal($id) { $this->dietItemFacade->deleteDietItem($id, $this->company); $this->flashMessage('common.database.operation-success', FlashMessage::GOOD); //$this->redirect('this#meal-list'); $this->redrawControl('flash-message'); $this->redrawControl('add-meal-block-form-edit'); } a view: {snippet addMealBlock} {form addMealBlockForm, class => "meal-form ajax"} <div class="row"> {input mealBlock, class => "meal-headline required"} {input add, class => "no-button add-item add-block to-left"} </div> {/form} {/snippet} {snippet addMeal} {form addMealForm, class => "last meal-form ajax"} <div class="row"> {input mealName, class => "name required"} {input moreInfo, class => "more-info"} {input mealBlock} {input add, class => "no-button add-item add-meal"} {input price, class => "price required"} <div class="error" n:if="$form['price']->getError()">{_$form['price']->getError()}</div> </div> {/form} {/snippet} <div class="required-info">{_admin.settings.meal-list.required-info}</div> {snippet listDietGroups} <div class="generated"> {foreach $company->dietGroups as $dietGroup} <div class="meal-block" id="MB_{$dietGroup->id}"> <div class="meal-headline">{$dietGroup->name}<a class="ajax" n:href="deleteMealBlock!, id => $dietGroup->id"><span class="delete delete-block"></span></a></div> {foreach $dietGroup->dietItems as $dietItem} <div class="meal"> <span class="name">{$dietItem->name}</span> <span class="more-info">{$dietItem->description}</span> <a class="ajax" n:href="deleteMeal!, id => $dietItem->id"><span class="delete"></span></a> <span class="price">{$dietItem->price},-</span> </div> {/foreach} </div> {/foreach} </div> {/snippet} Po této změně se to po načtení první odeslání formuláře nepošle a podruhe a dál jo Jan Tvrdík: Jinak první request: mealBlock=&do=addMealBlockForm-submit&add=& mealBlock=Ty&do=addMealBlockForm-submit&add=& Nechápu proč se do toho reguestu nedá obsah toho formu poprvé -.- Dělal jsem DIFF formuláře po vykreslení i potom jak to funguje a žádná změna |
||
Jan Tvrdík Profil |
„Nechápu proč se do toho reguestu nedá obsah toho formu poprvé“
Tak si debugni ten JS, ne? |
||
KarelEben Profil |
#5 · Zasláno: 23. 1. 2015, 09:00:20 · Upravil/a: KarelEben
Jan Tvrdík:
Ano posílám Jan Tvrdík: Jak přesně, ted Vás nechápu jak. |
||
Jan Tvrdík Profil |
#6 · Zasláno: 23. 1. 2015, 09:10:42
|
||
KarelEben Profil |
Tak ted vás nechápu již vůbec :( Jako skoušel jsem to debugovat pomocí konzole ale prostě se to odešle. Ale žádná data v tom inputu prej nejsou teda aspon se neposílají
|
||
Jan Tvrdík Profil |
#8 · Zasláno: 24. 1. 2015, 08:14:50
KarelEben:
Obecná strategie řešení problému s Ajaxem, snipetty a Nette je, že se nejprve koukneš na průběh HTTP komunikace a zjistíš, která strana udělala chybu jako první (buď klient nebo server). Následně se podíváš na zdrojový kód klienta resp. serveru a buď tě napadne, proč k té chybě dochází, nebo použiješ debugger. Pokud je problém se ve zdrojových kódech vyznat, tak chybu postupně izoluješ odmazáváním kódu, který nemá na chování vliv. Žádné složitosti v tom nejsou. |
||
Časová prodleva: 10 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0