cakephp2.doc_031
R e i - D r e a m
for Laravel
TOP > CakePHP2 > Controller関連(ビューとの連携)
Guest
login

最終投稿日:2019年11月20日

Controller関連(ビューとの連携)
CakePHP2.6.12
【ビューへ値をセットする】

    ・タイトルタグを変更
        $this->set("title_for_layout","hoge");
    ・1度だけのセッションを発行

        $this->Session->setFlash();     ※CakePHP2.7 から廃止となります
        
        例)
            $this->Session->setFlash("システム処理に失敗しました。");

        ※引数
            setFlash($message, $layout = ‘default’, $params = array(), $key = ‘flash’)

        例)Bootstrap3 Calss を追加
            $this->Session->setFlash("システム処理に失敗しました。"
                    ,"default",array("class"=>"alert alert-danger"));


        ※View 側は、$this->Session->flash(); で出力する


【リクエストデータの取得】

    GETデータ   引数のみの場合(controllers/action/hoge/foo/bar)
        $this->request->pass
        $this->request["pass"]
        $this->request->params['pass']

        ※上記は全て結果は同じ

    GETデータ   key=Valueの場合(controllers/action?hoge=1&foo=2)

        $this->request->query


【画面遷移関数】

    //index 等
    $this->render([遷移先]);

    //リダイレクト
    $this->redirect(array("controller"=>"hoges","action"=>"foo"));
    例)
        //パラメータも渡せる
        this->redirect(array('action' => 'edit', $id));
        //リファラーへリダイレクト
        $this->redirect($this->referer());


【バリデーション】

    //受け取ったデータをテーブルにセットする
    $this->[テーブル名]->set($this->request->data);
    //(validatesと「s」が付くのに注意)
    if(!$this->[テーブル名]->validates()){
        //描画を index に戻す
        $this->render('index');
    }

        ※コントローラにテーブル名を宣言するのを忘れずに!


    cakephp2.3以降
        モデルにバリデーションルールがあるだけで、
         コントローラ側では何もしないでもバリデーション処理が走ってしまう。

        理由年は、2.3からHTML5の requrired 属性が追加される仕様になったためで、
         クライアント再度で処理されてしまう。

        これを回避するには $this->Form->create の第2引数に以下を追加する。

            "novalidate" => true
        例)
            echo $this->Form->create("Form",array("action"=>"confirm","novalidate" => true));


        メモ)
            バリデーションの validates() メソッドはデフォルトで $validate 変数を対象とします。
            例えばモデル内に以下の2つのバリデーション設定があったとすると

                public $validate = array(
                    "name" => array(
                            "notEmpty" => array("rule"=>"notEmpty","message"=>"名前を登録しろ"),
                        )
                );

                public $validate2 = array(
                    "name" => array(
                            "email" => array("rule"=>"email","message"=>"名前を登録しろ"),
                        )
                );

            コントローラでバリデーション処理の前に以下の記述をする事で
             $validate2 を対象とする事ができる

                $this->Hoge->validate = $this->Hoge->validate2;


        メモ2)
            共通画面を使用している場合、
             バリデーションを一部無効にしたい場合は、Modelに設定した変数を空にする。
            例)
                $this->Hoge->validate['pass']=array();

        メモ3)
            View に強制的にエラー内容をセットする
            例)
                $this->[Model]->validationErrors[項目名][0] ="hoge...";


【フォーム】

    //対象のフィールドの値を指定する
    $this->request->data["モデル名"]["フィールド名"] = "値";

    //セレクトボックス等の場合は配列でインデックスを指定
    $this->request->data["モデル名"]["フィールド名"] = array("1","3");


【ページング】

    基本的に同じだが、ビュー側の変数は「$this」オブジェクトとなる。
    例)
        //prefix がある場合は指定
        $this->Paginator->options(array('url' => array("admin" => true)));
        //件数等情報参照
        $this->Paginator->counter(array('format' => "%start%件 ~ %end%件 (全 %count%件)"));
        
        echo $this->Paginator->prev('<<',array("url"=>array("action"=>"index")));
        echo $this->Paginator->numbers(array("modulus"=>2,"separator"=>"|"));
        echo $this->Paginator->next('>>',array("url"=>array("action"=>"index")));


