Tutorial

Try this, so you know the reason why tackphp is the best framework.

チュートリアルではtwitterのような一言メッセージアプリを構築します。
編集するファイルをあらかじめ提示します。

|-- controller
|   |-- TweetController.php
|-- database.php
|-- model
|   |-- Tweet.php
|-- view
|   |-- tweet_index.tpl
`   `-- tweet_view.tpl

下記SQLでテーブルを作成してください。テーブル名はtweetとしています。

CREATE TABLE IF NOT EXISTS `tweet` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `message` varchar(140) NOT NULL,
  `created` datetime NOT NULL,
  `modified` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
テストデータも作成しておきます。
INSERT INTO `tweet` (`id`, `message`, `created`, `modified`) VALUES
(1, 'test2', '2013-01-01 00:00:00', '2013-01-01 00:00:00');

データベースへの接続アカウントの設定をします。 database.phpを開いて下記のように編集します。

<?php
class database{
        private $schema = array(
                'default' => array(
                        'host' => 'localhost',
                        'user' => 'user',
                        'password' => 'password',
                        'schema' => 'databasename',
                        'encoding' => 'utf8'
                        ),

データベース接続設定が完了したら、一言メッセージアプリでデータベースとの仲介を担う、モデルを作成します。
model/Tweet.phpを作成します。命名規則として、イニシャルを大文字、モデルファイル名とモデルクラス名を同じにします。

<?php
class Tweet extends Model{
}

作成したモデルを呼び出す、コントローラーを作成します。ここではcontroller/TweetController.phpというファイル名でTweetControllerを作成します。
getList()を呼び出すことでテーブル全レコードを取得することが出来ます。

<?php 
class TweetController extends Controller{ 
        public function index(){ 
                $Tweet  = new Tweet(); 
                $list     = $Tweet->getList(); 
                require_once($this->layout); 
        } 
}

コントローラーがモデルを通して受け取った値をテンプレートビューで表示します。
view/tweet_index.tplを作成します。テンプレートファイルの命名規則として「コントローラー名_(アンダースコア)アクション名.tpl」をファイル名にします。

<?php foreach($list as $val): ?>
<p><?php echo $val['message']; ?></p>
<?php endforeach; ?>

ビューの作成まで完了したらブラウザからアクセスしてみましょう。http://yourdomain.jp/tweet_index

閲覧が出来たら次は投稿機能を実装します。
作成済みであるcontroller/TweetController.phpに下記を追加します。

TweetController.php

public function add(){
      $message = $this->Request->getParam('message');
      $Tweet = new Tweet();
      $Tweet->addData(array('message' => $message));
      $this->redirect('tweet_index');
}
また、投稿フォームをview/tweet_index.tplに表示させましょう。

tweet_index.tpl

<form action="tweet_add" method="post">
<input type="text" name="message">
<input type="submit" value="add">
</form>

編集機能を実装します。
Tweet->getList()と異なって1レコードのみ取得する場合はTweet->getData()を呼び出します。引数として配列で検索したいkeyとvalueを渡します。結果、データが見つからない場合はcontrollerのアクション内でfalseをリターンします。falseをリターンすることによって処理が終了し、エラーレンダリングされます。
また、データを保存する場合はTweet->setData()を呼び出します。更新内容の配列を第一引数に、更新対象の配列を第二引数に渡します。

TweetController.php

public function view(){ 
        $id     = $this->Request->getParam('id');
        $Tweet  = new Tweet();
        $data   = $Tweet->getData(array('id' => $id));
        if(!$data)      return false;
        require_once($this->layout);
}
public function update(){
        $id     = $this->Request->getParam('id');
        $message= $this->Request->getParam('message');
        $Tweet  = new Tweet();
        $Tweet->setData(array('message' => $message), array('id' => $id));
        $this->redirect('tweet_index');
}
また、あわせてViewを作成します。

tweet_index.tpl

<?php foreach($list as $val): ?>
<p><a href="tweet_view?id=<?php echo $val['id']; ?>"><?php echo $val['message']; ?></a></p>
<?php endforeach; ?>

tweet_view

<form action="tweet_update" method="post">
<input type="hidden" name="id" value="<?php echo $data['id']; ?>">
<input type="text" name="message" value="<?php echo $data['message']; ?>">
<input type="submit" value="update">
</form>

Tweet->getList(), Tweet->getData()、Tweet->setData、Tweet->addDataなどModelの関数を呼び出す際に、引数の値が配列なため可読性が落ちます。
Tweet.phpを編集し、インターフェイスとなる引数をシンプルにすることができます。

Tweet.php

class Tweet extends Model{
        public function getData($id){
                $params = array('id' => $id);
                return parent::getData($params);
        }
        public function setData($id, $message){
                $updates = array('message' => $message);
                $conditions = array('id' => $id);
                return parent::setData($updates, $conditions);
        }
        public function addData($message){
                $params = array('message' => $message);
                return parent::addData($params);
        }
}
Tweetの各関数をオーバーライドしながらシンプルな引数に直します。
これによってController側もすっきりした内容に変更できます。

TweetController.php

class TweetController extends Controller{
        public function index(){ 
                $Tweet  = new Tweet();  
                $list     = $Tweet->getList(); 
                require_once($this->layout);
        } 
        public function add(){
                $message = $this->Request->getParam('message');
                $Tweet = new Tweet();
                $Tweet->addData($message);
                $this->redirect('tweet_index');
        }       
        public function view(){
                $id     = $this->Request->getParam('id');
                $Tweet  = new Tweet();
                $data   = $Tweet->getData($id);
                if(!$data)      return false;
                require_once($this->layout);
        }
        public function update(){
                $id     = $this->Request->getParam('id');
                $message= $this->Request->getParam('message');
                $Tweet  = new Tweet();
                $Tweet->setData($id, $message);
                $this->redirect('tweet_index');
        }
}


tackphp power