人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

CakePHP2.0.5のakeDC search pluginで検索に使用した条件を検索結果ページに表示したい!
例:あなたは「アメリカ」で検索しました
と検索結果ページに表示したいです。
以下のコードを記述したのですが、
MoviesController.phpで
public function results() {
$country_cond[] = array();
foreach ($this->request->data["Movie"]["country_id"] as $id) {
$country_cond[] = $id;
}
$country_list = $this->Movie->Country->find('list', Array('conditions' => Array('Country.id' => $country_cond)));

$this->set('movies', $this->paginate('Movie'));
$this->set('country_list', $country_list);
}
/View/Movies/results.ctpで
?php
foreach ($country_list as $country_name) {
echo $country_name;
echo '<br/>';
}
?>
以下のエラーがでてしまい、全く上手くいきません。
Notice (8): Undefined index: Movie [APP/Controller/MoviesController.php, line 135]

同じプラグインを使用している方で、問題の解決方法をご存知のかたがいましたら教えてください!

●質問者: ぱんたま
●カテゴリ:ウェブ制作
○ 状態 :キャンセル
└ 回答数 : 1/1件

▽最新の回答へ

1 ● Cherenkov

$country_list = $this->Movie->Country->find

$country_list = $this->Movie->find
とか


Cherenkovさんのコメント
MoviesController.phpの135行目はどれか。 public $uses = array('Movie');は宣言されているのかどうか。

ぱんたまさんのコメント
135行目には以下のコードが入っています。 public $uses = array('Movie');も宣言しています。 >|| $country_list = $this->Movie->Country->find('list', Array('conditions' => Array('Country.id' => $country_cond))); ||< $country_list = $this->Movie->find でもダメでしたね。 Cherenkovさんは、このプラグインを使ってますか?

Cherenkovさんのコメント
find('list', Array('conditions' => Array('Country.id' => $country_cond))); $country_condは配列なのでそのまま渡してもマッチするんですかね?

Cherenkovさんのコメント
質問文にあるエラーメッセージだとviewは関係ないですね

tdoiさんのコメント
CakePHPでは、配列を渡すと勝手にIN (・・・・)に展開してくれるので、そこは問題がないです。 Cherenkovさんがおっしゃるように、質問文のエラーメッセージだと、以下の場所が135行目だとして、うまくPOSTできていないのかなと推測します。 >|| foreach ($this->request->data["Movie"]["country_id"] as $id) ||< ただ、Controllerで次の記述で正しく出力されるにも関わらず、 >|| pr ($country_list); ||< View側の次の記述が正しく動作しないということであれば、 >|| foreach ($country_list as $country_name) { echo $country_name; echo '<br/>'; } ||< Controller側のsetか、View側の名前かのtypo以外考えられない気もします。 このプラグイン自体を使ってないので、そっちの影響ということもあり得ますが、 まずは、 - 質問文にあるエラーがでるのはいつも出ているのか? - このエラーで記述されている135行目にあるのは何か? - Controller側でsetした変数を、View側でprしてみるとどうなるか? といった辺りを確認するのが第一歩じゃないかと。

ぱんたまさんのコメント
すいません。文字数制限のうえに >|| $this->Prg->commonProcess(); $this->paginate['conditions'] = $this->Movie->parseCriteria($this->passedArgs); ||< を省略しました。 http://d.hatena.ne.jp/kanonji/20101208/1291819950 この記事を参考に導入しました。 >>質問文にあるエラーがでるのはいつも出ているのか? いいえ今回だけです。 >>このエラーで記述されている135行目にあるのは何か? foreach ($this->request->data["Movie"]["country_id"] as $id) { $country_cond[] = $id; } が書かれています。 >>Controller側でsetした変数を、View側でprしてみるとどうなるか? また同じようなエラーが表示され、 foreach ($this->request->data["Movie"]["country_id"] as $id) { $country_cond[] = $id; } View側では Array ( )だけ表示されます。

ぱんたまさんのコメント
検索条件を設定する >|| $this->Prg->commonProcess(); ||< を消去するとエラーも消えるのですが、検索結果は表示されないです。

