このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

小規模 Web アプリケーション開発によく見かける機能をビヘイビアで実装してみる

ホスト言語側での自動採番、削除フラグが真のレコードを取得しない、順序がある…といったモデルを作る際に使えそうなビヘイビアのサンプルです。

ホスト言語側での自動採番

<?php
class HostSideIncrementableBehavior extends ModelBehavior
{
    var $__defaults = array("increment_field" => "order");

    function setup(&$model, $config = array())
    {
        $config = array_merge($this->__defaults, $config);
        $this->settings[$model->alias] = $config;
    }

    function beforeSave(&$model)
    {
        $field = $this->settings[$model->alias]["increment_field"];

        if (empty($model->data[$model->alias]["id"]) &&
            empty($model->data[$model->alias][$field])) {
            $order  = array($model->alias => array($field => "DESC"));
            $result = $model->find(null, null, $order, 1);
            if (empty($result)) {
                $next = 1;
            } else {
                $next = $result[$model->alias][$field] + 1;
            }
            $model->data[$model->alias][$field] = $next;
        }

        return true;
    }
}
?>

削除フラグが真のレコードを取得しない

<?php
class SoftwareDeletableBehavior extends ModelBehavior
{
    var $__defaults = array("visible_field" => "visible",
                            "visible_value" => true);

    function setup(&$model, $config = array())
    {
        $config = array_merge($this->__defaults, $config);
        $this->settings[$model->alias] = $config;
    }

    function beforeFind(&$model, $query)
    {
        $field   = $this->settings[$model->alias]["visible_field"];
        $visible = $this->settings[$model->alias]["visible_value"];

        if (is_array($query["conditions"])) {
            $query["conditions"][$model->alias. ".". $field] = $visible;
        } else if (strlen($query["conditions"])) {
            $query["conditions"] = array($query["conditions"]);
            $query["conditions"][$model->alias. ".". $field] = $visible;
        } else {
            $query["conditions"] = array();
            $query["conditions"][$model->alias. ".". $field] = $visible;
        }

        return $query;
    }
}
?>

順序がある

<?php
class SortableBehavior extends ModelBehavior
{
    var $__defaults = array("order_field"     => "order",
                            "order_direction" => "ASC");

    function setup(&$model, $config = array())
    {
        $config = array_merge($this->__defaults, $config);
        $this->settings[$model->alias] = $config;
    }

    function beforeFind(&$model, $query)
    {
        $field     = $this->settings[$model->alias]["order_field"];
        $direction = $this->settings[$model->alias]["order_direction"];

        if (is_array($query["order"])) {
            $query["order"][$model->alias] = array($field => $direction);
        } else if (strlen($query["order"])) {
            $query["order"] = array($query["order"]);
            $query["order"][$model->alias] = array($field => $direction);
        } else {
            $query["order"] = array();
            $query["order"][$model->alias] = array($field => $direction);
        }

        return $query;
    }
}
?>

やはり CakePHP 1.2 はオブジェクト指向が加速しますね。

back to top