AJAX – odesílání proměnné do presenteru

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

Zdravím,
potřeboval bych poradit jak zobrazit hodnotu select boxu do proměnné $foo

		<select id="one">
				<option>jedna</option>
				<option>dva</option>
				<option>tři</option>
		</select>
		{snippet pokus}
			{$foo}
		{/snippet}

		<script>
			$("#one").live('change', function () {
				$.nette.ajax({
				type: 'GET',
				url: '{link changeFoo!}',		// Je toto správně???
				data: {
				'prom': $('#one').val(),
				}
				});
			});
		</script>

Presenter:

	private $foo = 'any value';

	public function handleChangeFoo($prom){
		$this->foo = $prom;

		if ($this->isAjax()){
			$this->invalidateControl('pokus');
		}
	}

	public function beforeRender()
	{
		$this->template->foo = $this->foo;
	}

Děkuji za ochotu.

elevate
Člen | 31
+
0
-

ahoj,

nevidím v tom problém, jen bych teda spíš použil normální Nette/Forms, pak bys toto ani nemusel řešit. Jen bys odesílal formulář na „change“ event toho selectu.

e.

Zerig
Člen | 70
+
0
-

elevate napsal(a):

ahoj,

nevidím v tom problém, jen bych teda spíš použil normální Nette/Forms, pak bys toto ani nemusel řešit. Jen bys odesílal formulář na „change“ event toho selectu.

e.

No problém je že to tu hodnotu nezmění a já nevím kde je problém.

elevate
Člen | 31
+
0
-

aha, tak google chrome debugger / firebug (nevím co máš za prohlížeč) a podívej se co ti vrací ten ajax request.

  1. je vůbec nějaký request odesílán?
  2. nevrací 500?
  3. vrací co má?

za chvilku se dobádáš k problému :)

Firefox – konzole
Chrome – network

Zerig
Člen | 70
+
0
-

elevate napsal(a):

aha, tak google chrome debugger / firebug (nevím co máš za prohlížeč) a podívej se co ti vrací ten ajax request.

  1. je vůbec nějaký request odesílán?
  2. nevrací 500?
  3. vrací co má?

za chvilku se dobádáš k problému :)

Firefox – konzole
Chrome – network

Je tam 500 Internal Server Error
Co s tím?

elevate
Člen | 31
+
0
-

mrkni do logu.

sandbox/log/

budeš tam mít html soubor s popisem chyby.

Zerig
Člen | 70
+
0
-

elevate napsal(a):

mrkni do logu.

sandbox/log/

budeš tam mít html soubor s popisem chyby.

No mám tu 4 chybové soubory. Ale to jsou chyby které nejsou aktuální.

elevate
Člen | 31
+
0
-

tak to zkus bez ajaxu.

?do=changeFoo&prom=test

Zerig
Člen | 70
+
0
-

elevate napsal(a):

tak to zkus bez ajaxu.

?do=changeFoo&prom=test

To funguje dobře

elevate
Člen | 31
+
0
-

ouha, tak to je nějaký divoký :)
Jestli to vrací 500, tak něco určitě musí být v error.log. Jinak ti asi nepomůžu.

Jinak promaž cache, ale to jsi počítam zkoušel jako první. :)

Editoval elevate (9. 10. 2013 15:22)

Zerig
Člen | 70
+
0
-

elevate napsal(a):

ouha, tak to je nějaký divoký :)
Jestli to vrací 500, tak něco určitě musí být v error.log. Jinak ti asi nepomůžu.

Jinak promaž cache, ale to jsi počítam zkoušel jako první. :)

vymazat cache nepomáhá.

Tohle je error.log:

[2013-10-09 13-13-55] Fatal error: The variable 'end' does not exist in template. in /www/sites/3/site16243/public_html/sandbox/libs/Nette/Templating/Template.php:361  @  http://web.cz/%EF%BB%BFbook/%7Blink%20changeFoo!%7D?prom=NOV%C3%9D+Z%C3%81KON  @@  exception-2013-09-25-17-06-17-d4ddd5a5e39f29328ba20042101d2799.html
kytart
Člen | 10
+
0
-

