環境: Windows 8 Apache 2.4 ZF 1.12 PHP 5.4 サーバーへのバックグラウンド接続用の YUI フレームワーク
ユーザーが操作する非常に単純な ajax/js の組み合わせを実行しようとしています。
2 of 4 people found this review helpful. Was this review helpful to you? Yes No
ユーザーが yes/no のいずれかを選択すると、4 つのうち 2 つが ajax/js を介して更新されます。ReviewController (Zend_Controller_Action を拡張) の init() メソッドに次のコードがあります。このアクション (feedbackAction) に続くビュー スクリプトは /views/scripts/review/feedback.json.phtml です。
$ajaxContext = $this->_helper->getHelper('AjaxContext');
$ajaxContext->addActionContext('feedback', 'json')
->initContext();
feedbackAction が実行されると、feedback.phtml が見つからないことを示す例外が飛び出します。これは、AjaxContext が実際には「json」形式を追加していないことを示しています。なぜこうなった?アクション内で initContext() を呼び出す必要があることをどこかで読みました。私はそれを試しました...同じ例外。
次に、ContextSwitch を使用してみましたが、AjaxContext を ContextSwitch のサブクラスにするという目的に反しているようです。ReviewController の init() のコードは次のように置き換えられました。
$contextSwitch = $this->_helper->getHelper('contextSwitch');
$contextSwitch->addActionContext('feedback', 'json')
->initContext();
今回は、不可解なことに、例外は発生しませんが、代わりに次のものがレンダリングされます: ヘッダー コード (私の layout.phtml ファイルによって呼び出される、私の _header.phtml ファイルによって生成されます)。さっぱりわかりません。「addActionContext」+initContext() DISABLEDレイアウトが有効になっている場合、私は(明らかによくありません)理解していました。?
編集 _header.phtml ファイルからの html コンテンツではなく、actionStack に追加したいくつかのアクションのためにレンダリングされていた別の .phtml ファイルからのものであることがわかりました。これが処理されると、レンダリングされたのは次のとおりです。
{"originalModule":"default","originalController":"review","originalAction":"feedback","result":true,"id":1,"helpful_yes":"3","helpful_total":"4"}
これは、私の ReviewController() の init() メソッドで開始された ContextSwitch ヘルパーのおかげで、json としてレンダリングされる $this->view に配置された変数です。「これはレンダリングされました」と言うのは、アドレスバーに次のURLを配置したためです。http://localhost/PlacesforKids/public/review/feedback/format/json/id/1/helpful/1
これはおそらく、YUI フレームワークによって送信される URL です。
「おそらく」と言ったのは、JavaScript の成功関数 (ajax 呼び出しが正常に実行されたときに YUI フレームワークによってコールバックされる) で、アラート (応答) を実行して、取得している応答を出力するためです...そしてshabang 全体を出力します: html タグ、ヘッダーなど。それがどのように可能かわかりません。
YUIフレームワークを悪用しているのではないかと思い、jquery.jsに変更してみました。そのために、この内容を jquery.js という名前のファイルにコピーし、/public/js ディレクトリの下に配置しました。サーバーに対して行う ajax 呼び出しは次のとおりです。
$.ajax({
url: sUrl,//that would be
//localhost/PlacesforKids/public/review/feedback/format/json/id/$id/helpful/$helpful
type: "GET",
async: false,
success: function(response){
alert(response);
}
});
これがすべての陽気な部分です。私の ReviewController のアクションはまったく呼び出されていません。代わりに、最後にレンダリングされたビューが再レンダリングされます。つまり、最後のアクション (ReviewController とは異なるコントローラーに属する) によって呼び出されたビュー スクリプトによって生成されたコンテンツが再送信されます。そのビュースクリプトの所有者であるアクションでこれを追加したため、再レンダリングされたことがわかります。
if($this->getRequest()->getQuery('ajax') == 1)
throw new Exception ("WRONG controller's action being called");
しかし、例外をスローすることはありません。
編集 わかったと思いますが、baseUrl() をクリーンアップする方法を知る必要が ある() 方法。面白いことに、これは私が得たものです:
Request URL:http://localhost/PlacesforKids/public/place/index/id/localhost/PlaceforKids/public/review/feedback/format/json/id/1/helpful/0
Request Method:GET
Status Code:200 OK
Accept:*/*
Referer:http://localhost/PlacesforKids/public/place/index/id/1
X-Requested-With:XMLHttpRequest
なぜ $ajax() は、既存の URL に GET として持っている URL を追加するのですか? これは、$.ajax() を介して生成しようとしている URL が、「リファラー」に追加されることを意味します。だから、私はそれをCLEANしてゼロから始めるだけでいいのです。つまり、URLのために... zendフレームワークでどうすればそれを行うことができますか? 何か案は?
sUrl (localhost/PlaceforKids/public/review/feedback/format/json/id/1/helpful/0) に文字列を直接入力すると、ブラウザのアドレスバーに直接入力すると、想定どおりに実行され、印刷されますReviewController で設定した $this->view の変数を取り出し、json として送信します。
{"originalModule":"default","originalController":"review","originalAction":"feedback","result":true,"id":1,"helpful_yes":"3","helpful_total":"4"}
YUI フレームワークで私が抱えていたのと同じ問題。私はおかしくなりそうだ。
本当に助かりました、ありがとう。