【ワンタイムトークン】

    ワンタイムトークンは基本的に自作します。

    < フォーム コントローラ側 >
        //ランダムな文字列作成
        $token = sha1(session_id() . mt_rand());
        //セッションに格納
        $this->Session->write("token",$token);
        //ビューに渡す
        $this->set("token",$token);


    < ビュー側 >
        //トークンを埋め込む
        <?php echo $this->Form->input("token",array("type"=>"hidden","value"=>$token)); ?>


    < 確認画面のコントローラ側 >
        if(empty($this->request->data["Hoge"]["token"]) 
            or $this->request->data["Hoge"]["token"] != $this->Session->read("token")){
            //不正処理
            echo "dame";exit;
        }
        //リロードを防止したければセッションを削除する
        $this->Session->delete("token");
            
CakePHP2.x
【ビューへ値をセットする】

    ・タイトルタグを変更
        $this->set("title_for_layout","hoge");


【リクエストデータの取得】
    GETデータ
        $this->request->query

    POSTデータ
        $this->request->data


【バリデーション】
    //受け取ったデータをテーブルにセットする
    $this->[テーブル名]->set($this->request->data);
    //(validatesと「s」が付くのに注意)
    if(!$this->[テーブル名]->validates()){
        echo "NG";
    }

        ※コントローラにテーブル名を宣言するのを忘れずに!


    cakephp2.3以降

        モデルにバリデーションルールがあるだけで、
         コントローラ側では何もしないでもバリデーション処理が走ってしまう。

        理由年は、2.3からHTML5の requrired 属性が追加される仕様になったためで、
         クライアント再度で処理されてしまう。

        これを回避するには $this->Form->create の第2引数に以下を追加する。

            "novalidate" => true
        例)
            echo $this->Form->create("Form",array("action"=>"confirm","novalidate" => true));

        メモ)
            バリデーションの validates() メソッドはデフォルトで $validate 変数を対象とします。
            例えばモデル内に以下の2つのバリデーション設定があったとすると

                public $validate = array(
                    "name" => array(
                            "notEmpty" => array("rule"=>"notEmpty","message"=>"名前を登録しろ"),
                        )
                );

                public $validate2 = array(
                    "name" => array(
                            "email" => array("rule"=>"email","message"=>"名前を登録しろ"),
                        )
                );

            コントローラでバリデーション処理の前に以下の記述をする事で
             $validate2 を対象とする事ができる

                $this->Hoge->validate = $this->Hoge->validate2;


【フォーム】

    //対象のフィールドの値を指定する
    $this->request->data["モデル名"]["フィールド名"] = "値";

    //セレクトボックス等の場合は配列でインデックスを指定
    $this->request->data["モデル名"]["フィールド名"] = array("1","3");


【ページング】

    基本的に同じだが、ビュー側の変数は「$this」オブジェクトとなる。
    例)
        echo $this->Paginator->prev('<<',array("url"=>array("action"=>"index")));
        echo $this->Paginator->numbers(array("modulus"=>2,"separator"=>"|"));
        echo $this->Paginator->next('>>',array("url"=>array("action"=>"index")));


【ワンタイムトークン】

    ワンタイムトークンは基本的に自作します。

    < フォーム コントローラ側 >

        //ランダムな文字列作成
        $token = sha1(session_id() . mt_rand());
        //セッションに格納
        $this->Session->write("token",$token);
        //ビューに渡す
        $this->set("token",$token);


    < ビュー側 >
        //トークンを埋め込む
        <?php echo $this->Form->input("token",array("type"=>"hidden","value"=>$token)); ?>


    < 確認画面のコントローラ側 >
        if(empty($this->request->data["Hoge"]["token"]) 
            or $this->request->data["Hoge"]["token"] != $this->Session->read("token")){
            //不正処理
            echo "dame";exit;
        }
        //リロードを防止したければセッションを削除する
        $this->Session->delete("token");
            
ログインしてコメントを残そう!!


きっぷる
きっぷる