no-image

はじめてのCakePHP:既存のブログシステムから移行しよう part.1

タイトルながくなってしまった。

CakePHP勉強会に参加するので俺だってCakePHPくらい使えるんだぜー!という所を。

はじめに

私が動かしてるブログシステムをCakePHPで書き直すとしたらどうするのかな。という事をやっていきます。
CakePHPって独自ルールが多いから新規開発は早くても既存システムに食い込むのは難しいんじゃないの?みたいな疑問を払拭していきたい。

インストールと設定

donate,donateってうるせー!
今回は1.2.0.7125-rc1を使いました。新しいのか古いのかしらない。

http://cakeforge.org/frs/download.php/626/cake_1.2.0.7125-rc1.tar.gz/donation=complete

ダウンロードして解答します。そしたら


chmod -R 777 app/tmp

してtmpディレクトリに書き込み権限をあたえます。これはEthnaでもやりますね。次はsaltの設定。
app/config/core.phpを開いて153行目あたりにあるSecurity.saltの値を適当に変えてください。ぐちゃぐちゃぐちゃ。
最後はDBの設定。

自分のブログはsqliteで動いているのでapp/config/database.phpを開いてDATABASE_CONFIGクラスの$defaultを以下のような感じに。


83 >---var $default = array(
84 >--->---'driver' => 'sqlite',
85 >--->---'persistent' => false,
86 >--->---'host' => 'localhost',
87 >--->---'login' => 'user',
88 >--->---'password' => 'password',
89 >--->---'database' => '/home/hoge/cake/dbs/blog.db',
90 >--->---'prefix' => '',
91 >---);

これで設定はおしまい。ちなみにここまでは本当にノードキュメントでいけました。index.phpにデフォルトで警告文が出るのでそれを見ながら適当に書くだけ。ドキュメントなしでここまでいけるなんてすごすぎ。

まーEthnaでも最近はプラグインによるセットアップサポートが(ry

モデルの作成

ここはチュートリアルをみた。今回いじるテーブルはこれ。


CREATE TABLE article (
id INTEGER NOT NULL PRIMARY KEY,
title VARCHAR,
timestamp DATETIME ,
content TEXT,
date DATE,
format VARCHAR,
visible MEDIUMINT
);

で、CakeはRailsゆずりの、DB名が複数形でうんぬんとかあるので「テーブル名変更しなきゃダメじゃねーつかえねー」とか言い出しそうになりますが、Cakeは空気が読めるので以下のように明示的にテーブル名を指定してモデルを作る事で既存のテーブルがそのまま使えます。(これはソースみて適当に入れてるんで正しいやりかたなのかはしらない)


app/models/article.php
class Article extends AppModel
{
    var $name = 'Article';
    var $useTable = 'article';
}

controllerの作成

次はcontroller。Ethnaでいうactionみたいな感じ。既存のDBがeuc-jpなのでfindAllしてmb_convert_encodingした後にset。Ethnaにもmodelほしーなー。


app/controllers/articles_controller.php
class ArticlesController extends AppController
{
    var $name = 'Articles';
 
    function index()
    {   
        $articles = $this->Article->findAll(null, null, 'date desc', 5); 

        foreach ($articles as $key => $article) {
            $article = current($article);
            $article['content'] = mb_convert_encoding($article['content'], 'UTF-8', 'EUC-JP');
            $article['title'] = mb_convert_encoding($article['title'], 'UTF-8', 'EUC-JP');
            $articles[$key]['Article'] = $article;
        }   

        $this->set('articles', $articles);
    }
}

正直どれが単数形でどれが複数形だっけ?とかごちゃごちゃになる。みんなも注意な!(たぶんすぐに慣れるんだろうけど)

viewの作成

で、この状態でアクセスするとViewがないといわれるのでViewをつくる。

viewといってもctpというphpとhtmlが混在したテンプレート。俺はEthnaでもViewクラスを削除してダイレクトにsmartyに投げてたのでこのへんのストレートなやり方に共感。


app/views/articles/index.ctp
<h1>Blog</h1>
<?php foreach ($articles as $article): ?>
<?php var_dump($article); ?>
<?php endforeach; ?>

これでcake/index.php/articlesにアクセスするとブログ記事の一覧が出てくる。えー!もうできたのーはえーーー!