tdoiさんのコメント
こう変えたら動くような気はします。 >|| foreach ($this->data["Movie"]["country_id"] as $id) { ||< ソース読むと、SearchPluginがデータの構造を1.3系に合わせて書き換えているような気がするので。

ぱんたまさんのコメント
ダメでしたね。 >|| foreach ($this->request->data["Movie"]["country_id"] as $id) { ||< と同じ結果でした。

tdoiさんのコメント
では、いっそのこと、 >|| pr ($this); ||< とかやると何が出てきます?

ぱんたまさんのコメント
>|| View Object ( [Helpers] => HelperCollection Object ( [_View:protected] => View Object *RECURSION* [_enabled:protected] => Array ( [0] => Session [1] => Html [2] => Form [3] => Jisaku [4] => Paginator ) ・・・・・・・・ ||< をはじめ、たくさんの情報が表示されます。

tdoiさんのコメント
説明不足でした。Controller側でどうなってるか知りたいのです。 View側でも問題を切り分けるための情報がいっぱいのところにあったりするんですが、なれないと拾うのは難しかったかもですね。 あとは、国名取得の処理と、映画検索処理の順序を入れ替えたりすることでも直るんじゃないかなという気もします。 具体的には、 >|| $country_cond[] = array(); foreach ($this->request->data["Movie"]["country_id"] as $id) { $country_cond[] = $id; } $country_list = $this->Movie->Country->find('list', Array('conditions' => Array('Country.id' => $country_cond))); $this->set('country_list', $country_list); ||< こんなコードと、 >|| $this->Prg->commonProcess(); $this->paginate['conditions'] = $this->Movie->parseCriteria($this->passedArgs); $this->set('movies', $this->paginate('Movie')); ||< こんなコードを混ぜて書いている気がしますが、はっきり区別して、多分、国名取得を先に書けばうまくいくんじゃないかと。

ぱんたまさんのコメント
>|| public function results() { $country_cond[] = array(); foreach ($this->request->data["Movie"]["country_id"] as $id) { $country_cond[] = $id; } $country_list = $this->Movie->Country->find('list', Array('conditions' => Array('Country.id' => $country_cond))); $this->set('country_list', $country_list); // 検索条件設定 $this->Prg->commonProcess(); // 検索条件取得 $conditions = $this->Movie->parseCriteria($this->passedArgs); $this->paginate = array( 'conditions' => $conditions, 'limit' => 10, ); $this->set('movies', $this->paginate('Movie')); } ||< 現在はこんな形式で区別して書いていますが、これではダメでね。

ぱんたまさんのコメント
コントローラ側で、 >|| print_r($country_list); exit(); ||< とすると、 Array ( [1] => アメリカ [2] => イギリス ) と表示されます。値はきちんと入ってるんですけど・・・。 なんでだろう。ほんとうに

tdoiさんのコメント
断片的な情報からだと判断しづらいですが、 Notice (8): Undefined index: Movie [APP/Controller/MoviesController.php, line 135] というエラーが出ているにも関わらず、$country_listが設定されている方が不思議です。 Controllerの最後で、pr($this)をして、country_listという文字列を探して何がどうなっているか、 Viewの適当な箇所で、pr($this)をして、country_listという文字を探して何がどうなっているか、そんなところを確かめてみてはどうでしょう?

ぱんたまさんのコメント
Controller、View共に [country_list] => Array ( ) と表示されます。中身は空っぽのようです。

ぱんたまさんのコメント
コントローラ側で、 print_r($country_list); exit(); とすると、 Array ( [1] => アメリカ [2] => イギリス ) と表示されましたが、 $this->set('country_list', $country_list); の後に書くと Array ( )と表示されます。

tdoiさんのコメント
不可解ですね。 Controller側でこんなコードはどうなります? >|| print_r ($country_list); print_r ($this->viewVars); $this->set('country_list', $country_list); print_r ($contry_list); print_r ($this->viewVars); exit; ||<

ぱんたまさんのコメント
Notice (8): Undefined index: Movie [APP/Controller/MoviesController.php, line 134] Warning (2): Invalid argument supplied for foreach() [APP/Controller/MoviesController.php, line 134] とエラーが表示されます。 [country_list] => Array ( )と中身はやはり空ですね。 う〜んどうしたものやら・・・。

Cherenkovさんのコメント
情報が小出し小出しで混乱してますね。コピペで動くコードをgistあたりにアップしたほうがいいかもしれません。 $this->request->data["Movie"]["country_id"] をprint_rすると配列が入ってますか?

tdoiさんのコメント
ちょっとちゃんとソースを読んで理由が見えました。 >|| $this->Prg->commonProcess(); ||< を実行すると、Postされたデータがある場合は、namedパラメタとしてリダイレクトされるんですね。 resultsアクションの最後にでも次のコードを埋め込むと、道が見えるかと。 >|| pr ($this->request->params); ||<

ぱんたまさんのコメント
了解です。試してみます。 Cherenkov さん、tdoiさんへ 一応、 https://github.com/kyouryu/HelloGitHub に私が使用しているプロジェクトファイルをあげました。 もしよければ、見てください。

ぱんたまさんのコメント
>|| Array ( [plugin] => [controller] => movies [action] => results [named] => Array ( [name] => [time] => 0-300 [country_id] => 1|2 [genre_id] => [score] => [partner_id] => [feeling_id] => [year] => ) [pass] => Array ( ) [paging] => Array ( [Movie] => Array ( [page] => 1 [current] => 10 [count] => 42 [prevPage] => [nextPage] => 1 [pageCount] => 5 [order] => [limit] => 10 [options] => Array ( ) [paramType] => named ) ) ) ||< と表示され、 [country_id] => 1|2 が出てきました!!! あとは、この中から、[country_id] => 1|2だけを抽出してfindで国名をしゅとくすればいいのか。

tdoiさんのコメント
うまく行きそうでよかったです。 最初にちゃんとプラグインの動作を見てなかったので、遠回りさせてしまってすいません。

ぱんたまさんのコメント
Cherenkovさんのおっしゃる通りにしますと、 >|| Array ( [0] => 1 [1] => 2 ) ||< と国別IDが取得できました。

ぱんたまさんのコメント
う〜ん。 >|| print_r($this->request->params["named"]["country_id"]); exit(); ||< としても、Undefined index: country_idとエラーがでてしまいます。

tdoiさんのコメント
きっと書く場所が違うのかと、 >|| function results() { 処理A $this->Prg->commonProcess(); 処理B } ||< というアクションを記述してPOSTすると、まず、処理Aが実行され、その後、$this->Prg->commonProcess()が呼び出され、その中で、リダイレクトされます。この時点でこのリクエストの処理は終了し、処理Bは実行されません。リダイレクトされると、再びresultsアクションが呼び出されるので、再度、処理Aが実行されます。次に、やはり、$this->Prg->commandProcess()が実行されますが、今度はPOSTデータを持っていないため、リダイレクトが発生しません。すると、その後は、処理Bが実行されます。 これがSearchPluginの動作です。 重要なのは、リダイレクトされる前と後でデータが違うことです。 1度目の処理Aの時点ではPOSTされたデータがあるので、$this->request->dataとしてアクセスすることができます。しかし、リダイレクト後はnamedパラメタになっているので、処理Aでは、$this->reqeust->dataは存在しません。これが、Notice (8): Undefined index: Movie [APP/Controller/MoviesController.php, line 135]というエラーが表示される理由です。 さて、 >|| print_r($this->request->params["named"]["country_id"]); exit ||< というコートですが、これを処理Aに記述すると、exitによってリダイレクトされる前に終了してしまいます。多分、exitさえしなければ、1回目のリダイレクト前に余計なwarningが出るのでよくないですが、2回目のアクセス時に表示はされるでしょう。 それよりも上記でいう処理Bの部分に、このコードを書くのが自然かと。 リダイレクトがからむので、exitを使う場合は注意してください。

ぱんたまさんのコメント
なんとか出来ました!! >|| $this->Prg->commonProcess(); $item_id=explode('|', $this->request->params["named"]["country_id"]); $country_cond[] = array(); foreach ($item_id as $id) { $country_cond[] = $id; } $country_list = $this->Movie->Country->find('list', Array('conditions' => Array('Country.id' => $country_cond))); $this->set('country_list', $country_list); ||< とても汚いコードになってしまいましたが、なんとか検索内容を取得することができました!

tdoiさんのコメント
よかったです。 ちなみに、上記のコードのforeach無駄ですよ。 以下で十分かと。 >|| $this->Prg->commonProcess(); $country_cond = explode('|', $this->request->params["named"]["country_id"]); $country_list = $this->Movie->Country->find('list', Array('conditions' => Array('Country.id' => $country_cond))); $this->set('country_list', $country_list); ||<

ぱんたまさんのコメント
長い間、ありがとうございました。 たいへん参考になりました!!
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