ぼくとわたしのCakePHP

http://matsuri.cakephp.jp/:image=http://matsuri.cakephp.jp/themed/tokyo09/img/badges/matsurired.png

CakeMatsuri応援企画 "リレーブログ「ぼくとわたしのCakePHP」" のバトンをid:cakephperさんから受けましたので、そうそうたるメンバの中、CakePHP暦は短い私ですが今までのCakePHPとの関わりを書いてみます。

今までブログはこちらから

CakePHPと出会う

うちの会社では、長らく独自のFWを使っていたのですが、教育の問題やメンバに一般的なスキルをつけさせたい等いろいろ考え次期FWを検討していました。CakePHPを試し始めていたところちょうど良いタイミングで「CakePHPハンズオン@Tokyo #2」 の募集がはじまりました。ブログチュートリアルをこなして、色々と試し始めていたのですが忙しさにかまけてなかなか進んでいませんでした。そこで、プレッシャーをかける意味も込めて、サポータとして参加することにしました。事前の予習や、参加した皆さんのお手伝い、そして安藤さんの話を聞けたことで、色々とスッキリした事や、気付きがあり理解度が深まりました。このハンズオンをきっかけにCakePHPを使っていこうと決めました。

CakePHPを使う

実業務ではまだCakePHPを使っていない状態でしたが、伝説(?)の開発合宿に、一泊だけでしたが参加しました。RubyRailsCakePHPもスキルが足らない状況での参加だった為、軽めの機能を担当しました。あまり貢献はできませんでしたが、参加した皆さんと出会えた事、皆さんのコードを読めた事はとてもためになりました。また、CakePHPとは直接関係はありませんが、redmine+gitを使った実際の開発にふれられた事もとても良い経験でした。

