blog/2007-11-18


Total: 2378 / Today: 1 / Yesterday: 1

cakePHP

さて、前回のsqlはさておきGoogleMapsのデーター管理に便利なソフトはないかと情報を集めていたら、cakePHPというものが目に入った。簡単にsqlを使ったPHPアプリケーションが作れるらしい。情報はkiyoeri氏の情報この記事を参考にした。

まず、GoogleMapsとデーター管理に必要な情報を考えてみよう。データーベース名は、 *cake_gmaps* とする。なお、Epilogueでは文字コードは、旧コンテンツをのぞいてすべてUTF-8にしている都合上、こちらもUTF-8にセットしておく。というか、ajaxでデーター呼び出したりするときに、UTF-8以外だと文字コードをごにょごにょしなきゃならないし。

フィールドの内容フィールド名フィールドタイプ基本値追加
IDidint(11)UNSIGNEDauto_increment
緯度latdecimal(10,6)0.000000
経度lngdecimal(10,6)0.000000
マーカー名titlevarchar(255)utf8_general_ci
マーカーの種類typevarchar(32)utf8_general_ci
縮尺zoomint(11)
詳細情報explainmediumtextutf8_general_ci

これを、phpmyadminで手動で入力。

次にマニュアルを参考にcakePHPをインストールする。インストールの方法は、ここでは割愛。次に、上記データーベースにアクセスするためのコントローラーと、表示部を作る。

cake/app/controllers/gmaps_controller.php
<?php
class GmapsController extends AppController
{
    var $name = 'Gmaps';
    var $scaffold;
cake/app/models/gmaps.php
<?php
class Gmaps extends AppModel
{
    var $name = 'Gmaps';

問題なくインストールされると、

http://ホスト名/cake/gmaps/

からデーターベースの一覧ページにアクセスできるはずだ。これだけで、データーの追加、編集、削除がすべて行える。ものすごく簡単だ。

しかし、このままでは殺風景である。また、データーベースの量が増えてきても一覧ページはページ切り替えみたいな処理を行っていないため、面倒である。そこで、一覧表時用のテンプレートを修正する。

cake/app/controllers/gmaps_controller.php
<?php
 class GmapsController extends AppController
 {
     var $name = 'Gmaps';
     var $scaffold;
+    function index($page=1)
+    {
+        $count = $this->Gmap->findCount();
+        $this->set('count', $count);
+
+        $before = "";
+        if ( $page >= 2) {
+           $before = $page - 1;
+

で、こちらがテンプレート

cake/app/views/gmaps/index.thtml
<h1>gmaps 一覧</h1>
全<?php echo $count ?>件
<?php
  if ($before <> "" ) {
    echo $html->link("[前ページ]","/gmaps/index/{$before

これで、一覧ページは少しは見栄えがよくなった。

SMFとのインテグレート

まぁ、個人で使う場合ならこれだけで十分だが、不特定多数で使うとなると悪意を持った投稿などが心配である。PukiWikiのように不特定多数前提のスクリプトなら問題は無いし、設定である程度技術的に対処可能であるが、cakePHPの場合、カスタマイズ性の高さ故にこういった準備を自分でしなければならない。これは少し面倒である。そこで、Epilogueのフォーラムのユーザー認証システムを流用することにした。

俗に言うIntegrate、もしくはBridgeである。

参考にした記事は、SMAKE: SMF forum - CakePHP integration。ここの例では、cakePHP上にフォーラムのスクリプトをインストールするよう書かれているが、すでに設置しているため、若干修正を加える。

まず、app/bootstrap.phpに以下の行をファイルの?>の手前に追加。

require_Once('(フォーラムの設置パス)/SSI.php');
/cake/app/config/core.phpの55行目付近
-	define('CAKE_SESSION_COOKIE', 'CAKEPHP');
+	define('CAKE_SESSION_COOKIE', 'PHPSESSID');

次にcake/libs/session.phpを、session_cake.phpにリネームする。そして、ファイルの中身を以下のように修正

53行目付近
-class CakeSession extends Object {
+class CakeOriginalSession extends Object {

cake/libs/ディレクトリに、session_smf.phpを作成する。内容は、http://bin.cakephp.org/view/1933866502をコピペ

cake/lib/session.phpは、以下のようにする

<?php
require_once('session_smf.php'); class CakeSession extends SmfSession {

しかしながら、CakePHP & SMFによると、この方法だとajaxによる操作時に問題が起きるらしい。

そこで、app/bootstrap.phpの

require_Once('(フォーラムの設置パス)/SSI.php');

を削除し、以下のファイルを以下のように修正。

cake/libs/contoller/component.php
/**
 * Used to initialize the components for current controller
 *
 * @param object $controller
 * @access public
 */
-	function init(&$controller) {
-		$this->__controller =& $controller;
-
-		if ($this->__controller->components !== false) {
-			$loaded = array();
-			$this->__controller->components = array_merge($this->__controller->components, array('Session'));
-			$loaded = $this->__loadComponents($loaded, $this->__controller->components);
-
-			foreach (array_keys($loaded)as $component) {
-				$tempComponent =& $loaded[$component];
-
-				if (isset($tempComponent->components) && is_array($tempComponent->components)) {
-					foreach ($tempComponent->components as $subComponent) {
-						$this->__controller->{$component

なに?SMF自体、あまり日本じゃ使われてないって!?大きなお世話だ!!!


Last Modified: 2007-11-18 10:16:51