5丁目通信(仮称)

とある5丁目で活動する還暦を過ぎたWebプログラマーの覚え書きです。それとかかってくる迷惑電話や、家業のアパート経営について。

タグ: CakePHP

  • CakePHP でのMongoDB でTRUNCATE TABLEの話し

    CakePHPでMongoDBをつなげてテストデータの投入のシェルとかを書いています。

    データの投入の前にMongoDBのコレクション(RDBならテーブルかな)の全データクリアをしたいのですが、今まではこのようにTRUNCATEをSQLで呼び出していました。

    $this->Model->execute('TRUNCATE TABLE table);

    これはMongoDBでは動きません。MongodbSource.phpにはtruncate()というメソッドがりますが、どう呼び出したら動くかわからず、以下のようにしました。

    $this->Model->query(array('$eval' => 'db.collection.drop();'));

    $evalってなあに? といった状況です。もっといい方法があるかも。

    著:山田祥寛
    ¥3,366 (2025/03/27 13:40時点 | Amazon調べ)
    著:松浦 健一郎, 著:司 ゆき
    ¥2,574 (2025/03/27 13:40時点 | Amazon調べ)
    著:谷藤賢一, 著:徳丸浩
    ¥2,750 (2025/03/30 15:22時点 | Amazon調べ)
  • CakePHP2のテストで、$defaultのDBを見に行ってしまう件、解決した話し

    CakePHP2のテストで、$defaultのDBを見に行ってしまう。と書きましたが、解決しました。

    /App/Model/AppModel.php で__construct()を定義したとき、正しく引数を受け取って親クラスに渡してあげないといけなかったようです。

    public function __construct($id = false, $table = null, $ds = null) {
        parent:__construct($id, $table, $ds);
        // 何かの処理
       }

    のように引数を明示的に書いてあげます。

    テストケースのsetup()にあるモデルを設定しているClassRegistry::init()が中で$useDbConfigをtestでモデルオブジェクトをインスタンスにしているところがあって、そのときのパラメータがクラスに引き渡されていないのが原因でした。

    著:山田祥寛
    ¥3,366 (2025/03/27 13:40時点 | Amazon調べ)
    著:松浦 健一郎, 著:司 ゆき
    ¥2,574 (2025/03/27 13:40時点 | Amazon調べ)
    著:谷藤賢一, 著:徳丸浩
    ¥2,750 (2025/03/30 15:22時点 | Amazon調べ)
  • CakePHP2のテストで、$defaultのDBを見に行ってしまう話し

    CakePHP2でテストするときに、/app/Config/database.phpの$testではなくて$defaultで指定したDBを見に行ってしまいます。こちらの対処方法のメモ。

    テーブルにtext型の項目があると、memoryではなくてMyISAMでテストのテーブルを自動的に作りに行きます。この辺りが関係しているかもしれません。こちらはbakeすると、Fixtureの$fieldsの中にtableParametersに設定されています。

    テストの途中でexit()して上げると、$testのほうのDBにテストのためのテーブルをFixtureからcreate tableしてくれていることを確認できます。しかし、テストケースでは、$defaultのほうのDBを見に行きます。

    CakePHP2のCookbookに書いているように、Fixtureに

    public $useDbConfig = 'test';

    と書いてもダメでした。

    public $import = array('table' => 'articles', 'connection' => 'test');

    のようにしてもダメ。

    結局は、

    class ArticleTestCase extends CakeTestCase {
        public $fixtures = array('app.Article');
        public function setUp() {
            parent::setUp();
            $this->Article = ClassRegistry::init('Article');
            $this->Article->useDbConfig = 'test';
        }

    のように無理矢理モデルの$userDbConfigにtestをして対応しました。

    もっと良い方法があるのでしょうね。これだと、joinされたFixtureのテーブルデータだと見つからないのてテストできないとか問題が残ります。

    マニュアルに書いていないことは何とか対応しなければいけないのは大変です。

    著:山田祥寛
    ¥3,366 (2025/03/27 13:40時点 | Amazon調べ)
    著:松浦 健一郎, 著:司 ゆき
    ¥2,574 (2025/03/27 13:40時点 | Amazon調べ)
    著:谷藤賢一, 著:徳丸浩
    ¥2,750 (2025/03/30 15:22時点 | Amazon調べ)

    続きはこちらから

  • 無事にサービスイン。

    今まで他社で開発していたサイトを引き継いで、リニューアルしてサービスイン。

    今回はデータベースだけを残して、プログラム類はすべて書き直し。だって、PHPを使っていても、クラスって何かしら、SQLインジェクションなんて関係ないぜ、PHPってHTMLに埋め込むのよね・・・、と言った作り方。反対に大昔のPHPの解説本に載っているサンプルみたいで読みやすいこと。一気にCakePHPで書き換えた。

    切り替えは1時間で済んだ。これも予行演習をやったおかげ。マニュアルは大切。

    Google+: View post on Google+

  • CakePHP2で管理者用ページだけの認証を行う話し

    ユーザー認証と管理者認証を別のモデルで分けたいときのメモ。

    管理者用の認証をAppController.phpで定義してしまう。isAdmin()はadmin_***のアクションを呼んだかどうかの判定。

    app/Controller/AppController.php

    class AppController extends Controller {
      public $components = array('Auth');
    
      public function beforeFilter() {
        if ($this->isAdmin()) {
          $this->Auth->authenticate = array(
          'Form' => array(
            'userModel' => 'User', //ユーザー情報のモデル
            ),
          );
    
          $this->Auth->loginAction = '/admin/users/login'; //ログインを行なうaction
          $this->Auth->loginRedirect = '/admin/'; //ログイン後のページ
          $this->Auth->logoutRedirect = '/admin/'; //ログアウト後のページ
          $this->Auth->authError = 'ログインしてください。';
    
        } else {
          $this->Auth->allow('*');
        }
      }
    }

    大分はっしょっているけど。こんな感じ。

    あとは、ユーザー認証したいコントローラーでAuthコンポーネントを定義しておく。

    著:山田祥寛
    ¥3,366 (2025/03/27 13:40時点 | Amazon調べ)
    著:松浦 健一郎, 著:司 ゆき
    ¥2,574 (2025/03/27 13:40時点 | Amazon調べ)
    著:谷藤賢一, 著:徳丸浩
    ¥2,750 (2025/03/30 15:22時点 | Amazon調べ)
  • CakePHPでテーブルに保存できないときの覚え書きの話し

    自分への覚え書きです。

    CakePHPでテーブルに保存できないときのチェックポイント。

    バリデートが通っていないかチェックしろ。

    まじめにモデルにバリデートの設定をしていたらはまりました。Model::sate()の2番目の引数は、バリデートをするかの引数です。falseにすればバリデートを無視します。CakePHPのモデルのソースを読んでいたら見つけました。

    ソースでは以下のような感じ。

    $this->Model->id = $id;
    
    $Model['Model']['flg'] = '9';
    $Model['Model']['mail'] = 'xxxxxxx_' . $user_mail;
    $Model['Model']['url'] = 'xxxxxxx_' . $user_url;
    
    // mailとurlはモデルのバリデートにしたがっていないので、バリデーションはOFFにする。
    if ($this->Model->save($Model, false)) {
    
    }
    著:山田祥寛
    ¥3,366 (2025/03/27 13:40時点 | Amazon調べ)
    著:松浦 健一郎, 著:司 ゆき
    ¥2,574 (2025/03/27 13:40時点 | Amazon調べ)
    著:谷藤賢一, 著:徳丸浩
    ¥2,750 (2025/03/30 15:22時点 | Amazon調べ)
  • CakePHPのビューを変数に格納する話し

    メールの本文をビューを使って生成したときがあります。PHPのストリングで結合してなんてやりたくありません。後で修正が面倒。

    CakePHPの1.3のときは、

    $this->output_layout = 'mail';
    
    // バッファリング開始
    ob_start();
    
    // Viewアクションでレンダリングする。
    $this->render('mail_view');
    
    // レンダリングした結果を取得する。
    $html = ob_get_clean();

    なんてob_start()とrender()でやっていたけど、CakePHPが2になってからrender()がレンダリング結果を返さなくなったようだ。

    そこで、viewのソースファイルを読んで、次のように対応した。

    // Viewアクションでレンダリングする。
    $response = $this->render('mail_view', 'email');
    
    // レンダリングした結果を取得する。
    $html = $response->__toString();

    なんだか__toString()とか内部のメソッドを呼んでいるが、もっとよい方法があるのだろうか?

    著:山田祥寛
    ¥3,366 (2025/03/27 13:40時点 | Amazon調べ)
    著:松浦 健一郎, 著:司 ゆき
    ¥2,574 (2025/03/27 13:40時点 | Amazon調べ)
    著:谷藤賢一, 著:徳丸浩
    ¥2,750 (2025/03/30 15:22時点 | Amazon調べ)
  • MongoDBをCakePHP2で使う話し

    MongoDBのようなNonSQLに向いたサイトを作成を検討中。現在CakePHPは2に移行しつつあるので、CakePHP2からMongoDBに接続できるかのテストから始める。結果は、笑ってしまうくらい簡単に接続できた。MongoDBに対応したCakePHPのデータソース(仮にCake Mongoと呼んでおく)の開発者に感謝する。

    CakePHPとMongoDBがインストールされたものとする。

    PHPとMongoDBと接続するドライバーが必要である。WindowsのXAMPP上のテストなので、PeclからのインストールではなくMonboDBのサイトからWindows用のドライバのバイナリファイルを持ってくる。Apacheのバージョンに合わせてダウンロードする。php.iniの設定をして、phpinfo()で確認する。

    https://www.php.net/manual/ja/mongo.installation.php#mongo.installation.windows

    以上は、検索すると出てくるので、詳細は各ページを参照する。

    以下は、Cake Mongo開発者のプレゼン資料からの抜粋である。

    データソースをGitから取得する。WindowsなのでGit Bashを使う。以下のコマンドを実行する。

    > cd app/Plugin
    > git clone git://github.com/ichikaway/cakephp-mongodb.git Mongodb
    > cd Mongodb
    > git checkout -b cake2.0 origin/cake2.0

    これで、CakePHP2用の CakeMongoがダウンロードできる。

    CakePHPのファイルの修正は以下の通り。まずはデータベースの接続の設定

    /app/Config/database.php

    class DATABASE_CONFIG {
      public $default= array(
        'datasource'=>'Mongodb.MongodbSource',
        'host' => 'localhost',
        'database'=> 'blog',
        'port'=>27017,
      )
    }

    次に/app/Config/bootstrap.phpでCakeMongoのプラグインを読み込ませる。

    CakePlugin::load('Mongodb');

    後は、CakeMongoに付いてくるサンプルを動かしてみる。

    データベースの設定をしなくていいので、簡単に動くことが確認できた。あっさり動くことに、逆に驚き。

  • jQuery Mobileに対応したら文字が小さくなったときの対応をした話し

    jQuery Mobile

    テスト的にCakePHPで作成しているサイトをスマートフォン対応にしてみました。簡単にjQuery Mobileで作成してみました。CakePHPではコントローラーでPCかスマートフォンかで判定して、ビューのレイアウトやアクションを切り替えてしまいます。この辺りはいずれ書きますので、プログラムに興味がある人は連絡ください。ソースを見せます。とても簡単ですが。

    さて、下の方でリンクしているjQuery Mobileの解説本で試ししてみると、どういう訳か実機のAndroid端末で試すと文字が小さくなります。画面の大きさによって文字の大きさを自動的に変えてくれるようです。文字サイズを固定に指定しても無視されます。

    jQuery Mobileの1.0のアルファ版(1.0.a2)を使ってみると、期待通りの文字サイズになります。ベータ版(1.0b1)だと文字サイズが小さくなります。もちろん、正式版(1.0)は小さいままです。

    正式版になったときバグでも入り込んだ訳もないしと、いろいろ調べてみたら、<head>タグに

    <meta name="viewport" content="width=device-width,initial-scale=1">

    がなかったのが原因でした。解説本をそのままコピーしたのが悪かったようです。その解説本にもコラムに小さく書いてありました。

    jQuery Mobileのように新しく開発のスピードが速いものは、紙の解説本よりも最新の情報を見ていく必要がありそうです。

    著:山田祥寛
    ¥3,366 (2025/03/27 13:40時点 | Amazon調べ)
    著:松浦 健一郎, 著:司 ゆき
    ¥2,574 (2025/03/27 13:40時点 | Amazon調べ)
    著:谷藤賢一, 著:徳丸浩
    ¥2,750 (2025/03/30 15:22時点 | Amazon調べ)
  • CakePHP2での開発が一段落した話し

    試しにCakePHP2で開発してきましたが、とりあえず一段落しました。

    いろいろな命名が1.3から変わっていますので注意が必要です。HTMLヘルパーは必ず$this->Htmlにしなければいけないとか、Appの下のディレクトリが頭が大文字になっているとか、細かい変更がありますが、だんだんと慣れていくことでしょう。

    一番変わったのは、Authコンポーネントです。こちらは参考となるサイトはありませんでした。やはりCakePHPの本家サイトのCookBookが一番まとまっています。というよりも、ここしか参考となる資料は今のところありません。ここで何回も言いましたが、CakePHP2の情報を知りたければ、絶対にCookBookを読む必要があります。

    こいうことで、今年の営業はこれでおしまいにしていいかしら。

    著:山田祥寛
    ¥3,366 (2025/03/27 13:40時点 | Amazon調べ)
    著:松浦 健一郎, 著:司 ゆき
    ¥2,574 (2025/03/27 13:40時点 | Amazon調べ)
    著:谷藤賢一, 著:徳丸浩
    ¥2,750 (2025/03/30 15:22時点 | Amazon調べ)