baserCMSでListBehaviorを利用してみる

どうもです・ω・
昨年のbaserCMS Advent Calendar 2013に続き、今年もbaserCMS Advent Calendar 2014が始まってます。
さてその17日担当です。=[ 'ω' ] トウフー

baserCMS3のご紹介

baserCMSとは、CMSです。
WordpressとかMovableTypeとかSHIRASAGIとかAdaptCMSとか、世の中には多彩なCMSがたくさんあって、その中で、PHPのフレームワークであるCakePHPを用いてできてるCMSです。

baserCMS(ベーサーシーエムエス)とは、「コーポレートサイトにちょうどいい」をコンセプトとし、オープンソースフレームワーク「CakePHP」をベースとし、環境準備の素早さに重点を置いた基本制作支援プロジェクトから生まれた国産CMS(コンテンツマネージメントシステム)です。
baser CMS - 国産オープンソース!フリー(無料)で『コーポレートサイトにちょうどいいCMS』

先日のOSC2014@福岡では、素敵なディスられ方をされていた素敵なCMSです。
公開から4年間使ってきたbaserCMSをそろそろ本気でdisってみる(OSC2014福岡)

プラグインとかテーマの配布・販売やってます。
baserマーケット

導入事例いっぱいあります。着々と増加中です。
baserCMS導入事例 | baser CMS』

この記事で紹介すること

さて、この記事では最近見つけたCakePHPのビヘイビアと、それをbaserCMSで利用することについて紹介します。
どちらかと言えば開発者さん向けの記事です。

ListBehavior(リストビヘイビア)について

CakePHPには、Behavior(ビヘイビア)と呼ばれるモデルの機能を拡張して便利にしてくれる機能があります。
ListBehaviorはその内のひとつで、データの並び替えを簡単に実現してくれるビヘイビアです。
githubで配布されてます。
CakeDC/utils
utils/ListBehavior.php at master · CakeDC/utils

ファイルの配置

以下のようにモデルフォルダ内のBehaviorフォルダ内に配置します。
/app/Model/Behavior/ListBehavior.php

使い方

データの並び替えを実装したいモデルに以下のように指定します。

/**
 * actsAs
 * 
 * @var array
 */
	public $actsAs = array(
		'List'
	);

組込むことで、コントローラ側では以下のメソッドが利用できるようになります。
moveUp、moveDown、moveToTop、moveToBottom。。。など。

モデルのテーブルには「position」フィールドを用意しておきます。
position には連番が1から入っていきます。
以下は例です。

CREATE TABLE `example_tables` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `position` int(11) DEFAULT NULL COMMENT '並び順',
  `name` varchar(255) DEFAULT NULL COMMENT 'データ名',
  `created` datetime DEFAULT NULL COMMENT '作成日',
  `modified` datetime DEFAULT NULL COMMENT '更新日',
  PRIMARY KEY (`id`)
);

コントローラ側では、以下のようにします。
サンプルでは並び順を上げてます。

/**
 * 並び順を上げる
 */
	public function move_up($id = null) {
		if ($this->Example->Behaviors->enabled('List')) {
			if ($this->Example->moveUp($id)) {
				$this->redirect(array('action' => 'index'));
			}
		} else {
			$this->setMessage('ListBehaviorが無効のモデルです。', true);
		}
		$this->redirect(array('action' => 'index'));
	}

ビュー側では、以下のようなリンクを置いておきます。

<?php $this->BcBaser->link('上へ移動する', array('controller' => 'examples', 'action' => 'move_up', $data['Example']['id'])) ?>

リンクをクリックして実行すると、positionの値が更新されます。2のものは1へ。1のものは2へ。

なぜこの並び替え機能を使ってみたのか?

baserCMSには、もともと並び替えを実現するためのビヘイビアや仕組みは既に入ってます。
TreeBehaviorは階層構造を保っての並び替えが可能ですし、固定ページを見てみると、フィールド「sort」を利用しての並び替え機能があります。
これらを利用すると良いじゃない、って感じです。

今回、このListBehaviorに目をつけたのは、グルーピングしての並び替えに対応しているのと、TreeBehaviorより簡単な仕組みでやってみたかった場面があったからです。
さっきのテーブル構造が以下のような場合です。

CREATE TABLE `example_tables` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `position` int(11) DEFAULT NULL COMMENT '並び順',
  `group_id` int(11) DEFAULT NULL COMMENT 'グループID',
  `name` varchar(255) DEFAULT NULL COMMENT 'データ名',
  `created` datetime DEFAULT NULL COMMENT '作成日',
  `modified` datetime DEFAULT NULL COMMENT '更新日',
  PRIMARY KEY (`id`)
);

group_id を用いて利用するデータを一括りにまとめて扱う際に、ListBehaviorでは以下のように指定することで、並び替えの範囲を指定したフィールド値の範囲内のみで行うことができます。

/**
 * actsAs
 * 
 * @var array
 */
	public $actsAs = array(
		'List' => array(
			'scope' => 'group_id'
		)
	);

こういった感じで、ListBehaviorを利用することが出来ます。

プラグインで利用したり、簡易なマスタメンテ作るときとか

利用する場面としては、マスタメンテ画面をちょっと用意する必要があるときとか、プラグイン側での利用でしょうか。
2012-12-25 - kanji

独自実装するときに、ちょっと並び替え必要なんだけど。。。というときに使えると思います。

最後に。。。

配布先では、他にも便利そうなビヘイビアが公開中です。
utils/Model/Behavior at master · CakeDC/utils

baserCMSでは、このようにCakePHPの便利なライブラリをすぐに導入することができます。
ちょっと拡張したい場合は、周辺情報を少し探ってみると良いかもしれません。

ではでは、baserCMSで楽しい開発ライフを送りましょう丶(・ω・)ノ

baserCMS Advent Calendar 2014 - Adventar
■ 昨年の baserCMS Advent Calendar 2013 - Adventar
■ 一昨年の baserCMS Advent Calendar 2012 - Adventar

それと、以下ではリリース間近(なのかな?)のbaserJSについての紹介記事が進行中です。
すごい。なんかいっぱい機能あります。
baserJS Advent Calendar 2014 - Qiita
こちらも楽しみなのです。

▲ to Top

トラックバック(0)

▲ to Top