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カテゴリー | コメントはまだありません »

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カテゴリー | コメントはまだありません »