2012年5月29日火曜日

2012年05月29日 講義072日目

2012年05月29日
講義072日目
------------------------------1H------------------------------
★symfony
●validation
sf.shonanbbs.com/backend/member/addの変更
・入力フォームでパスワードを隠すようにする
/backend/modules/member_add/templates/displatForm.php
input_password_tag()
に変更
・validate/validate.ymlの作成
public function executeValidate()に対応させるファイル名validate.ymlを作る
インデントに注意
必須項目のバリデーションはrequired:
symfonyが用意してくれてるバリデーションはsf~~Validator:
↓sfEmailValidator:とsfStringValidator:

fields:

  nickname:
    required:
      msg: ニックネームを入力してください。

  mailaddress:
    required:
      msg: メールアドレスを入力してください。
    sfEmailValidator:
      strict:       true
      email_error:  このメールアドレスは無効です。

  password:
    required:
      msg: パスワードを入力してください。

・特殊なカスタムバリデータを使いたい場合
validatorにデータを通さないとカスタムバリデータが機能しないので
特に意味のないhiddenを使ってvalidate.ymlの必須項目required:に通して解決する

・とりあえず管理者権限と削除フラグを決め打ち"n"に設定
public function executeValidate()の編集
    $member->setAdminYn("n");
    $member->setDeleteYn("n");
------------------------------2H------------------------------
★symfony
●validation
・カスタムバリデーションの作成
DBの情報を参照したい場合にはカスタムバリデーションを作成
lib/validator/myCreateMemberCheckValidator.class.php
<?php
class myCreateMemberCheckValidator extends sfValidator
{
    public function execute(&$value, &$error)
    //$value,$errorはフォームから受け取ったデータ
    {
        //削除フラグが"y"でないレコードを取得
        //退会した人のメールアドレスは使えるようにするため
        //SELECT * FROM member WHERE delete_yn != "y" AND mailaddress = "hoge.@mail.com";
        $c = new Criteria;
        $c->add(MemberPeer::DELETE_YN,"y", Criteria::NOT_EQAUL);
        $c->add(MemberPeer::MAILADDRESS, $value);
        $member = MemberPeer::doSelect($c);

        //既に登録されてるメールアドレスがあったら
        if($member)
        {
            //validate.ymlでoverlap_errorを使うために
            $error = $this->getParameter("overlap_error");
            return false;
        }
        return true;

    }
}

・validate/validate.ymlのmailaddress:に追加
    myCreateMemberCheckValidator:
      overlap_error: このメールアドレスは登録済みです。

・myLoginCheckValidator()の編集
削除フラグを見るようにする
        //削除フラグが"y"のユーザをログインさせない処理を追加
        $c = new Criteria;
        $c->add(MemberPeer::MAILADDRESS, $mailaddress);
        $c->add(MemberPeer::PASSWORD, $password);
        $c->add(MemberPeer::DELETE_YN, "y" ,Criteria::NOT_EQUAL);
        $member = MemberPeer::doSelectOne($c);
●管理者権限
/front/modules/login/actions/actions.class.php
にてログインしたときに管理者権限の有無を確認する処理を追加する
・管理者権限を持っているならの処理を追加
            if($member)
            {
                //ログイン状態にする
                $this->getUser()->setAuthenticated(true);
                $this->getUser()->clearCredentials();
                $this->getUser()->addCredential('member');

                //会員情報をセッションにセット
                $this->getUser()->setAttribute('member_id',$member->getId(),sfConfig::get('sf_session_name'));
                $this->getUser()->setAttribute('nickname', $member->getNickname(), sfConfig::get('sf_session_name'));

                //管理者権限を持っているなら
                if($member->getAdminYn() == "y"){
                    $this->getUser()->addCredential('admin');
                }


                $this->redirect('/backend');
            }
