Как отправлять массивы между представлениями в CakePHP

StackOverflow https://stackoverflow.com/questions/161794

  •  03-07-2019
  •  | 
  •  

Вопрос

Не уверен, правильно ли я сформулировал вопрос, но все же...

У меня есть представление, которое показывает встраивание флэш-памяти, и эта флэш-память принимает в качестве параметра a /controller/action URL-адрес, который генерирует XML.Из этого представления мне нужно отправить массив в действие генератора XML.Как лучше всего?Есть ли какой-нибудь helper->set() такой метод, как или мне нужно создать определенный URL-адрес, чтобы отправить этот массив на это действие?

Вот моя структура:

my_controller.php

function player() {}

player.ctp

<div id="myDiv">Here it Goes</div>
<script type="text/javascript">
  var so = new SWFObject('player.swf','test','50','50','8');
  so.addVariable('file','/xml/generate'); // need to pass an array here
  so.write('myDiv');
</script>

xml_controller.php

public function generate() {
  // I need to read an array here
}

generate.ctp

echo "<xml><data>" . $array['contents'] . "</data>";
Это было полезно?

Решение

Прежде всего, вы не можете передавать данные из одного представления в другое так, как вы говорите.Каждый из этих вызовов будет отдельным запросом, а это означает, что он выходит за рамки, а затем снова входит.Это означает, что фреймворк будет создаваться и разрушаться между вызовами, что делает невозможным передачу данных между представлениями.

Что касается массива, который необходимо отправить в ваше действие, я в полном замешательстве.Я не думаю, что вы смотрите на проблему правильно.Если для этого действия требуется массив данных, а затем создается XML, чтобы Flash-объект мог его получить, тогда это имеет еще меньше смысла.Вы уверены, что объект Flash не отвечает за отправку этого массива данных в упомянутый вами параметр?

Что ж, даже если все, что вы говорите, должно быть сделано именно так, я предлагаю вам поместить этот массив в файловую систему, а затем поднять его, когда действие будет вызвано Flash.

Или еще одно предложение — использовать AJAX для отправки этого массива в действие.

Оба предложения подразумевают мое полное «незнание» вашего предиката.

Я все еще должен спросить, не собирается ли Flash Object что-то сделать со всем этим?

Другие советы

Если массив достаточно мал, сериализуйте его, затем закодируйте его и добавьте в качестве параметра в URL-адрес вашего действия создания:

player.ctp

so.addVariable('file','/xml/generate/<?php echo urlencode(serialize($array)); ?>');

затем перечитайте его:

public function generate($array) {
  $array = unserialize($array);
}

Сохраните массив в сеансе, а затем в следующем запросе к действию генератора XML прочитайте его обратно из сеанса.

мой_контроллер.php

function player() {
  $this->Session->write('key', $array);
}

xml_controller.php

public function generate() {
  $array = $this->Session->read('key');
}

Однако я слышал о некоторых проблемах, когда Flash иногда не отправляет файлы cookie сеанса, и в этом случае добавьте идентификатор сеанса к URL-адресу действия:

so.addVariable('file','/xml/generate/<?php echo $session->id(); ?>');

и чтобы вернуть сеанс:

public function generate($sessionId) {
  CakeSession::id($sessionId);
  $array = $this->Session->read('key');
}

Вы можете отправить массив с данными из представления на контроллер в CakePHP следующим образом.

По ссылке можно передать аргументы:

www.site.com/model/action/param1:foo/param2:test

Затем вы можете получить их в действии контроллера следующим образом:

$yourarray = $this->params['named'];

Конечно, тогда массив не должен быть слишком большим.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top