Tu chybovou hlášku většinou taky nenajdu ve složce, když jí potřebuju, kdoví proč…
Když ale otevřeš info o requestu v Chrome debuggeru (firebug to určitě má podobně), máš tam někde úplně dole v první záložce absolutní cestu k tomu logu. Když tu cestu zkopíruješ do prohlížeče, otevře ti to jako stránku a zobrazí se ti chybová hláška, kterou to vyhodilo při tom requestu.
S tim už se pak dá pracovat, když víš, čím je chyba způsobená. Tak to udělej a napiš, k jaký chybě došlo :-)

jiri.pudil
Nette Blogger | 1032
+
0
-

máš tam někde úplně dole v první záložce absolutní cestu k tomu logu

Konkrétně je to response header X-Nette-Error-Log.

Zerig
Člen | 70
+
0
-

kytart napsal(a):

Tu chybovou hlášku většinou taky nenajdu ve složce, když jí potřebuju, kdoví proč…
Když ale otevřeš info o requestu v Chrome debuggeru (firebug to určitě má podobně), máš tam někde úplně dole v první záložce absolutní cestu k tomu logu. Když tu cestu zkopíruješ do prohlížeče, otevře ti to jako stránku a zobrazí se ti chybová hláška, kterou to vyhodilo při tom requestu.
S tim už se pak dá pracovat, když víš, čím je chyba způsobená. Tak to udělej a napiš, k jaký chybě došlo :-)

Děkuju za radu, chybu to vypisovalo v presenteru přesněji v renderDefault(), kde se proměnné po spuštění ajaxu smazali a nemohlo se správně vypsat z databáze.
Chybu jsem chtěl alespoň pro začátek vyřešit tím, že jsem z databáze vypisoval bez proměnné. Ale laděnka mi vypsala:

fopen(/www/sites/3/site16243/public_html/sandbox/temp/cache/_Nette.FileTemplate/_Book.default.latte-6db4b99a2ff8bca7e82f5370bcf89032.php): failed to open stream: Disk quota exceeded

1:    <?php
 2:
 3:    // Uncomment this line if you must temporarily take down your site for maintenance.
 4:    // require '.maintenance.php';
 5:
 6:    // Let bootstrap create Dependency Injection container.
 7:    $container = require __DIR__ . '/../app/bootstrap.php';
 8:
 9:    // Run application.
10:    $container->application->run();					// TADY JE PSÁNA TA CHYBA
11:

tak jsem to vrátil zpět, ale chyba přetrvává i když jsem vymazal cache.

jsvelta
Člen | 39
+
0
-

fopen(/www/sites/3/site16243/public_html/sandbox/temp/cache/_Nette.FileTemplate/_Book.default.latte-6db4b99a2ff8bca7e82f5370bcf89032.php): failed to open stream: Disk quota exceeded

Toto nebude chyba aplikácie :-)
Vyčerpal si miesto na disku, podľa hlášky OS.

Zerig
Člen | 70
+
0
-

jsvelta napsal(a):

fopen(/www/sites/3/site16243/public_html/sandbox/temp/cache/_Nette.FileTemplate/_Book.default.latte-6db4b99a2ff8bca7e82f5370bcf89032.php): failed to open stream: Disk quota exceeded

Toto nebude chyba aplikácie :-)
Vyčerpal si miesto na disku, podľa hlášky OS.

Moc se omlouvám, už jsem z toho hotovej. Tento problém vyřešen.
Nicméně naskočil další:
Trying to get property of non-object

Mám dojem že po spuštění ajaxu mám problém s proměnnými $this->template->… protože jsou prázdné.
čím by to mohlo být?

petr.pavel
Člen | 535
+
0
-

Budeš muset být konkrétnější. Pošli celou hlášku (property jakého objektu) a zdroják presenteru, ať vidíme, kde tu proměnnou/objekt plníš.

Zerig
Člen | 70
+
0
-

petr.pavel napsal(a):

Budeš muset být konkrétnější. Pošli celou hlášku (property jakého objektu) a zdroják presenteru, ať vidíme, kde tu proměnnou/objekt plníš.

Trying to get property of non-object

<?php
use Nette\Application\UI\Form;
/**
 * TaskPresenter presenter.
 */
class BookPresenter extends BasePresenter
{
	private $lineRepository;
	private $chapterRepository;
	private $orderRepository;

	private $chapter;
	private $chooseOne = array();


	//
	/** @var string */
    private $anyVariable;
	private $anyVariable2;
	private $subChap;

	private $discussStart;
	private $discussEnd;


    public function handleChangeVariable()
    {
        $this->anyVariable = 'changed value via ajax';
        if ($this->isAjax()) {
            $this->invalidateControl('ajaxChange');
        }
    }

