Formulář se neodesílá AJAXEM
- thm
- Člen | 147
Zdravím Vás,
zase jsem se po delší době dostal k Nette a mám problém s AJAXovým
odesláním formuláře. Nevím v čem je problém.
Form:
$form = $this->formFactory->create(); //new \Nette\Application\UI\Form;
$form->getElementPrototype()->class('ajax');
...
$form->addSubmit('send', 'Submit');
$form->onSuccess[] = [$this, 'reportFormSucceeded']; //funkce existuje, ale je prázdná
V šabloně ho vygeneruji normálně {control reportForm}
,
vygeneruje se s class=„ajax“
<form action="/game/?id=069b5bb83d" method="post" class="ajax" id="frm-reportForm">
Formulář se prostě ajaxově neodešle, přestože u odkazu, který mám
nad formulářem
<a n:href="test!" class="ajax">Test</a>
se požadavek
pošle normálně ajaxem. Nevíte, kde by mohl být zakopaný pes?
- GEpic
- Člen | 566
$form = $this->formFactory->create(); //new \Nette\Application\UI\Form;
$form->getElementPrototype()->class('ajax');
Tohle dělat nemusíš – smaž to. A přidej ajax
třídu
tomu tlačítku ve formuláři.
$form->addSubmit('send', 'Submit')
->setAttribute("class", "ajax");
Editoval GEpic (5. 11. 2017 15:07)
- thm
- Člen | 147
Jo, už jsem se zorientoval :) Díky za radu. Já zase nikdy nedával třídu
ajax tlačítku. Nicméně snad by mělo být oboje možné. Button se
vygeneruje
<input type="submit" name="send" class="ajax button" value="Submit">
–
takže podle mě v pořádku. Přesto se stránka refreshne (požadavek se
ajaxem neodešle).
Hned pod/nad formulářem mám
<a n:href="reportGame!" class="ajax">{_messages.reporter.demoBroken}</a>
a to se ajaxem normálně odesílá…
Editoval thm (5. 11. 2017 15:19)
- GEpic
- Člen | 566
Pokud používá nette.ajax.js tak
netteForms.js
nepotřebuje. A omlouvám se @thm ale jak si
psal tak třída ajax
na formu by měla taky fungovat…
Editoval GEpic (6. 11. 2017 9:39)
- rkor
- Člen | 62
GEpic napsal(a):
Pokud používá nette.ajax.js tak
netteForms.js
nepotřebuje. A omlouvám se @thm ale jak si psal tak třídaajax
na formu by měla taky fungovat…
Nemám otestováno, ale našel jsem tohle, tak mě napadla souvislost:
https://github.com/…s/issues/148
- GEpic
- Člen | 566
rkor napsal(a):
GEpic napsal(a):
Pokud používá nette.ajax.js tak
netteForms.js
nepotřebuje. A omlouvám se @thm ale jak si psal tak třídaajax
na formu by měla taky fungovat…Nemám otestováno, ale našel jsem tohle, tak mě napadla souvislost:
https://github.com/…s/issues/148
Používám nette.ajax.js
a netteForms.js
k němu
nepotřebuješ, poté použiju inicializaci a již ajax funguje.
Editoval GEpic (7. 11. 2017 11:06)
- thm
- Člen | 147
Díky za pomoc @GEpic, @rkor a @chemix. @GEpic
není vůbec za co se omlouvat.
Zkusil jsem to na novém projektu znovu.
- Stáhnul jsem si web-project
composer create-project nette/web-project forms
- Součástí web-project je v
@layout.latte
nalinkovaný<script src="https://nette.github.io/resources/js/netteForms.min.js"></script>
, zakomentuji, protože není třeba - Stáhnu jQuery
- Stáhnu nette.ajax (2.3.0)
Můj @layout.latte vypadá nyní takto:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>{ifset title}{include title|stripHtml} | {/ifset}Nette Web</title>
</head>
<body>
<div n:foreach="$flashes as $flash" n:class="flash, $flash->type">{$flash->message}</div>
{include content}
{block scripts}
{*<script src="{$basePath}/js/netteForms.min.js"></script>*}
<script src="{$basePath}/js/jquery-3.2.1.min.js"></script>
<script src="{$basePath}/js/nette.ajax.js"></script>
<script>
$(function () {
$.nette.init();
});
</script>
{/block}
</body>
</html>
V presenteru vytvořím toto:
<?php
namespace App\Presenters;
use Nette;
class HomepagePresenter extends Nette\Application\UI\Presenter
{
/** @persistent */
public $value = 1;
public function renderDefault()
{
$this->template->value = $this->value;
}
public function handleIncreaseValue()
{
++$this->value;
$this->isAjax() ? $this->redrawControl('value') : $this->redirect('this');
}
public function createComponentForm()
{
$form = new \Nette\Application\UI\Form;
$form->addText('newValue');
$form->addSubmit('send')
->setAttribute('class', 'ajax');
$form->onSuccess[] = [$this, 'formSucceeded'];
return $form;
}
public function formSucceeded(\Nette\Application\UI\Form $form, $values)
{
$this->value = $values->newValue;
$this->isAjax() ? $this->redrawControl('value') : $this->redirect('this');
}
}
A nakonec šablona default.latte
{block content}
{snippet value}
{$value}
{/snippet}
<a n:href="increaseValue!" class="ajax">Increase value</a>
{control form} {* vygeneruje třídu ajax u submitu <input type="submit" name="send" class="ajax button">*}
V této konfiguraci se mi odesílá ajaxově pouze
<a n:href="increaseValue!" class="ajax">Increase value</a>
,
formulář se redirectne.
@chemix při posílání požadavku se v consoli objeví chyba (omlouvám se jsem JS totalmimoň):
Uncaught ReferenceError: Nette is not defined
at Object.before (nette.ajax.js:319)
at Function.<anonymous> (nette.ajax.js:42)
at Function.each (jquery-3.2.1.min.js:2)
at Object.fire (nette.ajax.js:40)
at Object.settings.beforeSend (nette.ajax.js:215)
at Function.ajax (jquery-3.2.1.min.js:4)
at nette.ajax (nette.ajax.js:225)
at HTMLInputElement.requestHandler (nette.ajax.js:48)
at HTMLFormElement.dispatch (jquery-3.2.1.min.js:3)
at HTMLFormElement.q.handle (jquery-3.2.1.min.js:3)
Jakmile ale odkomentuji
{*<script src="{$basePath}/js/netteForms.min.js"></script>*}
tak i formulář se odesílá ajaxově!
Takže je zde nějaká závislost na netteForms.js (jak
píše @rkor).
Další otázka – tentokrát za zlatého
bludišťáka:
Mimochodem, pokud klikám na Increase value po prvním ajaxu se
překreslí value na 2, po každém dalším kliknutí se překresluje zase
s hodnotou 2. Přitom jsem přesvědčen, že kdysi mi toto fungovalo a
hodnota value by se o jedno zvětšovala. Pokud odeberu třídu ajax odkazu,
tak vše funguje normálně (value se načítá o 1). Co to?
- vladimir.biro
- Člen | 163
thm napsal(a):
Díky za pomoc @GEpic, @rkor a @chemix. @GEpic není vůbec za co se omlouvat.
Zkusil jsem to na novém projektu znovu.
- Stáhnul jsem si web-project
composer create-project nette/web-project forms
- Součástí web-project je v
@layout.latte
nalinkovaný<script src="https://nette.github.io/resources/js/netteForms.min.js"></script>
, zakomentuji, protože není třeba- Stáhnu jQuery
- Stáhnu nette.ajax (2.3.0)
Můj @layout.latte vypadá nyní takto:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width"> <title>{ifset title}{include title|stripHtml} | {/ifset}Nette Web</title> </head> <body> <div n:foreach="$flashes as $flash" n:class="flash, $flash->type">{$flash->message}</div> {include content} {block scripts} {*<script src="{$basePath}/js/netteForms.min.js"></script>*} <script src="{$basePath}/js/jquery-3.2.1.min.js"></script> <script src="{$basePath}/js/nette.ajax.js"></script> <script> $(function () { $.nette.init(); }); </script> {/block} </body> </html>
V presenteru vytvořím toto:
<?php namespace App\Presenters; use Nette; class HomepagePresenter extends Nette\Application\UI\Presenter { /** @persistent */ public $value = 1; public function renderDefault() { $this->template->value = $this->value; } public function handleIncreaseValue() { ++$this->value; $this->isAjax() ? $this->redrawControl('value') : $this->redirect('this'); } public function createComponentForm() { $form = new \Nette\Application\UI\Form; $form->addText('newValue'); $form->addSubmit('send') ->setAttribute('class', 'ajax'); $form->onSuccess[] = [$this, 'formSucceeded']; return $form; } public function formSucceeded(\Nette\Application\UI\Form $form, $values) { $this->value = $values->newValue; $this->isAjax() ? $this->redrawControl('value') : $this->redirect('this'); } }
A nakonec šablona default.latte
{block content} {snippet value} {$value} {/snippet} <a n:href="increaseValue!" class="ajax">Increase value</a> {control form} {* vygeneruje třídu ajax u submitu <input type="submit" name="send" class="ajax button">*}
V této konfiguraci se mi odesílá ajaxově pouze
<a n:href="increaseValue!" class="ajax">Increase value</a>
, formulář se redirectne.@chemix při posílání požadavku se v consoli objeví chyba (omlouvám se jsem JS totalmimoň):
Uncaught ReferenceError: Nette is not defined at Object.before (nette.ajax.js:319) at Function.<anonymous> (nette.ajax.js:42) at Function.each (jquery-3.2.1.min.js:2) at Object.fire (nette.ajax.js:40) at Object.settings.beforeSend (nette.ajax.js:215) at Function.ajax (jquery-3.2.1.min.js:4) at nette.ajax (nette.ajax.js:225) at HTMLInputElement.requestHandler (nette.ajax.js:48) at HTMLFormElement.dispatch (jquery-3.2.1.min.js:3) at HTMLFormElement.q.handle (jquery-3.2.1.min.js:3)
Jakmile ale odkomentuji
{*<script src="{$basePath}/js/netteForms.min.js"></script>*}
tak i formulář se odesílá ajaxově!
Takže je zde nějaká závislost na netteForms.js (jak píše @rkor).Další otázka – tentokrát za zlatého bludišťáka:
Mimochodem, pokud klikám na Increase value po prvním ajaxu se překreslí value na 2, po každém dalším kliknutí se překresluje zase s hodnotou 2. Přitom jsem přesvědčen, že kdysi mi toto fungovalo a hodnota value by se o jedno zvětšovala. Pokud odeberu třídu ajax odkazu, tak vše funguje normálně (value se načítá o 1). Co to?
Skus to takto:
<?php
{block content}
{snippet value}
{$value}
<a n:href="increaseValue!" class="ajax">Increase value</a>
{/snippet}
{control form} {* vygeneruje třídu ajax u submitu <input type="submit" name="send" class="ajax button">*}
?>
Myslim, ze ten button by sa tiez mal nacitat nanovo, ked chces, aby robil nieco ine (kedze zakazdym zvysuje hodnotu value, tak ma zakazdym inu funkciu). Takze button by tiez mal byt v snippete a mal by byt nanovo vracany presenterom. Ked z procesu odstranis ajax, tak sa ti rfresne cela stranka a tym padom aj button a tym padom to funguje :)
Daj vediet ci to pomohlo.
- thm
- Člen | 147
@vladimir.biro Máš pravdu, fakt je to tím :) – ono to vlastně musí vygenerovat nový odkaz – to jsem si vůbec neuvědomil. Díky moc, máš u mě toho bludišťáka ;) (pokud mi pošleš kontaktní údaje na e-mail – teď jsem koukal, že ho fakt prodávají, tak musím dostát svých slibů)
Editoval thm (7. 11. 2017 20:52)
- vladimir.biro
- Člen | 163
thm napsal(a):
@vladimir.biro Máš pravdu, fakt je to tím :) – ono to vlastně musí vygenerovat nový odkaz – to jsem si vůbec neuvědomil. Díky moc, máš u mě toho bludišťáka ;) (pokud mi pošleš kontaktní údaje na e-mail – teď jsem koukal, že ho fakt prodávají, tak musím dostát svých slibů)
Ajej .. to je hodne oskliva vec … Dik, nechci! :D
- chemix
- Nette Core | 1310
@thm Ano je tam zavislost pokud pracujes s formularem, tak ho nette.ajax chce validovat skrze Nette.forms viz https://github.com/…ette.ajax.js#L323