CakePHPでサンプルプログラムを作成してみる

CakePHPを設置してみる
の続き。

CakePHPでサンプルのプログラムを作成してみる。

作成するサンプルプログラム

商品名と価格を追加して、一覧表示するだけのプログラム。

以下、作成手順。

データベース/テーブルの作成

mysqlにログインして、sampleのデータベースを作成し、itemsテーブルを作成する。

mysql> CREATE DATABASE sample;
mysql> USE sample
mysql> CREATE TABLE items (
 id INT(11) PRIMARY KEY AUTO_INCREMENT,
 name VARCHAR(32),
 price INT(11)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;

データベースの設定

app/Config/database.php
を修正して、sampleデータベースを設定する。

<?php
・・・
class DATABASE_CONFIG {

  public $default = array(
    'datasource' => 'Database/Mysql',
    'persistent' => false,
    'host' => 'localhost',
    'login' => 'ユーザー名',
    'password' => 'パスワード',
    'database' => 'sample',	←作成したsampleデータベースを指定する
    'prefix' => '',
    //'encoding' => 'utf8',
  );
・・・

コントローラ

app/Controller/SampleController.php
を作成する。

<?php
App::uses('AppController', 'Controller');

/**
 * 商品の一覧表示と商品の追加を行う。
 */
class SampleController extends AppController {

  public $uses = array('Item');
  public $components = array('Price');
  public $helpers = array('Price');

  /**
   * 商品の一覧表示
   */
  public function index() {
    $items = $this->Item->getAll();

    $sum = $this->Price->getSum($items);
    $avg = $this->Price->getAverage($items);

    $this->set('items', $items);
    $this->set('sum', $sum);
    $this->set('avg', $avg);
  }

  /**
   * 商品の追加
   */
  public function add() {
    $name = $this->params['data']['name'];
    $price = $this->params['data']['price'];

    $result = $this->Item->add($name, $price);
    if ($result) {
      $this->redirect('/sample/');
    } else {
      $this->autoRender = false;
      print_r($this->Item->validationErrors);
    }
  }

}

コンポーネント

app/Controller/Component/PriceComponent.php
を作成する。

<?php
App::uses('Component', 'Controller');

/**
 * 価格関連の共通処理
 */
class PriceComponent extends Component {

  /**
   * 商品の合計価格を取得する。
   *
   * @param array $items 商品情報
   * @return int 商品の合計価格
   */
  public function getSum($items) {
    $sum = 0;
    foreach ($items as $item) {
      $sum += $item['Item']['price'];
    }
    return $sum;
  }

  /**
   * 商品の平均価格を取得する。
   *
   * @param array $items 商品情報
   * @return int 商品の平均価格
   */
  public function getAverage($items) {
    $sum = $count = 0;
    foreach ($items as $item) {
      $sum += $item['Item']['price'];
      $count++;
    }
    if ($count) {
      return $sum / $count;
    } else {
      return false;
    }
  }

}

モデル

app/Model/Item.php
を作成する。

<?php
/**
 * 商品情報
 */
class Item extends AppModel {

  public $validate = array(
    'name' => array(
      array('rule' => 'notEmpty', 'message' => '名前を入力してください'),
      array('rule' => array('maxLength', 8), 'message' => '8文字以下にしてください'),
    ),
    'price' => array(
      array('rule' => 'notEmpty', 'message' => '価格を入力してください'),
      array('rule' => 'numeric', 'message' => '数値を入力してください'),
    ),
  );

  /**
   * 商品情報をすべて修得する。
   *
   * @return array 商品情報
   */
  public function getAll() {
    return $this->find('all');
  }

  /**
   * 商品情報を追加する。
   *
   * @param string $name 商品名
   * @param int $price 価格
   * @return array/boolean 成功時は追加した商品情報。失敗時はfalse。
   */
  public function add($name, $price) {
    return $this->save(array('name' => $name, 'price' => $price));
  }

}

ビュー

app/View/Sample
ディレクトリを作成し、
app/View/Sample/index.ctp
を作成する。

<!-- Item一覧 -->
<table>
<tr>
  <th>ID</th>
  <th>名前</th>
  <th>価格</th>
</tr>
<?php foreach ($items as $item) { ?>
<tr>
  <td><?php echo $item['Item']['id']; ?></td>
  <td><?php echo $item['Item']['name']; ?></td>
  <td><?php echo $this->Price->format($item['Item']['price']); ?></td>
</tr>
<?php } ?>
</table>
合計 : <?php echo $sum; ?><br />
平均 : <?php echo $avg; ?><br />
<br />

<!-- Item追加 -->
<form action="<?php echo $this->Html->url('/sample/add'); ?>" method="post">
  名前 : <input type="text" name="name" /><br />
  価格 : <input type="text" name="price" /><br />
  <input type="submit" value="追加" /><br />
</form>

ヘルパー

app/View/Helper/PriceHelper.php
を作成する

<?php
App::uses('AppHelper', 'View/Helper');

/**
 * 価格の表示周りの共通処理
 */
class PriceHelper extends AppHelper {

  /**
   * 価格を整形する。
   *
   * @param int $price 価格
   * @return string 整形した価格の文字列
   */
  public function format($price) {
    return number_format($price) . '';
  }

}

以上で

サンプルプログラム完成。

http://(CakePHPの設置先)/sample/
にアクセスすると、サンプルプログラムが表示される。

最初は何も一覧に表示されない。

名前と価格を入力し、追加ボタンを押すと

追加され、一覧に表示される。

長すぎる名前や価格に文字列を指定すると

超適当にエラーが表示される。