その後、正式にCakePHPを採用しいくつかの案件をリリースしました!もちろん現在もCakePHPで開発を進めています(^^。

CakePHPと関わる

こうした活動や、昨年頭位から参加し始めたPHP勉強会などで「青年団」の皆と知り合い、CakeMatsuriの運営に関わる事になります。それまで、コミュニティ活動とかした事が無かった私がこんな風に関わろうと思ったのは、安藤さんに聞いた「give back much as you take!」という言葉がきっかけだったと思います。これからも、少しずつでも自分なりの方法で関わり続けていきたいと思っています。

とはいえ、外に出ていろんな人に出会って刺激を受けるのが楽しい!ってのが一番の理由かも...(^^;

CakeMatsuri

という事で、来る10/30,31にCakeMatsuriが開催されます。
ワークショップの募集は既に閉め切りましたが、カンファレンス(10/31)はまだ余裕があります。是非、一年に一度のCakeのお祭りを一緒に楽しみましょう!

http://matsuri.cakephp.jp/:image=http://matsuri.cakephp.jp/themed/tokyo09/img/badges/matsurired.png

明日は、MASA-Pさんの登場です!お楽しみに!

smatyview pluginを公開しました

先日の、CakePHPオフ会でMASA-Pさんに了承頂いたので、smartviewをplugin化して若干手を入れたものを公開しました。
まだドキュメント等もあまり整備されていませんが、ひとまずという事で...下記からどうぞ。

http://github.com/kaz29/smartyview/tree/master

ドキュメントを少し整理してから、以前ここのブログでも書いたsmartyviewのtplをDBに保存する、smartydb viewを組み込む予定です。

第1回 CakePHPオフ会@関東が開催されます!

id:cakephperさんの所でも既に告知がありますが、 第1回 CakePHPオフ会@関東が開催されます。
前回のirc集会のあとに色々話をしていて、「いきなり懇親会みたいな集まりをやりたいねー」みたいな話になりついに開催する運びとなりました。


http://atnd.org/events/1101

CakePHPオフ会を開催いたします。
CakePHPを利用したことがある人、CakePHPが好きな人が集まってワイワイやるだけのイベントです。
Cakeユーザ同士、普段なかなか集まって話す機会が少ないため、交流を目的として定期的にオフ会をしていけたらと思っています。

日時: 8/5(水) 19:30から22:30ごろ
場所: 四谷3丁目付近
金額: 2500〜5000円
対象: CakePHPユーザ

ひとまず、第一回という事でトライアルの意味もあり、主催者含め10名程度の少人数で募集しています。
人数が多いようなら、会場含め見直す事になるかもしれないので定員になってもコメントお願いしますー。

CakePHP 1.2.3.8166リリース

CakePHP 1.2.3.8166がリリースされましたよー。
http://bakery.cakephp.org/articles/view/release-cakephp-1-2-3-8166

先日書いたpagenatorのバグが修正されている様です。セキュリティーフィックスも含まれている様なので、サクッっとアップデートしました。

CakePHPでテンプレートにDBを使用する方法

現在進行している案件では、リリース後はクライアントさんの運用担当者にtemplate修正をしてもらう流れになるので、CMS的な物を作成中です。

そこで問題になるのは、templateエンジンどうするか!
CakePHP1.2では、拡張子 ctpのphpファイルがデフォルトのテンプレートなのですが、さすがにそのままデザイナさんや運用担当の方に修正をお願いするのも忍びないし、ちょっと怖いですよね。

で、クライアントサイドで修正する物は SmatyViewを使い、Smartyで実現する事にしました。

Smartyには、リソースプラグインという機構があって、ファイルシステム上に限らず独自テンプレートソースを定義する事ができます。
実習もかねて(^^;、これをCakePHPで実現する為に実験をしてみました。

使用するリソース

今回は一般的に一番使われるであろう、DB上のテンプレートソースを扱ってみる事にします。テーブルの構造は例えばこんな感じ...。

CREATE TABLE "templates" (
"id" SERIAL NOT NULL ,
"name" VARCHAR(256) NOT NULL,
"data" TEXT NOT NULL,
"created" TIMESTAMP NOT NULL ,
"modified" TIMESTAMP ,
PRIMARY KEY ("id")
);

SmartydbViewを作成

要件を簡単に実現する為に、SmartydbViewというクラスをSmartyViewから派生させました。
ソースは以下。

<?php
class SmartydbView extends SmartyView
{    
  function __construct(&$controller)
  {
    parent::__construct($controller);

    $this->subDir = null;
    $this->ext= null;

    $this->smarty->register_resource("db", array($this, "__get_template",
          "__get_template_timestamp",
          "__get_template_secure",
          "__get_template_trusted"));
    $this->smarty->default_resource_type = 'db' ;

    $this->_template = ClassRegistry::init('Template');      
    $this->_template->recursive = 0 ;
    
    $this->template = array() ;
  }
	
  function __get_template($tpl_name, &$tpl_source, &$smarty)
  {
    $tpl = $this->__read_template( $tpl_name ) ;
    if ( $tpl === false ) 
      return false ;
   
    $tpl_source = $tpl['Template']['data'];
    return true ;
  }
  
  function __get_template_timestamp($tpl_name, &$tpl_timestamp, &$smarty)
  {    
    $tpl = $this->__read_template( $tpl_name ) ;
    if ( $tpl === false ) 
      return false ;
      
    $tpl_timestamp = strtotime($tpl['Template']['modified']) ;

    return true ;
  }
  
  function __get_template_secure($tpl_name, &$smarty)
  {
      // 全てのテンプレートがセキュアであると仮定する
      return true;
  }

  function __get_template_trusted($tpl_name, &$smarty)
  {
      // テンプレートからは使用しない
  }
 
  function _getViewFileName($name = null) 
  {
    $subDir = null;

    if ($name === null) {
      $name = $this->action;
    }
    $name = str_replace('/', DS, $name);

    $tpl = $this->__read_template( $name ) ;
    
    if ( $tpl !== false ) {
      return $name ;
    }
    
    return $this->_missingView($name, 'missingView');
  }
	
  function _getLayoutFileName($name = null)
  {
    if ($name === null) {
      $name = $this->layout;
    }
		
    $tpl = $this->__read_template( $name ) ;
    
    if ( $tpl !== false ) {
      return $name ;
    }
    return $this->_missingView($file, 'missingLayout');
  }

  function __read_template( $name ) 
  {
    if ( !array_key_exists( $name, $this->template ) ) {
      $tpl = $this->_template->findByName($name) ;
      if ( !$tpl ) 
        return false ;
        
      $this->template[$name] = $tpl ;
    }
    
    return $this->template[$name] ;
  }
}
?>

テスト用のコントローラ

実際にDB上のテンプレートソースを使う為に、テスト用のコントローラを準備します。

<?php
class TesttemplatesController extends AppController {
    var $name    = 'Testtemplates';
    var $uses    = array();
    var $helpers = array('Html', 'Form');

    var $layout = 'mylayout';
    var $view    = 'Smartydb';
		
    function index()
    {
      $this->set('smarty_content', 'Testing SmartyView');
      $this->render( 'testpage') ;
    }
}
?>

これで、先ほどのテーブルに、mylayoutという名前のレイアウトとtestpageテンプレートを作れば表示出来ます。

まとめ

SmartyViewのおかげで思いのほか簡単に実現出来ました!作者のMASA-Pさんに感謝!
実際の業務で使うには、色々追加しなければならない事があるとおもいますが実験報告という事で。

CakePHP 1.2.2.8120 paginatorでの問題

ここの所CakePHP漬けです(^^。
業務への適用をもくろみ色々とテストをしていたのですが、一点問題が発覚。
paginatorでリストをソートしようとすると descになりませんでした。色々調べていたのですが、何らかの条件でソートキーが「モデル名.キー」になっている事が原因な様です。

<?php
 echo $paginator->sort( 'key','Model.key');
?>

の様にすれば動作はするのですが、キモチ悪いので色々調べていました。半ば諦めていたところ下記のサイトを発見!

http://www.happyquality.com/2009/03/26/922.htm

最新のbranchでは解決しているとの事。
かなり時間をかけて調べていたのですが、確かに一分で解決しました(;_;

CakePHP開発合宿に参加してきた。

合宿は明日まで続きますが、諸事情により(予定通り)早退しました(;_;。

今回は、CakePHP初心者という事で簡単めな機能を割り振ってもらったのですが、結局半分もこなせませんでした(;_;。
この種の開発合宿自体始めてだったのですが、かなりハードですがなんだかとても楽しくテンションあがりますねー。
作業しながら飛び交う話も濃厚(?)で、とても参考になります。
会社の業務でもCakePHPを使う事に決まった(決めた)ので、色々と役に立ちそうです。

candycaneの開発作業はまだまだ続きますので、引き続き参加していきたいと思ってます。

合宿も残り一晩ですが、id:yandodさんはじめ参加されている皆さんがんばってください〜!
自宅に戻って余力が残っていれば(^^;、リモートで参加する(かも)です。

events.php.gr.jp - CakePHP開発合宿アルファ版

# 駅までお送り頂いた森川さん本当にありがとうございました!