Cakephp セッションが切れる理由

Written by aoki on 2010 年 6 月 21 日 – 9:22 AM -

突然、画面がホワイトアウト、configでdebugのレベルを上げても、何も出てこない。
手がかりなし。。。。。
そんな時の原因は、コンポーネント関連を疑うべし!

  • Security コンポーネント ==> $this->Security->validatePost = false を設定してみる
  • SslRequirement コンポーネント ==> var $ssl_required_actionsへの追加漏れを疑う

PHPカテゴリー | コメントはまだありません »

CakePHP SslRequirement の罠

Written by aoki on 2010 年 1 月 24 日 – 10:38 AM -

CakePHPのコンポーネントに SslRequirement がある。

SSLアクセスをコントロールするには便利なコンポーネントだ。

だが、しばしばエラーを見えにくくする場合がある。

Ajax で呼ぶときは、必ず対象のアクションを

PHP:
  1. var $ssl_allowed_actions = array('対象のアクション名')

としてコントローラの冒頭で指定しておく必要があります。

そうしないと以下のようなエラーにぶつかります。

Error: Http:Controller could not be found.」

。。。これを見つけるのに半日、、、疲れるな~。


Tags:
PHPカテゴリー | コメントはまだありません »

SoftDeletable Behavior 注意点・改造点

Written by aoki on 2009 年 12 月 13 日 – 11:37 PM -

とても便利なBehavior だが、PostgreSQL環境での注意点

deleted のデータ型は bool ではなく int型 にして defalut=0 としておく。

また、SoftDeletable Behavior 279行目は以下の通りに修正した。

PHP:
  1. //$queryData['conditions'][$Model->alias . '.' . $this->__settings[$Model->alias]['field']] = '!= 1';
  2. $queryData['conditions'][$Model->alias . '.' . $this->__settings[$Model->alias]['field']] = '0';

元のままだと、配列で設定する方法となり、finadAll では Model.deleted= '!= 1' となってしまう。
変更後は  Model.deleted= 0 で挙動します。


Tags:
PHPカテゴリー | コメントはまだありません »

モデルのフィールド情報ファイルを作成

Written by aoki on 2009 年 12 月 12 日 – 9:50 PM -

モデルのフィールド情報ファイルを作成する。(PostgreSQLのみ対応。)

コマンド ( 使う前に cake に path を通しておく)
cake -app /var/www/html/cake_1.2.5/app/ make_table_info

出力先 table_infos ディレクトリを作成 書き込み権限を付与
/var/www/html/cake_1.2.5/app/tmp/table_infos/

モデル名.txt で出力される。

