cakeがだいぶすすみましたよ

2007/11/28 水曜日 - 0:48:00 by kensuu

けんすうです。
月曜日更新なのに、忘れていました・・・。
しかし勉強のほうはすすんでおります。

さて、前回「何を書いたらいいのかわからない」
という声があったのですが
以下のブログでこんな言及をいただきました。


ソースが見たい - ANOTHER PIECES

「頑張った」、「苦労した」とかという話自体は結構どーでもよくて、むしろ大事なのは「頑張った結果こういうソースを書いた」、「苦労したけど、こういうソースが書けた」というのが欲しい。

ああ、おっしゃるとおりですね・・・。

ということで、ソースを貼り付けてみることにします。

しかし、1から説明するのも冗長になりすぎるし
説明が少なすぎても単にソース公開になってしまいます。
あまりに説明するのが下手すぎて
イヤになるのですが、お許しください。

僕が今、何をやりたいかというと

「個人の掲示板が持てるプロフィールサイトのようなもの」
をCakePHPで作るということです。

イメージ的には僕がやっているサイトである

自己紹介@milkcafe掲示板

を見てもらうと近いかもしれません。
個人の掲示板をたてて、そこで自由に交流するというものです。

というわけで、必要なDB。
これは

User
→ユーザー認証のために、メールアドレスとパスをいれる

Profile
→ユーザーの名前やプロフィールを入れる

Post
→掲示板への投稿データが入る。

というわけで、まずはユーザーページ周りです。
ユーザーページとは、mixiなどでいう、
他のユーザーから見た、ユーザーのトップページのことですね。

profiles_controller.phpは以下の通り。

<?php 
 
class ProfilesController extends AppController
{
 
    var $name = 'Profiles';
    var $uses = array('Post','Profile','User');
    
    //ページング用の数値
    public $view_default_limit = 5;
    
    //プロフィールのテンプレを上書き〜
    public $layout = 'profile_default';
    
    function index()
    {
        //セッション情報からログイン中のuserのidを取得
        $auth = $this->Session->read("auth");
        $cond = array('user_id' => $auth['id']);
        $this->set('profile', $profile = $this->Profile->findByUserId($auth['id']));
 
        //ページタイトル
        $this->pageTitle = $profile['Profile']['name'] . "のページ";
    }
 
    function view($to_user_id = null,$page=1)
    {
        //セッション情報からログイン中のuserのidを取得
        $auth = $this->Session->read("auth");
        $cond = array('user_id' => $auth['id']);
        $this->set('my_profile', $my_profile = $this->Profile->findByUserId($auth['id']));
        
        //ユーザーidをセットしておく
        $this->set('to_user_id', $to_user_id);
        
        //ユーザーIDの投稿画面&表示
        $cond = array('to_user_id' => $to_user_id);
        
        //データの数を数える
        $count = $this->Post->findCount($cond);
        $this->set('count', $count);
        
        //取り出すレコードの開始位置
        $st = 0;
        
        //ページング限界数をセット
        $lim = $this->view_default_limit;
        $this->set('lim',$lim);
                
        $page = !isset($_GET["page"]) || $_GET["page"] <1 ? 1 : intval($_GET["page"]);
        
        $st = ($page - 1) * $lim;
        //次の10件
        $next = $page + 1;
        //前の10件
        $prev = $page - 1;
        $prev = $prev <1 ? 1 : $prev;
        
        //ページングのやつを配列にいれてsetしちゃうよ
        $pages = array(
                'page' => $page,
                'prev' => $prev,
                'next' => $next
                );
 
        $this->set('pages',$pages);
 
        //とりあえず$postsにデータを入れる(最後の2はなんだ?調べる)
        $posts = $this->Post->findAll($cond, null, 'Post.created DESC', $lim, $page,2);        
        
        //新しいものを下にしたいので配列を逆にするよ
        //あきやん曰くarray_reverse使えのことなのであとで直す
        //$created = array();
        //foreach ($posts as $v) $created[] = $v['Post']['created'];
        //array_multisort($created, SORT_DESC, SORT_NUMERIC, $posts);
        
        //セット
        $this->set('posts', $posts);
 
        //pr($posts);
 
        //名前のためにprofilesをsetしないと
        $this->set('profiles', $profiles = $this->Profile->findByUserId($to_user_id));
        
        //ページタイトル
        $this->pageTitle = $profiles['Profile']['name'] . "のページ";
    }
 
}
    
?>

こんな感じ。

苦労したところは、アソシエーション部分です。

CakePHPでは、DBに対応するview、controller、model
を作っていくのですが、
当然、ページによっては複数のDBのデータを扱いたいときがあります。
それらをつなげるのがアソシエーションなのです。(たぶん)

アソシエーションの結びつきはmodel部分でやるのですが、
このユーザーページでは、ProfileとPostをつなげなくてはいけません。
さらに、ProfileはUserとつながっているという状態でした。

というわけで、各modelは以下の通り

Userモデル

<?php 
 
class User extends AppModel
{
    var $name = 'User';
    
      var $validate = array (
        'email' => VALID_EMAIL,
      );
    
    var $hasOne = array('Profile');
    
    var $hasMany = array(
                    'Post' => array(
                        'className' => 'Post', //クラス名
                        'conditions' => '', //抽出条件
                        'order' => 'Post.created DESC', //取得順
                        'limit' =>'3',    //最新3件までをUserと同時に取得
                        'foreignKey' => 'user_id',    //Post.user_idとこのモデルのidを条件に統合
                        'dependent' =>true,
                        'exclusive' =>false,
                        'finderQuery' =>''
                    )
                );    
 
}
 ?>

Profileモデル

<?php 
 
class Profile extends AppModel
{
    var $name = 'Profile';
    var $belongsTo = array(
        'User' => array(
            'className' => 'User',
            'conditions' => '',
            'order' => '',
            'foreignKey' => 'user_id'
            )
        );
}
 
?>

Postモデル

<?php 
 
class Post extends AppModel
{
    var $name = 'Post';
    var $belongsTo = array(
        'User' => array(
            'className' => 'User',
            'conditions' => '',
            'order' => '',
            'foreignKey' => 'user_id'
            )
        );
}
 
?>

という感じですね。

アソシエーションについての詳しい説明はしないとして、
一度ここでつなげてしまえば、
あとはcontroller内でデータを使えるようになりました。
ここまできて、今まで勉強してきた
PHPの知識とつながってきて
少し理解がすすんだなあ、と思います。

しかし、75日くらいの勉強内容として、
この進行度はどのくらいなのか少し不安になりますね。
100日終わるころには、
ある程度ストレスなくサイトができるようになっていればいいなあ、と。

※しかしプログラム勉強をブログで紹介するのは難しい。

WordPress database error: [Table 'rock_100.wp_comments' doesn't exist]
SELECT * FROM wp_comments WHERE comment_post_ID = '151' AND comment_approved = '1' ORDER BY comment_date

Leave a Reply

XHTML: You can use these tags:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>