Při ajaxu se pošle odpověď a zbytek stránky

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

Zdravím,

do dneška mi všechno jako jak má, ale najednou se mu nechce.

Na stránce mám select s kraji, po změně kraje, se pošle GET požadavek a jako odpověď mi přijde seznam měst v daném kraji.

JS

<?php
$(".countrySelect").change(function() {
var country = $(".countrySelect").val();
	$.get("?do=loadCities", {"value": country}, function (payload) {
......
?>

HANDLE

<?php
public function handleLoadCities($value) {
....
echo '{"select": "'. $this->pom .'"}';
// popř. echo json_encode($this->pom);
?>

Takto mi to vše do dneška fungovalo jak má.

Ale nyní se vrací odpověď ve formátu:

POŽADOVANÁ ODPOVĚĎ + </pre></xmp></table><!DOCTYPE HTML ..... + Cannot send header after HTTP headers have been sent (a označuje řádek výše, právě s tím echo)

Zkoušel jsem přidat za echo $this->sendPayload(); nebo jsem našel nějaký BOM a přidal ho do startup() metody BasePresenteru, ale bohužel, pořád žádná změna.

Nevíte? Děkuji mnohokrát.

Nette 0.9.6 PHP 5.2

bojovyletoun
Člen | 667
+
0
-
  • za prvé bych místo "?do=loadCities" psal "loadCities!".
  • to, že v handle napíšeš echo něco, způsobí, že se ti na začátek stránky( tedy ještě před <html>) vypíše něco a pak se k tomu přidá celá stránka
  • zkusil bych this->payload="...";this->sendPayload()
  • ale je mi záhadou, jak to mohlo fungovat – posílal se opravdu jen JSON?

Editoval bojovyletoun (16. 1. 2011 13:26)

wise
Člen | 161
+
0
-

No právě že fungovalo. Proto jsem pokračoval dál, dokončil modul a poté mi tester řekl, že to nefunguje.

Tak jsem to upravil na:

<?php
$this->payload = json_encode($this->pom); // také: $this->payload = $this->pom;
$this->sendPayload();
?>

Ale hází mi to chybu Cannot assign to a read-only property Presenter::$payload.

A místo ?do=loadCities nemůžu dát loadCities!, jelikož to nemám jako klasický odkaz, ale ajax get požadavek, jak je výše a to se handle vůbec neprovede.

wise
Člen | 161
+
0
-

Ještě teda možná jedna pomocná věc. Vypíše mi to JSON, potom

</pre></xmp></table>

což absolutně nevím, kde se to vzalo, nikde v souborech to není a potom zbytek stránky, ale to je laděnka a to Cannot send header after HTTP headers have been sent. Což jsem vlastně psal ale výše :/

wise
Člen | 161
+
0
-

Popř. se nebráním tomu, jestli byste mi nenaznačili, jak udělat v nette jiným způsobem následující:

Mám formulář, klasicky jako továrničku.
V něm mám také 2 selecty.
Při změně jednoho si nahraju potřebné hodnoty (option)
a změním hodnoty v druhém selectboxu.

Momentálně to řeším tak, že jeden smažu a na jeho místo kompletně nahraju druhý.

Děkuji mnohokrát.

wise
Člen | 161
+
0
-

Ok, díky, a nějak vyřešit ten problém obecně? Takto se to vyřešilo pro select, ale ne pro ostatní ajax požadavky.

wise
Člen | 161
+
0
-

Resp. nechci použít toto, ale opravit to :)

newPOPE
Člen | 648
+
0
-

vzdy som pouzival

<?php
	$this->payload->foo = $foo; //anything
	$this->sendPayload();
?>

cize ziadne json_encode(…) ani echo $this->payload to nette robi samo…

neviem (asi som divny :-D) ale nie je mi jasne co presne potrebujes?.

  • lieta ti zo servera AJAXom divny vystup?
wise
Člen | 161
+
0
-

newPOPE napsal(a):

vzdy som pouzival

<?php
	$this->payload->foo = $foo; //anything
	$this->sendPayload();
?>

cize ziadne json_encode(…) ani echo $this->payload to nette robi samo…

neviem (asi som divny :-D) ale nie je mi jasne co presne potrebujes?.

  • lieta ti zo servera AJAXom divny vystup?

No chlape, nejsi divny, je to přesně to, co jsem potřeboval :)

Předtím mi radili použití $this->payload = $foo, ale to co jsi poslal ty, to je přesně ono :)

Takže problém vyřešen, snad to někomu pomůže v budoucnu.

Děkuji mnohokrát.