cakePHP2.xでこの機能あるのかな?ちょっとざっと調べてみた。(日本語URL&重複チェック・削除フラグで完全削除しない&アソシエーション)
久々にcakePHP2.xねたで・・・。
緩やかに確認進んでいますが・・・一向にサイト作成まではつながっていかない・・。
①日本語URLが使いたい。(重複チェックついか)
wordpressとか使ってると普通に投稿のタイトルとかで、URLとして作成できるので、そのほうがいいかなと思っている。cakePHPの場合、デフォルトでIDを推奨しているようで、数字のURLになってしまう。まぁー通常の投稿とかはいいけど、カテゴリとかタグとかは日本語名にしたいなと思いちょっと修正。コレであっているかは分からないが、単純にIDでURL作ってリンクにしているところをタグなどの名前にしてみた。コレはカラム名で「name」とする。
あとは詳細を表示するコントローラーの関数側で、$idを$nameにして、「$this->MtrMemotag->findByName($name);」で値を取得する。そんな感じで実現できました。
ただ、同一名のnameがあると古いほうを優先して取ってきちゃうようなので、同一名のnameが内容にチャックしないといけない。これはmodelのバリデート機能でできる。
public $validate = array( 'name' => array( 'required' => array( 'rule' => 'isUnique', 'message' => 'このタグ名はすでに使用されています。' ) ),);
②削除フラグで完全削除しない&アソシエーション
データを残して削除フラグを立てる機能を追加した。これは「論理削除」というらしい。コレはいろんなブログで紹介されている「SoftDeletable Behavior 」を使用する。cakePHP1.Xとは少し設定が違うので、結構はまった。DBテーブル的には対象となるテーブルに「deleted(tinyint(1) 0)とdeleted_date(datetime null)」のカラムを追加する。
「SoftDeletable Behavior 」ダウンロードしてまず、ファイル名の確認「soft_deletable.php」→「SoftDeleteBehavior.php」こういう名前でないといけない。それで、app/models/behaviorsに入れます。論理削除を利用したいmodelに「$actsAs = array('SoftDeletable');」を入れる。
更にコントローラ部の通常であれば「$this->’model名’->delete($id)」で削除を実行するのであるが、このビヘイビアは「$this->’model名’->delete()」を呼ぶと「false」を返すため、「if(!$this->’model名’->delete())」でメッセージやリダイレクト先を記述すればOKになる。
ただ問題はアソシエーションしている場合(1-多、多-多など)。論理削除した場合でも関連性は残るので、アソシエーションしているデータを出力するとデータを表示させてしまう。そのため、少々めんどくさいが、表示部分で「deleted」が「1」の場合は表示しないなどの出し分けにしてしまった。もっとスマートな方法があれば教えてください!
必要な機能を洗い出して、いよいよサイト制作できるかな・・・