	public function handleChangeVariable2()
    {
        $this->anyVariable2 = 3;
        if ($this->isAjax()) {
            $this->invalidateControl('ajaxChange2');
        }
    }




	//



	protected function startup()
	{
		parent::startup();
		$this->lineRepository = $this->context->lineRepository;	// volám jako službu
		$this->chapterRepository = $this->context->chapterRepository;	// volám jako službu
		$this->orderRepository = $this->context->orderRepository;	// volám jako službu
	}

	// Posila
	public function actionDefault($chap, $cap, $kap, $lap)
	{
		$this->template->chap = $chap;
		$this->template->kapitola = $this->orderRepository->query("SELECT * FROM `chapter` ch LEFT JOIN `order` o ON ch.ID=o.subID WHERE (o.chapterID=2) ORDER BY ID ASC")->fetchAll();


		$this->chooseOne = $this->orderRepository->query("SELECT * FROM `chapter` ch LEFT JOIN `order` o ON ch.ID=o.subID WHERE (o.subID=2) ORDER BY ID ASC")->fetchAll();

		$this->template->chooseOne = $this->chooseOne[0];	// pozice rolleru

		$this->template->cap = $cap;
		$this->template->kap = $kap;
		$this->template->lap = $lap;
		$this->chapter = $this->lineRepository->findBy(array('id' => $chap))->fetch();
		$this->template->h1 = $this->chapterRepository->findBy(array('id' => $chap))->fetch();
	}

	public function renderDefault()
	{
		$this->template->tasks = $this->lineRepository->findChapterLines($this->chapter);	// zápis do tasks

		// Odkud kam zacina diskuse na teto strankce
		$i=0;
		foreach($this->template->tasks as $tas)
		{
			$i++;
			if($i==1) $this->discussStart = $tas->ID;
			$this->discussEnd = $tas->ID;
		}
		$this->template->start = $this->discussStart;
		$this->template->end = $this->discussEnd;

		// Zápis do LATTE discuss
		//$this->template->discuss = $this->lineRepository->query("SELECT * FROM `discuss` WHERE `from`<=".$this->discussEnd." AND `from`>=".$this->discussStart." ORDER BY rank DESC")->fetchAll();
		$this->template->discuss = $this->lineRepository->query("SELECT * FROM `discuss` ORDER BY rank DESC")->fetchAll();
		/**/


		if ($this->anyVariable === NULL) {
            $this->anyVariable = 'default value';
        }
        $this->template->anyVariable = $this->anyVariable;

		if ($this->anyVariable2 === NULL) {
            $this->anyVariable2 = 'default value';
        }
        $this->template->anyVariable2 = $this->anyVariable2;




	}

}

Editoval Zerig (14. 10. 2013 15:39)

petr.pavel
Člen | 535
+
0
-

Vyrobil jsem stejnou hlášku a posílám ukázku, co je potřeba vidět, aby člověk pochopil, s jakým objektem pracuju. Z ní je vidět, že na řádce 14 souboru C:\wamp\www\…\temp\cache\_Nette.FileTemplate\_templates.Session.logIn.latte-14c75882f5f5575ae24a6147ab0d6c33.php
se odkazuji na $ahoj->test. Čili proměnná $ahoj není objekt. Dej vědět, jaký je ten tvůj objekt.

Zerig
Člen | 70
+
0
-

petr.pavel napsal(a):

Vyrobil jsem stejnou hlášku a posílám ukázku, co je potřeba vidět, aby člověk pochopil, s jakým objektem pracuju. Z ní je vidět, že na řádce 14 souboru C:\wamp\www\…\temp\cache\_Nette.FileTemplate\_templates.Session.logIn.latte-14c75882f5f5575ae24a6147ab0d6c33.php
se odkazuji na $ahoj->test. Čili proměnná $ahoj není objekt. Dej vědět, jaký je ten tvůj objekt.

pravděúpodobě jde o tu samou

Zerig
Člen | 70
+
0
-

Co nejvíc jsem to vykuchal a jen pro zkoušku mám tento asi lepší příklad:
ZkouskaPresenter.php

<?php
use Nette\Application\UI\Form;
/**
 * TaskPresenter presenter.
 */
class ZkouskaPresenter extends BasePresenter
{
	private $foo="text";
	public function handleChangeFoo($prom){
		$this->foo = $prom;

		if ($this->isAjax()){
			$this->invalidateControl('pokus');
		}
	}