・管理者情報を追記
/backend/templates/_header.php
<?php if($sf_user->hasCredential("admin")):?>
(管理者)
<?php endif;?>
を追記
------------------------------3H------------------------------
★symfony
●管理者権限
・メンバー追加
管理者であればメンバーの管理者権限と削除フラグを編集できるようにする
<?php if($sf_user->hasCredential("admin")):?>
<tr>
<th><span class="required"></span>管理者権限</th>
<td <?php if ($sf_request->haserror('admin_yn')) :?>class="errortd"<?php endif;?>>

<?php if($flow->getData('admin_yn') != "y"):?>
<?php echo radiobutton_tag('admin_yn',"y");?>有
<?php echo radiobutton_tag('admin_yn',"n", array("checked"=>"checked")); ?>無
<?php else:?>
<?php echo radiobutton_tag('admin_yn',"y", array("checked"=>"checked")); ?>有
<?php echo radiobutton_tag('admin_yn',"n");?>無
<?php endif;?>

<?php echo form_error('admin_yn'); ?>
</td>
</tr>
<?php endif;?>


<tr>
<th><span class="required"></span>削除フラグ</th>
<td <?php if ($sf_request->haserror('delete_yn')) :?>class="errortd"<?php endif;?>>

<?php if($flow->getData('delete_yn') != "y"):?>
<?php echo radiobutton_tag('delete_yn',"y");?>有
<?php echo radiobutton_tag('delete_yn',"n", array("checked"=>"checked")); ?>無
<?php else:?>
<?php echo radiobutton_tag('delete_yn',"y", array("checked"=>"checked")); ?>有
<?php echo radiobutton_tag('delete_yn',"n");?>無
<?php endif;?>

<?php echo form_error('delete_yn'); ?>
</td>
</tr>

・member_add/action.class.php
public function executeValidate()を編集
    //管理者権限が有無で分岐
    if($this->getUser()->hasCredential("admin")){
        $member->setAdminYn($this->getRequestParameter("admin_yn"));
    }else{
    $member->setAdminYn("n");
    }

------------------------------4H------------------------------
★symfony
●MODELについて
データベースに接続する処理はMODELにまとめてちゃんとしたMVCの形にする
プロジェクト/lib/model/
にまとめる
まとめられた接続のためのメソッドをコントローラで呼び出すMVCの形にする
・データベースに接続するメソッドを作る
/front/default/actions/actions.class.php


        $c = new Criteria;
        $c->addDescendingOrderByColumn(CommentPeer::CREATED_AT);
        //ascはaddAscendingOrderByColumn
        //ORDER BY created_at DESCのsql文と同じ
        $this->comments = CommentPeer::doSelect($c);

↑を/lib/model/Comment::Peer.phpにコピー
$this->comments = CommentPeer::getBbsArticles();
だけ残す

・/lib/model/Comment::Peer.phpを編集
class CommentPeer extends BaseCommentPeer
{
    static function getBbsArticles(){
        $c = new Criteria;
        $c->addDescendingOrderByColumn(CommentPeer::CREATED_AT);
        return CommentPeer::doSelect($c);
    }
}
・自身のクラスを参照する場合のみ、「Peer」ではなく「salf」で参照する
class CommentPeer extends BaseCommentPeer
{
    static function getBbsArticles(){
        $c = new Criteria;
        //自身のクラスを参照する場合のみ、「Peer」ではなく「salf」で参照する
        $c->addDescendingOrderByColumn(self::CREATED_AT);
        return self::doSelect($c);
    }
}
------------------------------5H------------------------------
★symfony
●検索フォームの作成
・検索条件の設定
投稿日時の範囲指定→セレクトボックス*2
本文のワード検索→input
タイトルのワード検索→input
画像の有無→ラジオボタン
URLの有無→ラジオボタン
カテゴリ検索→セレクトボックス

・front/modules/default/templates/_kensaku.phpの作成
パーシャルをグローバルで作るなら/front/templatesに作成する

・front/modules/default/templates/indexSuccess.phpに追加
<!-- 検索フォーム -->
<?php include_partical("default/kensaku");?>
<!-- 検索フォームここまで -->

