Ajaxový formulář neobnoví snippet: NS_ERROR_ILLEGAL_VALUE
- buff
- Člen | 63
Zdravím. Válčím s Ajaxem, prohrávám a tak prosím o radu ;-)
Chtěl bych: formulář s kolonkami jméno a příjmení, vyplním, submitnu, a jméno a příjmení se napíše dole pod formulářem.
Mé provedení je následující:
Presenter:
<?php
class DefaultPresenter extends Presenter
{
public function renderDefault()
{
$form = new Form;
$form->setMethod('POST');
$form->addText('firstName', 'First name:');
$form->addText('lastName', 'Last name:');
$form->addSubmit('update', 'Update');
$form->onSubmit[] = array($this, 'handleUpdate');
$this->template->form = $form;
$this->template->firstName = '';
$this->template->lastName = '';
}
public function handleUpdate(Form $form)
{
$values = $form->getValues();
$this->template->firstName = $values['firstName'];
$this->template->lastName = $values['lastName'];
$this->invalidateControl('name');
}
}
?>
Šablona:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Ajax Form</title>
<script src="{$baseUri}js/jquery-1.3.2.js" type="text/javascript"></script>
<script src="{$baseUri}js/jquery.nette.js" type="text/javascript"></script>
<script src="{$baseUri}js/jquery.ajaxform.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function(){
$("form").submit(function () {
$(this).ajaxSubmit();
return false;
});
$("form :submit").click(function () {
$(this).ajaxSubmit();
return false;
});
})
</script>
</head>
<body>
{$form}
{snippet name}{$firstName} {$lastName}{/snippet}
</body>
</html>
Problém: po kliknutí na Submit se stránka znovu načte a ještě než se tak stane, mohu si přečíst (pokud to stihnu ;-)) v konzoli Firebugu tři chybová hlášení:
[Exception... "Component returned failure code: 0x80070057 (NS_ERROR_ILLEGAL_VALUE) [nsIXMLHttpRequest.open]" nsresult: "0x80070057 (NS_ERROR_ILLEGAL_VALUE)" location: "JS frame :: http://localhost/nic/document_root/js/jquery-1.3.2.js :: anonymous :: line 3517" data: no]
http://localhost/nic/document_root/js/jquery-1.3.2.js
Line 1296
[Exception... "Component returned failure code: 0x80070057 (NS_ERROR_ILLEGAL_VALUE) [nsIXMLHttpRequest.open]" nsresult: "0x80070057 (NS_ERROR_ILLEGAL_VALUE)" location: "JS frame :: http://localhost/nic/document_root/js/jquery-1.3.2.js :: anonymous :: line 3517" data: no]
http://localhost/nic/document_root/js/jquery-1.3.2.js
Line 3517
this.docShell.contentViewer is null
http://localhost/nic/document_root/js/jquery-1.3.2.js
Line 1296
Omlouvám se za nadstandardní délku příspěvku, chtěl jsem to jasně popsat. Díky a těším se na každou radu.
- Ondřej Mirtes
- Člen | 1536
Klasika, vytváříš formulář moc pozdě (máš ho vytvářet v prepare metodě nebo v createComponent továrničce). Přepsal bych ten Presenter nějak takto (z hlavy, nezkoušel jsem to):
<?php
class DefaultPresenter extends Presenter
{
public function createComponentForm($name) {
$form = new AppForm($this, $name);
$form->addText('firstName', 'First name:');
$form->addText('lastName', 'Last name:');
$form->onSubmit[] = array($this, 'formSubmit');
$form->addSubmit('update', 'Update');
}
public function renderDefault()
{
$this->template->form = $this->getComponent('form');
if (!$this->template->form->isSubmitted()) {
$this->template->firstName = '';
$this->template->lastName = '';
}
}
public function formSubmit(AppForm $form)
{
$values = $form->getValues();
$this->template->firstName = $values['firstName'];
$this->template->lastName = $values['lastName'];
$this->invalidateControl('name');
}
}
Kdyžtak se ptej, pokud něčemu nerozumíš :)
Editoval LastHunter (6. 7. 2009 14:11)
- buff
- Člen | 63
Mockrát děkuju. Rozumím, funguje.
Jediná drobnost: Porovnával jsem to s tím, co se píše na stránce Nette\Application\Presenter dole a chybí mi tam nějaká obdoba řádku
$this->addComponent($fifteen, $name);
A stejně to funguje. Nerozumím, jak se ta lokální proměnná $form uchová a vrátí při volání getComponent(). Je v tom nějaká „magie“? :-)
- jasir
- Člen | 746
A stejně to funguje. Nerozumím, jak se ta lokální proměnná $form uchová a vrátí při volání getComponent(). Je v tom nějaká „magie“? :-)
Stará se o to:
<?php
case 'form':
$form = new AppForm($this, $name);
?>
Tím se zařadí instance AppForm do stromu komponent presenteru
$this
pod názvem form
.
Alternativně se dá psát:
<?php
$form = new AppForm();
...
$this->addComponent($form,'form');
?>
Editoval jasir (6. 7. 2009 15:31)