Ajaxový formulář neobnoví snippet: NS_ERROR_ILLEGAL_VALUE

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
buff
Člen | 63
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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)