私はこの問題に数日間取り組んできましたが、うまくいきませんでした。別の選択リストの選択に基づいて選択リストを作成する単純な ajax 呼び出しを CakePHP 2.0 に実装しようとしています。私のデータベースには、車両メーカーと車両モデルがあります。モデルには make_id フィールドがあります。ユーザーがメーカーを選択すると、以前に選択したモデルの make_id を持つモデルのみがモデル選択リストに取り込まれます。Firebug でリクエストを表示すると、make_id に関係なくすべてのモデルが返されます。別の選択に基づいて選択を設定する方法を説明しようとするこの小さなチュートリアルを見つけましたが、まだ運がありません。 http://bakery.cakephp.org/articles/Calderoy/2011/01/18/how_to_create_an_observefield_equivalent_in_the_new_jshelper
ビューファイルにあるJsHelperコードは次のとおりです。
$this->Js->get('#CarMakeId')->event(
'change',
$this->Js->request(
array('controller' => 'CarModels', 'action' => 'get_model'),
array(
'async' => true,
'update' => '#CarCarModelId',
'dataExpression' => true,
'method' => 'post',
'data' => $this->Js->serializeForm(array('isForm' => true, 'inline' => true))
)
)
);
そして、ここに私のコントローラメソッドがあります:
public function get_model() {
$models = $this->CarModel->find(
'all',
array('conditions',
array('CarModel.make_id' => $this->data['Car']['make_id'])
)
);
$this->set('car_models', $models);
}
最後に、これが私の get_model ビュー ファイルです。
if($car_models) {
echo "<option value=''>-- Select --</option>\n";
foreach($car_models as $model) {
echo "<option value=".$model['CarModel']['id'].">".$model['CarModel']['name']."</option>\n";
}
}
これは、JsHelper によって作成される JavaScript です。
<script type="text/javascript">
//<![CDATA[
$(document).ready(function () {$("#CarMakeId").bind("change", function (event) {$.ajax({async:true, data:$("#CarMakeId").serialize(), dataType:"html", success:function (data, textStatus) {$("#CarCarModelId").html(data);}, type:"post", url:"\/Dropbox\/CartrackerV3\/CarModels\/get_model"});
return false;});});
//]]>
コントローラーに RequestHandler ヘルパーを含めました。また、ajax 呼び出しから応答を得ていることも注目に値します。メーカーを選択すると、models の最初のオプションが空白のオプションから get_model ビュー ファイルに由来する -- Select -- オプションに変わりますが、 make_id を修正してください。