CakePHPのアーカイブにはサンプルが含まれていないので、自習用に超簡単なサンプルを書いてみた。簡易掲示板的なソフトで、テーブルは利用者(user)と投稿(post)の2つだけ。利用者を投稿に紐付けして、Scaffoldでデータ管理を行いつつ、インデックスページにページネーション付きで投稿を一覧表示する。とっても簡単なソフトだけど、僕のような超初心者が勉強するためのたたき台にはちょうどいいかも。
テーブル作成。
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `email` varchar(255) NOT NULL, `phone` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
CREATE TABLE `posts` ( `id` int(11) NOT NULL AUTO_INCREMENT, `message` varchar(1024) NOT NULL, `user_id` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
データベース定義
class DATABASE_CONFIG { public $default = array( 'datasource' => 'Database/Mysql', 'persistent' => false, 'host' => 'mysql.example.com', 'login' => 'cake_sample', 'password' => 'cake_sample', 'database' => 'cake_sample', 'prefix' => '', 'encoding' => 'utf8', ); }
モデル定義
class User extends AppModel { public $name = 'User'; public $hasMany = 'Post'; }
class Post extends AppModel { public $name = 'Post'; public $belongsTo = 'User'; }
コントローラ定義
class HomeController extends AppController { public $name = 'Home'; public $uses = array('Post', 'User'); public $autoRender = true; public $autoLayout = true; public $paginate; public function index() { $data = $this->paginate('Post'); $this->set('data', $data); } }
class PostsController extends AppController { public $name = 'Post'; public $scaffold; }
class UsersController extends AppController { public $name = 'User'; public $scaffold; }
ビュー定義
<h1>Posts</h1> <?php echo $this->Paginator->numbers( array( 'before'=>$this->Paginator->first('<<').'|', 'after'=>'|'.$this->Paginator->last('>>'), 'modulus'=>4, 'separator'=>'|', )); ?> <table> <tr> <th><?php echo $this->Paginator->sort('id','id') ?></th> <th><?php echo $this->Paginator->sort('message','Message') ?></th> <th><?php echo $this->Paginator->sort('user_id','User') ?></th> </tr> <?php foreach ($data as $record) { echo $this->Html->tableCells( $record['Post'], array('style'=>'color:#333333; background-color: #eeeeff'), array('style'=>'color:#333333; background-color: #ffeeff'), false ); } ?> </table>