CakePHPでビュー間で配列を送信する方法
-
03-07-2019 - |
質問
質問を正しく作成したかどうかはわかりませんが、それでも...
フラッシュの埋め込みを表示するビューがあり、このフラッシュはXMLを生成する / controller / action
URLをパラメーターとして受け取ります。このビューから、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>";
解決
まず第一に、あなたが話している方法で、あるビューから別のビューにデータを送信することはできません。これらの呼び出しはそれぞれ個別の要求になります。つまり、フレームワークから出て、再び入ります。つまり、フレームワークが構築され、呼び出し間で破棄され、ビュー間でデータを渡すことができなくなります。
今、あなたのアクションに送らなければならない配列に関して、私は全く混乱しています。あなたが問題を正しい方法で見ているとは思わない。そのアクションにデータの配列が必要な場合、Flashオブジェクトが取得できるようにXMLを生成すると、さらに意味がなくなります。 Flashオブジェクトは、あなたが言及したParamにそのデータの配列を送信する責任を負っていませんか?
さて、あなたが言っていることがすべてそのように行われなければならないとしても、その配列をファイルシステムにドロップし、Flashによってアクションが呼び出されたときにそれをピックアップすることをお勧めします。
または別の提案は、AJAXを使用してその配列をアクションに送信することです。
両方の提案は、私の「無知」を意味します。述語で。
私はまだ質問する必要があります、Flashオブジェクトはこれすべてで何かをするつもりはないのですか?
他のヒント
配列が十分に小さい場合は、シリアライズしてからurlencodeし、生成アクションのURLにパラメーターとして追加します。
player.ctp
so.addVariable('file','/xml/generate/<?php echo urlencode(serialize($array)); ?>');
次に読み返します:
public function generate($array) {
$array = unserialize($array);
}
配列をセッションに保存してから、XMLジェネレーターアクションへの次のリクエストで、セッションから配列を読み戻します。
my_controller.php
function player() {
$this->Session->write('key', $array);
}
xml_controller.php
public function generate() {
$array = $this->Session->read('key');
}
ただし、FlashがセッションCookieを送信しない場合があるという問題を聞いたことがあります。この場合、セッションIDをアクションの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'];
もちろん、配列は大きすぎてはいけません。