0

小さなプロジェクトに 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 タグを作成するという事実のように)。

再度、感謝します。

4

2 に答える 2

1

受け取った500InternalServerエラーは、コントローラー内でヘルパーを使用しているためです。

でも!ビューをajaxリクエストに戻すことができます。コントローラでメソッドを作成します。フォームヘルパーを使用してビューを作成します

ajaxForm.ctp

$this->Form->create('Project');
$this->Form->input('name');
$this->Form->input('colour', array(
       'options' => array('blue' => 'Blue', 'green' => 'Green', 'red' => 'Red', 'orange' => 'Orange', 'yellow' => 'Yellow')
));
$this->Form->end('Create Project');

コントローラ

public function ajaxForm(){

if($this->request->is('ajax')){
    $this->layout = 'ajax';   // to avoid returning your full layout
    $this->render('ajaxForm');

}

}

于 2012-11-27T22:14:48.193 に答える
0

html とフロントエンド コードを php バックエンド コードから分離します。ビューにデータを渡さない場合、add 関数を空にすることができます。add 関数が非 ajax リクエストによって呼び出されていない場合は、ajax をチェックする必要はありません。 . ビュー内の ajax リクエスト専用になります。

//controller file
App::import('Helper', 'Form');
public function add()
{

} 


//App/Views/Projects/add.ctp file
        echo $this->Form->create('Project');
        echo $this->Form->input('name');
        echo $this->Form->input('colour', array(
             'options' => array('blue' => 'Blue', 'green' => 'Green', 'red' => 'Red', 'orange' => 'Orange', 'yellow' => 'Yellow')
         ));
        echo $this->Form->end('Create Project');
于 2012-11-27T22:04:34.217 に答える