Как отправлять массивы между представлениями в CakePHP
-
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'];
Конечно, тогда массив не должен быть слишком большим.