	public function renderDefault()
	{
		$this->template->foo = $this->foo;;
	}

}

latte

{block nav}

{/block}
{block content}
<h1 n:block="title">Nesplněné úkoly</h1>
<select id="zk>
		<option>1</option>
		<option>2</option>
		<option>3</option>
		<option>4</option>
</select>

<a n:href="changeFoo! 'aaa'">changeFoo</a>

{snippet pokus}
<span style="background:red;color:white"> {$foo} </span>
{/snippet}

{/block}

{block discuss}
{/block}

javascript

$("#zk").live('change', function () {
	alert($('#zk').val());

	$.nette.ajax({
        type: 'GET',
        url: '{link changeFoo!}',
        data: {
            'prom': $('#zk').val(),
        }
    });

});

Po výběru ye selectu odkchytím chybu 500 Internal server error s touto hláškou:

No route for HTTP request.

 1:    <?php
 2:
 3:    // Uncomment this line if you must temporarily take down your site for maintenance.
 4:    // require '.maintenance.php';
 5:
 6:    // Let bootstrap create Dependency Injection container.
 7:    $container = require __DIR__ . '/../app/bootstrap.php';
 8:
 9:    // Run application.
10:    $container->application->run();					/// ZDE je označena chyba
11:

--EDIT
Jo a ještě jedná věc, když jsem přepsal v javascriptu: url: ‚{link changeFoo!}‘, na url: ‚/zkouska?do=changeFoo‘,

chyba 500 zmizela, dokoce i dostávám zkouska?do=changeFoo&prom=3, ale stejně to ic nemění.

Editoval Zerig (15. 10. 2013 16:25)

Zerig
Člen | 70
+
0
-

Už jsem něco pořešil a dostal se dál.
jquery.nette.js mi to nějak blokoval a proto nefungoval zápis:

url: '/zkouska?do=changeFoo'

Tak jsem ho smazal a teď už funguje, ale byl bych moc rád kdyby fungoval obecně tudíž na bázi:

url: '{link changeFoo!}'

Nevíte někdo, co je na něm špatně?

Editoval Zerig (15. 10. 2013 17:50)

petr.pavel
Člen | 535
+
0
-

stará chyba:
Díky za ten otisk obrazovky. Vyplývá z něj, že se snažíš zobrazit $h1->name. Z kódu, který jsi doposud poslal není vidět, že bys někde proměnnou $h1 plnil.

nová chyba:
Když se podíváš do zdrojáku šablony, kde máš ten javascript, co se ti skutečně plní do url?
Nedivil bych se, kdyby makro link escapovalo podle kontextu, tudíž výsledek by nebyl:
url: '/zkouska?do=changeFoo'
ale třeba
url: '"/zkouska?do=changeFoo"'
Jestli je to tak, odstraň apostrofy kolem makra link. Nově:
url: {link changeFoo!},

Zerig
Člen | 70
+
0
-

petr.pavel napsal(a):

stará chyba:
Díky za ten otisk obrazovky. Vyplývá z něj, že se snažíš zobrazit $h1->name. Z kódu, který jsi doposud poslal není vidět, že bys někde proměnnou $h1 plnil.

nová chyba:
Když se podíváš do zdrojáku šablony, kde máš ten javascript, co se ti skutečně plní do url?
Nedivil bych se, kdyby makro link escapovalo podle kontextu, tudíž výsledek by nebyl:
url: '/zkouska?do=changeFoo'
ale třeba
url: '"/zkouska?do=changeFoo"'
Jestli je to tak, odstraň apostrofy kolem makra link. Nově:
url: {link changeFoo!},

nová chyba:
v šabloně to nemám, ale dělá to toto jak píšeš: ‚„/zkouska?do=changeFoo“‘
odstraněním uvozovek se to ale nevyřeší jen se nespustí ani alert.

petr.pavel
Člen | 535
+
0
-

Nevěřím, že odstranění těch apostrofů (tj. opravení ‚„/zkouska?do=changeFoo“‘ na „/zkouska?do=changeFoo“) by mohlo něco rozbít.

Tohle ladění mě už přestává bavit. Jestli sis nevšiml, že se ti do toho javascriptu vkládají blbosti, tak ti není pomoci (takhle přes fórum). Jestli to někde vystavíš i se zdrojákama, tak se na to můžu podívat, ale jinak to vzdávám.