Я использую 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 кодировать значения соответственно.
Смотрите также