blog/2007-11-18
cakePHP
さて、前回のsqlはさておきGoogleMapsのデーター管理に便利なソフトはないかと情報を集めていたら、cakePHPというものが目に入った。簡単にsqlを使ったPHPアプリケーションが作れるらしい。情報はkiyoeri氏の情報のこの記事を参考にした。
まず、GoogleMapsとデーター管理に必要な情報を考えてみよう。データーベース名は、 *cake_gmaps* とする。なお、Epilogueでは文字コードは、旧コンテンツをのぞいてすべてUTF-8にしている都合上、こちらもUTF-8にセットしておく。というか、ajaxでデーター呼び出したりするときに、UTF-8以外だと文字コードをごにょごにょしなきゃならないし。
フィールドの内容 | フィールド名 | フィールドタイプ | 基本値 | 追加 |
---|---|---|---|---|
ID | id | int(11) | UNSIGNED | auto_increment |
緯度 | lat | decimal(10,6) | 0.000000 | |
経度 | lng | decimal(10,6) | 0.000000 | |
マーカー名 | title | varchar(255) | utf8_general_ci | |
マーカーの種類 | type | varchar(32) | utf8_general_ci | |
縮尺 | zoom | int(11) | ||
詳細情報 | explain | mediumtext | utf8_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