小さなプロジェクトに CakePHP と Jquery UI を使用しています。
アイテムの index.ctp に「アイテムを追加」リンクがあります。
「アイテムの追加」リンクがクリックされたときに、アイテムを追加するためのフォーラムで jQuery UI ダイアログを表示したいと考えています。
CakePHP のすばらしいFormHelperを利用できるようにするには、コントローラーの add() メソッドでFormHelperが作成する html を返す必要がありますif($this->request->is('ajax'))
が、これにより内部サーバー エラーが発生します (Chrome で要素を検査すると)。
これはあまりMVCではないことはわかっていますが、私の理由は、ユーザーがJsを有効にしているかどうかにかかわらずアプリを動作させたいということです。preventDefault()
jQuery スクリプトに含まれています。
次に、jQuery クリック ハンドラーは、ダイアログ ボックスのプロパティ (jQueryUI ダイアログ ボックス) を設定し、フォームの add() への ajax 要求を行います。
add.ctp で使用したFormHelperコードをコピーして貼り付けましたが、エコーする代わりに、各行を $htmlString に追加しました。次に電話echo $htmlString; exit();
しましたが、ここで500 Internal Server Errorが表示されます。
add() 関数のすべてのFormHelper行をコメントアウトすると、すべてが機能する ($htmlString は単に "") ため、ここで問題が発生します。
私が言ったように、これはあまりMVC-yではないことは知っていますが、それを行う別の方法は考えられません. コピー アンド ペーストされたコードではなく、add.ctp が返される可能性はありますか? それはMVCモデルを正しく保ち、$this->layout = 'ajax'の場合、正確なadd.ctpファイルコードしか取得できませんか?
お時間をいただきありがとうございます。
編集 - jQuery ajax リクエストと cakephp コントローラの add() 関数を追加
Jquery ajaxリクエスト:
$('.add_project').click(function(event) {
//Kill default
event.preventDefault();
$.ajax({
url : $(this).attr('href'),
type : 'post',
data : 'ajax=1',
dataType: 'html',
success: function(response) {
alert(response);
//Check jquery loaded
if(jQuery.ui) {
//Fill dialog with form
$("#dialog").html(response).show();
//Show dialog
$("#dialog").dialog("open");
}
}
});
});
CakePHP コントローラ コード:
public function add()
{
//If this has been requested with ajax then give the form that we create on add.ctp
if($this->request->is('ajax'))
{
App::import('Helper', 'Form');
$this->loadModel('Project');
$html = '';
$html += $this->Form->create('Project');
$html += $this->Form->input('name');
$html += $this->Form->input('colour', array(
'options' => array('blue' => 'Blue', 'green' => 'Green', 'red' => 'Red', 'orange' => 'Orange', 'yellow' => 'Yellow')
));
$html += $this->Form->end('Create Project');
echo html;
exit();
}
私はそれがajaxリクエストとは何の関係もないことはかなり確信しています。それはコントローラでFormHelperを使用したくないというcakephpの問題です。これが MVC の悪い慣行であることはわかっていますが、これを動的に行う別の方法を思いつきません (cakephp がモデルに基づいて html タグを作成するという事実のように)。
再度、感謝します。