Echo String не работает должным образом

Я использую cakePHP 2.x. Я пытаюсь отобразить представление с пустым макетом. Представление должно содержать только строку, возвращаемую контроллером действия без HTML-кода. Вот код:

public function checkout(){ $ref =null;$act=null;$par=null; $this->layout = false; //$this->render(false); //$priceCTP = $this->Session->read('priceCTP');; $priceCTP = $this->getPrice(); //var_dump(session_save_path()); if (isset($this->params['url']['Reference'])) { $ref = $this->params['url']['Reference']; } if (isset($this->params['url']['Action'])) { $act = $this->params['url']['Action']; } if (isset($this->params['url']['Param'])) { $par = $this->params['url']['Param'];//$_GET['Param'];//this->request->params['named'] } switch ($act) { case "DETAIL":// accéder à la base et récuperer le montant echo "Reference=".$ref."&Action=".$act."&Reponse=".$priceCTP; break; case "ERREUR": // accéder à la base et mettre à jour l'état de la transaction echo "Reference=".$ref. "&Action=".$act. "&Reponse=OK"; break; case "ACCORD": // accéder à la base, enregistrer le numéro d'autorisation (dans param) echo "Reference=".$ref. "&Action=".$act. "&Reponse=OK"; break; case "REFUS": // accéder à la base et mettre à jour l'état de la transaction echo "Reference=".$ref. "&Action=".$act. "&Reponse=OK"; break; case "ANNULATION": // accéder à la base et mettre à jour l'état de la transaction echo "Reference=".$ref. "&Action=".$act. "&Reponse=OK"; break; } } 

результат по этому URL- адресу ( http: // mydomain / orders / checkout ?

 Reference=123&Action=DETAIL&Param=) "Reference=123&Action=DETAIL&Repon" rather than "Reference=123&Action=DETAIL&Reponse=121,630" (works fine on localhost). 

Не эхо-данные от контроллеров

Как упоминалось в комментариях, действия контроллера не должны эхо-данных, даже если они могут работать в некоторых, возможно, даже в большинстве ситуаций. Правильный способ вывода данных – использовать (данные), настраивать и возвращать объект ответа или даже возвращать строку (которая, однако, не совместима с будущими версиями CakePHP).

Эховые данные могут приводить к возникновению всех проблем, поскольку данные не распознаются в тестовой среде, чтобы заголовки не могли быть отправлены и даже данные были обрезаны, и это то, что вы испытываете. Последнее может, например, произойти, когда размер, отправленный в заголовке Content-Length , не соответствует фактическому размеру отправляемых данных, это часто происходит в ситуациях, когда контент gzipped.

Несоответствие длины контента, вероятно, является причиной

Если вы столкнулись с проблемой несоответствия длины для проблемы с gzipped-ответами, вам нужно выяснить, где задействовано сжатие (на уровне сервера (например, mod_deflate ), на уровне расширения PHP (например, zlib ), на уровне кода PHP ( например CakeResponse::compress() ), и почему он не устанавливает надлежащую длину соответственно.

Правильная логика действий контроллера

При этом просто передайте требуемые данные в представление, а затем создайте и откликните данные ответа оттуда. Учитывая, что вы не хотите отвечать HTML, вы, вероятно, также хотите установить тип ответа соответственно:

 public function checkout() { $this->response->type('text'); // = text/plain // ... $this->set(compact(array('priceCTP', 'ref', 'act', 'par'))); } 

Как уже упоминалось, другим вариантом было бы возвращение надлежащего объекта ответа:

 public function checkout() { $this->response->type('text'); // ... $body = "Reference=" . $ref . "&Action=" . $act . "&Reponse="; switch ($act) { case "DETAIL": $body .= $priceCTP; break; case "ERREUR": case "ACCORD": case "REFUS": case "ANNULATION": $body .= "OK"; break; // ... } // ... $this->response->body($body); return $this->response; } 

пс. вы действительно хотите ответить ключом на французском? Reponse может быть Response .

имп. учитывая, что вы отвечаете строкой запроса, вам может понадобиться / необходимо URL кодировать значения соответственно.

Смотрите также

  • Поваренная книга> Контроллеры> Действия контроллера
  • Cookbook> Контроллеры> Запрос> Объекты запроса и ответа> CakeResponse> Работа с типами содержимого