AJAX – odesílání proměnné do presenteru
- Zerig
- Člen | 70
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.
- Zerig
- Člen | 70
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.
- je vůbec nějaký request odesílán?
- nevrací 500?
- 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?
- Zerig
- Člen | 70
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
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
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
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.
- Zerig
- Člen | 70
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
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
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
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
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
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
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
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
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í dourl
?
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
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.