・/lib/model/Comment::Peer.phpを編集
class CommentPeer extends BaseCommentPeer
{
    static function getBbsArticles($search_arr = array()){
        $c = new Criteria;
       
        //$search_arrが存在する場合、検索条件によりadd
       
        //自身のクラスを参照する場合のみ、「Peer」ではなく「salf」で参照する
        $c->addDescendingOrderByColumn(self::CREATED_AT);
        return self::doSelect($c);
    }
}
------------------------------6H------------------------------
★symfony
●検索用のパーシャルを作成
・_kensaku.php
<?php echo form_tag("/",",method=get")?>
本文検索:
<?php echo input_tag("word", $search_arr["word"]) ?>
カテゴリ検索:
<?php echo select_tag("category", options_for_select($categorys, $search_arr["category"], array("include_blank" => true)))?>
<br>
投稿年月:
<?php echo input_date_tag("input_date_start", $search_arr["date_start"])?>

<?php echo input_date_tag("input_date_end", $search_arr["date_end"])?>
<br>
画像:
<?php echo radiobutton_tag("photo", "y")?>有
<?php echo radiobutton_tag("photo", "n")?>無
URL:
<?php echo radiobutton_tag("url", "y")?>有
<?php echo radiobutton_tag("url", "n")?>無
<br>
<?php echo submit_tag("検索")?>

</form>

・indexSuccessのカテゴリーと検索条件を_kensaku.phpにわたすために
<!-- 検索フォーム -->
<?php include_partial("default/kensaku",array("categorys"=>$categorys,"search_arr" => $search_arr));?>
<!-- 検索フォームここまで -->

・actions.class.phpの編集
        //検索のフォームを取得
        $this->search_arr = array(
        "word" => $this->getRequestParameter("word"),
        "category" => $this->getRequestParameter("category"),
        "date_start" => $this->getRequestParameter("date_start"),
        "date_end" => $this->getRequestParameter("date_end"),
        );

●検索する
・/front/module/default/actions/actions.class.phpの編集
$this->comments = CommentPeer::getBbsArticles($this->search_arr);

・/lib/model/CommentPeer.php
class CommentPeer extends BaseCommentPeer
{
    static function getBbsArticles($search_arr = array()){
        $c = new Criteria;

        //$search_arrが存在する場合、検索条件によりadd
        foreach($search_arr as $k =>$v){
            switch($k){
                case "word":
                    if($v != ""){
                        $c->add(self::CONTENT,"%{$v}%", Criteria::LIKE);
                    }
                    break;
                case "category":
                    if($v != ""){
                        $c->add(self::CATEGORY_ID, $v);
                    }
                    break;
                case "date_start":
                case "date_end":
                    if(isset($date_flg)){
                        break;
                    }
                    //一つのカラムに複数の条件をつける際にgetNewCriterion()を使う
                    if($search_arr["date_start"] && $search_arr["date_end"]){
                        $c1 = $c->getNewCriterion(self::CREATED_AT,$search_arr["date_start"], Criteria::GREATER_EQUAL);
                        $c2 = $c->getNewCriterion(self::CREATED_AT,$search_arr["date_end"], Criteria::LESS_EQUAL);
                        $c1->addAnd($c2);
                        $c->add($c1);
                    }elseif($search_arr["date_start"]){
                        $c->add(self::CREATED_AT,$search_arr["date_start"],Criteria::GREATER_THAN);
                    }elseif($search_arr["date_end"]){
                        $c->add(self::CREATED_AT,$search_arr["date_end"],Criteria::LESS_THAN);
                    }
                    $date_flg = 1;
                    break;
            }
        }

        //自身のクラスを参照する場合のみ、「Peer」ではなく「salf」で参照する
        $c->addDescendingOrderByColumn(self::CREATED_AT);
        return self::doSelect($c);
    }
}

-----------------------------memo------------------------------

0 件のコメント:

コメントを投稿