PHP:
  1. class MakeTableInfoShell extends Shell
  2. {
  3.     var $uses = array("Tbl0300Request","Tbl0100Corporation");
  4.     var $controller = true;
  5.  
  6.     function main()
  7.     {
  8.         foreach ($this->uses as $model) {
  9.  
  10.             //$model = $this->modelClass;
  11.             $sql = sprintf("select
  12.                            attr.attname     as column_name
  13.                            ,attr.attnotnull  as not_null
  14.                            ,des2.description as column_comment
  15.                         from
  16.                           pg_catalog.pg_class a inner join pg_catalog.pg_namespace   ns   on a.relnamespace = ns.oid
  17.                                                 left  join pg_catalog.pg_description des  on a.oid          = des.objoid
  18.                                                                                          and des.objsubid   = 0
  19.                                                 inner join pg_catalog.pg_attribute   attr on a.oid          = attr.attrelid
  20.                                                                                          and attr.attnum> 0
  21.                                                 left  join pg_catalog.pg_description des2 on a.oid          = des2.objoid
  22.                                                                                          and attr.attnum    = des2.objsubid
  23.                         where
  24.                             a.relkind IN ('r', 'v')
  25.                         and ns.nspname IN ('public')
  26.                         and a.relname='%s'
  27.                         order by
  28.                             ns.oid
  29.                            ,a.oid
  30.                            ,attr.attnum"
  31.             ,$this->$model->useTable
  32.             );
  33.  
  34.             $result = $this->$model->query( $sql );
  35.             array_walk($result,array($this,'convert_encoding'));
  36.  
  37.             $fp = fopen("tmp/table_infos/$model.txt", 'w');
  38.  
  39.             fwrite($fp, 'function _set_table_info_idxs(){
  40.             ');
  41.             fwrite($fp, '$i=0;
  42.             ');
  43.             $i=0;
  44.             foreach ($result as $value) {
  45.  
  46.                 if ($i) {
  47.                     fwrite($fp, '$i++;
  48.                 ');
  49.                 }
  50.                 fwrite($fp, '$model[ $i ] = "' . $model .'";
  51.                 ');
  52.                 fwrite($fp, '$filed[ $i ] = $s_filed[ $i ] = "' . $value[0]["column_name"] .'";
  53.                 ');
  54.                 if (trim($value[0]["column_comment"])=="") {
  55.                     $value[0]["column_comment"]= strtoupper($value[0]["column_name"]);
  56.                 }
  57.                 fwrite($fp, '$label[ $i ] = "' . $value[0]["column_comment"]  .'";
  58.                 ');
  59.                 fwrite($fp, '$show_index[ $i ] = false;
  60.                 ');
  61.                 fwrite($fp, '$width[ $i ] = 55;
  62.                 ');
  63.                 if ($value[0]["not_null"]) {
  64.                     fwrite($fp, '$hissu[ $i ] = true;
  65.                 ');
  66.                 } else {
  67.                     fwrite($fp, '$hissu[ $i ] = false;
  68.                 ');
  69.                 }
  70.                 fwrite($fp, "
  71.                 ");
  72.  
  73.                 $i++;
  74.             }
  75.  
  76.             fwrite($fp, '$this->table_info_idxs  = $this->_set_help_table_info_idxs( $model, $filed , $s_filed , $label, @$link , @$show_index ,@$width);
  77.             ');
  78.             fwrite($fp, '}
  79.        
  80.             ');
  81.            
  82.             fclose($fp);
  83.         }
  84.     }
  85.  
  86.  
  87.     function convert_encoding(&$item, $key){
  88.  
  89.         $encoding=array("to"=>"UTF-8","from"=>"EUC-JP");
  90.  
  91.         if (is_array($item)){
  92.             array_walk($item, array($this,'convert_encoding'), $encoding);
  93.         } else {
  94.             $item = mb_convert_encoding($item, $encoding['to'], $encoding['from']);
  95.         }
  96.     }
  97.  
  98. }


Tags:
PHPカテゴリー | コメントはまだありません »

CakeMatsuriTokyo2009 まとめ

Written by aoki on 2009 年 11 月 1 日 – 2:08 PM -

やはりためになりました、備忘録メモを残します。
Think outside the box.
を実感した一日でした。感謝。

■andoさん

※CakePHP 道とは
Give back much as you take.(貰った分は返す)
Be polite. (礼儀正しく)
Think outside the box. (自分の枠にとらわれない)

※Set::combine
ペアの配列を簡単に作成できる。

$results = $this->Mail->find('all');
$mails = Set::Combine($results, '{n}.Mail.id', '{n}.Mail.subject');

■和田氏
※高速化
ClearSilver テンプレート
Lsyncd 連携 rsyncd でディレクトリ監視→ファイル更新
memcached の利用
http://blog.livedoor.jp/kistame228/archives/51219113.html

■飯塚氏
ext.js エクセルコンポーネント
dropbox バックアップバージョン管理
請負契約→準委託契約 安定した収入

■Slywalerさん
※プラグイン
debug_kit
account manageer plugin
テーマ機能
jquery.css

■Akiyanさん

Containable behavior
http://www.studiocanaria.com/articles/cakephp_containable_behavior

当日の資料

■その他
cakeplus i18nプラグイン
model_info プラグイン
github

他にもいっぱいあったのですが、メモしきれず。。。。
少しでも身につけたいものです。
講演者の皆様、スタッフの皆様、本当にありがとう。


Tags:
IT一般, PHP, セミナーなどカテゴリー | コメントはまだありません »

App::import() 読み込みエラー

Written by aoki on 2009 年 6 月 10 日 – 10:11 AM -

CakePHP1.2 App::import() にて読み込みエラーが発生。

※原因は第二引数はユニークな名前でなければならない。

App::import( 'Vendor', 'fpdf', array('file'=>'fpdf/confirmation.php'));
App::import( 'Vendor', 'fpdf', array('file'=>'fpdf/invoice.php'));

とすると最初に読みこんだものしかインポートできない。

App::import( 'Vendor', 'fpdf_confirmation', array('file'=>'fpdf/confirmation.php'));
App::import( 'Vendor', 'fpdf_invoice', array('file'=>'fpdf/invoice.php'));

とすれば OK です。
気が付けば当たり前なのですが、違う関数で指定しいると名前がダブっても気が付けなかったのでした。


Tags:
PHPカテゴリー | コメントはまだありません »

第4回CakePHP勉強会@Tokyo

Written by aoki on 2009 年 5 月 23 日 – 9:07 AM -

090522_2006011久しぶりに「CakePHP勉強会」に参加しました。

特に印象に残ったのは、ビヘイビアの紹介と使い方です。
裏方に徹したものですが、使いこなすと、かなりクールになりそうだ。

Soft Deletable Behaviorは直ぐにでも導入していようと思います。

プラグイン三段活用は大爆笑のLTでしたが、かなり重要な所をついていました。
整理整頓、作業しながらライブラリが出来ていく。。。これって理想なんですよね。

miauさんのプレゼンツール“動く”マインドマップFrieve Editorは、とても面白かったです。
phpUnderControl も勉強してみたいと思います。

やはり、色々な話を聞くと刺激を受けます。
発表者の皆様、準備をしていただいた方々、本当にありがとうございました。
おまんじゅうも驚きました。


Tags:
IT一般, PHP, セミナーなどカテゴリー | コメントはまだありません »

CakePHP1.2 joinTableの命名長さ制限

Written by aoki on 2009 年 3 月 17 日 – 10:21 PM -

CakePHP1.2になり、関連テーブル(HABTMなど)の保存が簡単になった。
$this->data にしっかりとデータセットすれば 
$this->Model->save(); とすれば、
すべての関連データを関係するテーブルに自動的に保存してくれます。  

ところが、、、、うまく行かない。。。のです。
原因は、joinTableの識別子名が長くなりすぎたことでした。

使用しているデータベースは PostgrSQL8.1ですが、
識別子の長さが63ビットまでとなっていました。

元のテーブル(HABTM)
tbl0010members
tbl0020business_categories
命名規則に沿ったjoinTableは
tbl0010members_tbl0020business_categories

この時点では文字数制限に触れてなさそうなのですが、
CakePHP1.2で自動生成されるSelect文を良く見ると、
以下の様なエイリアス名を自動生成していました。

SQL:
  1. "Tbl0010membersTbl0020businessCategory"."tbl0020business_category_id" AS
  2. "Tbl0010membersTbl0020businessCategory__tbl0020business_category_id"

エイリアス名は66文字になっており、
このSQL文を走らせるとエラーになります。

PostgreSQLの設定値 NAMEDATALEN を変更し、
コンパイルしなおせばこの制限値を変更できるのですが、
yumでインストール管理しているので避けたい。

ということで、joinTableそのものは、命名規則に沿わせておいて、
更新可能な view を用意して、代理させました。
(ちなみに1.1では命名規則どおりで動くきます。)

更新可能なviewの名前を
members_business_categories
とすると、追加のSQL文は以下の通り。

SQL:
  1. DROP VIEW members_business_categories;
  2.  
  3. CREATE VIEW
  4. members_business_categories
  5. AS
  6. SELECT * FROM tbl0010members_tbl0020business_categories;
  7.  
  8. CREATE RULE members_business_categories_ins
  9. AS ON INSERT TO members_business_categories
  10. DO INSTEAD
  11. INSERT INTO tbl0010members_tbl0020business_categories
  12. VALUES ( new.tbl0010member_id,new.tbl0020business_category_id);
  13.  
  14. CREATE RULE members_business_categories_del
  15. AS ON DELETE TO members_business_categories
  16. DO INSTEAD
  17. DELETE FROM tbl0010members_tbl0020business_categories
  18. WHERE tbl0010member_id=old.tbl0010member_id AND
  19. tbl0020business_category_id=old.tbl0020business_category_id;

モデルのアソシエーション定義で、
上記のviewをjoinTableとwithに設定

PHP:
  1. var $hasAndBelongsToMany = array(
  2. 'Tbl0020businessCategory'=>array(
  3. 'joinTable'=>'members_business_categories',
  4. "with"=>"MembersBusinessCategory"),
  5. );

これで、かなりの文字数を稼げました。

テーブル番号を振るローカル命名規則が仇になった。。。
というこでしょうね(ーー;)


Tags:
IT一般, PHPカテゴリー | コメントはまだありません »

CakePHPカンファレンス東京

Written by aoki on 2009 年 1 月 27 日 – 10:04 PM -

昨年の10月にCakePHPカンファレンス東京に参加した。
実は申込みが間に合わず、あきらめかけていたが、
ライトニングトークというプログラムがあり、5分間しゃべる人の募集枠が残っていた。

5分なら何とかなるかも?と甘い考えで申込みをしたところ、OKが出て参加できることになった。(*^_^*)
スカイツアーズさんのオンライン予約について2日間もかけてまとめることになってしまったが。。。

正式な発表者の方々は若いのにスゴイ人たちで驚いてしまう。(日本はまだ大丈夫!)
鶴岡さんという方などは、突然起きたバグを vi でシャカシャカ直してしまうという天才だ!
ステージでバグに直面するなんて考えても見たくない。天才+強心臓。

さて私の発表は、以下の5点。
1.CakePHPを愛していること。
2.日本語のテーブル名とフィールド名で稼動中のMS SQLサーバーとも連携できたこと
3.Ajaxによるハートビートについて
4.JTB予約サイトとスカイツアーズ予約サイトの比較
5.CakePHP1.2に変更したいが、どうやってお金を頂くか??

イベントページに当日のビデオやアンケート結果が発表されていますので
お時間のある方はご覧になっていただければと思います。

イベントページ:http://conference.cakephp.jp/
ビデオ:http://www.ustream.tv/recorded/811787
アンケート:http://conference.cakephp.jp/CakePHP_Conference_Tokyo_20081129.pdf

実は、カンファレンスの最後で、カンファレンスについてのブログを書くように薦められて、このブログサイトを立ち上げました。

しかし機を逃してしまいカンファレンスの記事を書けずにいたのですが、IT Pro に掲載された(2009/01/27)ので、便乗して書きました。
http://itpro.nikkeibp.co.jp/article/COLUMN/20090122/323305/?ST=oss&P=1


Tags: ,
IT一般, PHP, セミナーなどカテゴリー | 2 件のコメント »

ラオラオベイ ゴルフ&リゾート

Written by aoki on 2009 年 1 月 16 日 – 7:56 AM -

 

ラオラオベイ ゴルフ&リゾート 新サイト

ラオラオベイ ゴルフ&リゾート 新サイト

サイパンの海越えコースを持つゴルフ場。

 

このサイトは東京案内所のオリジナルですが、ゴルフのみ、ゴルフ+ホテルのセット、そして日本からのゴルフツアーがオンラインで予約できます。

WordPressによるページ作成とブログ機能での最新情報の更新を可能にしました。

予約部分はCakePHP1.2にて製作しています。

URL : http://www.laolaobay.jp
ゴルフ予約 : https://www.milxtravel.jp/cp/golfs


Tags: , ,
PHP, カテゴリー | コメントはまだありません »