Home Top About Help Login Search Next

CakePHPで「データベーステーブルがありません」にはまる

2010/02/07 12:44
naoto5959

このところCakePHPに翻弄され続けているのではまったことをメモっておくことにします。

今日は、「データベーステーブルがありません」について

例えば、password再設定用のコントローラーを作っていて、コントローラーからMemberモデルを使うよ。という場合。

class PasswordController extends AppController {
    var $name = 'Password';
    var $uses = array('Member');
}

こんな風にして、CakePHPの命名規則に沿わないコントローラーとモデルの組み合わせが指定できます。

なのに、/passwordにアクセスすると、「データベーステーブルがありません」が表示されて、「えっ」という状況。

なんでだろうと思っていたら、Memberモデルはどこでも使う設計にしてたのでAppControllerに

class AppController extends Controller {
    var $uses = array('Member');
}

なんて、書いてたんですね。

こうしておくと$usesの値をControllerでごにょごにょしてマージしたりする(Controllerの__mergeVarsメソッド)ときに、PasswordControllerとAppControllerの$usesが同じ、かつ空じゃない場合は、CakePHPの命名規則でモデルをロードしてしまいます。(Cake1.2.5のcake/libs/controller/Controller.php L:379)

すると、PasswordControllerには

class PasswordController extends AppController {
    var $name = 'Password';
    var $uses = array('Password', 'Member');
}

と書いたのと同じになってしまうのです。

よって、AppControllerの$uses以外使わないようにするには

class PasswordController extends AppController {
    var $name = 'Password';
    var $uses = array(); // falseだとAppControllerの$uses無視しちゃうよ
}

とする必要があります。

こういうのって、ついウッカリ忘れそうなのでメモしておきます。


環境によってdatabaseのconfigを切り替える

2010/01/13 19:04
naoto5959

開発環境と本番環境でデータベースの設定を変えたいことが多々あります。

  • 開発: dev.exapmle.com
  • 本番: release.example.com

とドメインを分けていると仮定します。私は、

app/config/database.php

に以下のような記述をしています。

<?php
class DATABASE_CONFIG {
    var $default;
    var $test;
    
    function __construct() {
        switch ($_SERVER['SERVER_NAME']) {
            case 'dev.example.com':
                $this->default = array(
                    'driver' => 'mysql',
                    'persistent' => false,
                    'host' => '127.0.0.1',
                    'port' => 3306,
                    'login' => 'hoge',
                    'password' => '',
                    'database' => 'hoge',
                    'prefix' => 'hoge_',
                    'encoding' => 'utf8'
                );
                break;
            case 'release.example.com':
                $this->default = array(
                    'driver' => 'mysql',
                    'persistent' => false,
                    'host' => '127.0.0.1',
                    'port' => 3306,
                    'login' => 'root',
                    'password' => '',
                    'database' => 'hoge',
                    'prefix' => 'hoge_',
                    'encoding' => 'utf8'
                );
                $this->test = array(
                    'driver' => 'mysql',
                    'persistent' => false,
                    'host' => '127.0.0.1',
                    'port' => 3306,
                    'login' => 'root',
                    'password' => '',
                    'database' => 'hoge',
                    'prefix' => 'hoge_test_',
                    'encoding' => 'utf8'
                );
                break;
        }
    }
}

他には、複数の設定を定義しておいてAppModelで振り分けるとかも良いかも知れませんね。個人的には

app/config/database.php

だけを確認すれば良い実装の方が好きですけど。


Office 2007を買う

2009/12/14 22:12
naoto5959

最近、個人事業主になったことで、お客さんからは当たり前かのように送られてくるExcelやWord、PowerPointを開くだけでなく資料を作成する必要も出来てきました。

今まではNeo OfficeやOfficeを使うために昔買ったPCを立ち上げたり、頑張ってきたのですが、そろそろ本物のOfficeを買おうと思います。

  • Word
  • Excel
  • Power Point

が必須なので、Office 2007 Standardを狙います。(DSP版のOffices 2007 Personal with Power PointはMacBook Proに増設する安いパーツがないので普通のstandardを狙います。)

なお、価格.comの価格は2009年12月14日時点での価格です。

Microsoft Office 2008 for Mac Business Edition アップグレード

まず学生の頃にかった懐かしのOffice Mac v. Xからアップグレード出来ればいいのに、とか思っていたのですが、Windows版にはアップグレードは無理そうです。

もちろんmac版のOfficeであれば、アップグレード対象っぽいです。

Microsoft Office 2008 for Mac

ただ、アカデミック版からのアップグレードはどうなんですかね。まぁいずれにせよ、mac版を買ってしまうと結局windows版とのちょっとした何かの違いによるトラブルの元になりそうで不安です。不安でたまりません。

よって、Parallels Desktop 5.0 for Mac上にインストールしてあるWindows XP用にOffice 2007を買うことにしました。

Microsoft Office 2007 アップグレード 優待パッケージ | Office Online

検索したらいきなり見つけた。優待!なんか安いっぽい!mixiの広告にもあったよこれ!

Microsoft Office 2007 アップグレード 優待パッケージ

んが、この優待版は

製品は他のアップグレード製品と対象製品が異なります。(Office 2007 単体製品からのアップグレードは対象外です。) アップグレード対象製品:パッケージ製品およびプレインストール製品に限ります。2000-2003 および、XP バージョンの Microsoft Office スイート (統合製品) もしくは、単体製品、Interconnect 2004 が対象です。

とのこと。古いOfficeを持っていないのだめなのですね。危ない。買い物カゴに入れるところだった。

では、2000-2003 および、XP バージョンの Microsoft Office スイートやら単体製品を買おうと思ったのですが、古いしそもそもあんまり売っていない。

ちなみに、この優待版は価格.comで調べるとこんな価格。安いな。15,700円〜

image:1:1260797302-kakaku_com_office_standard_yuutai.png

そしてせっかく価格.comによったので、普通のOffice Standard 2007の相場を調べる。

Office Standard 2007

こんな感じ価格です。高いなぁ。42,400円〜だってさ。

image:2:1260797602-kakaku_com_office_standard_normal.png

Office Standard 2007 アップグレード版

やっと見つけた通常のアップグレード版は、こんなもん。21,000円〜かぁ。

image:3:1260797733-kakaku_com_office_standard_upgrade.png

そんで、アップグレード対象を調べてみるわけですが、意外な事実が。

Office 2007(オフィス 2007)アップグレード対応表 | マイクロソフト ユーモール

表を見てみると

image:4:1260797892-office_upgrade_list.png

2007 Office System単体製品がアップグレード対象製品なわけです。

ということは一番安い2007 Office System単体製品を探して、それと一緒にOffice Standard 2007 アップグレード版を買うのが正解ぽいですね。

2007 Office System単体製品

下記の製品が含まれるそうです。

  • Microsoft Office Word
  • Microsoft Office Excel
  • Microsoft Office Outlook
  • Microsoft Office PowerPoint
  • Microsoft Office Publisher
  • Microsoft Office Access
  • Microsoft Office InfoPath
  • Microsoft Office OneNote
  • Microsoft Office InterConnect
  • Microsoft Office SharePoint
  • Microsoft Office FrontPage

この中でMicrosoft Office InterConnectが一番安いようです。

Microsoft Office - Wikipedia

に書いてあります。

場合によっては、新規パッケージを購入するよりも、アップグレードの対象となる安価な単体製品とアップグレード版を購入した方が安い場合も生じる。 2009年11月時点において、最新バージョンであるOffice 2007 のStandardエディションを新規に購入する場合、Office 2007 Standardエディションの新規パッケージではなく、アップグレード対象となる単体パッケージで最も安い「InterConnect」と、これを根拠とするアップグレードパッケージを購入した方が、結果的に安くOffice 2007を購入できる[8]。 2009年11月15日時点でのAmazonの価格では、InterConnect 2007とOffice 2007 Standard のアップグレード版(20周年記念優待パッケージ)の合計価格が21,452円であるのに対し、単体のOffice 2007 Standard新規パッケージは42,800円である。

ていうか、Wikipediaに最初から正解(っぽい)ことが書いてあるじゃないですか。ただ、

Office 2007 Standard のアップグレード版(20周年記念優待パッケージ)はアップグレード対象製品としてInterConnect 2007を含まないので、通常のOffice 2007 Standard のアップグレード版が必要そうですね。

Office InterConnect 2007

¥5,524 〜で売ってます。

image:5:1260799111-kakaku_com_office_interconnect.png

結論

ふむふむ。というわけで、Office InterConnect 2007(¥5,524〜)とOffice Standard 2007 アップグレード版(¥21,000)を買うことにしました。めでたしめでたし(?)


.vsdファイルを読まないといけないとき

2009/12/03 09:06
naoto5959

仕事柄、どうしても.vsdファイルを開かないといけないことがあります。

ただ、Visioなんて持ってないし、OfficeにバンドルされるようになったversionのOfficeも持ってないし、そもそもVisioなんて使ってないでOminiGraffle(macにしかないけどね:-P)使えよハゲ!というような困った方はVisio Viewerで見るといいと思います。

Visio Viewerとは

Visio 2007 Viewer では、すべてのユーザーが Visio 図面および図表 (Visio 5.0、2000、2002、2003、または 2007 で作成) を Microsoft Internet Explorer 5.0 以降の Web ブラウザで表示できます。

つまり、Visio買わなくても見れるんですね。やった!Viewerは、以下のリンクからDLします。

Visio 2007 Viewer

ただ、Visio Viewerを入れても「×」表示で見れないことがあります。

そんなときは、

Visio Viewer 2007 Service Pack 2 (SP2)

をインストールした後に、更に

Microsoft Office Visio Viewer 2007 セキュリティ更新プログラム: KB973709

をインストールすると見れるみたいです。

つまり、Visioを持っていない人は、Visio Viewer 2007というアプリケーションをインストールすると、IEというマイナーなブラウザのこれまたマイナーなAciveXという何かで表示出来るようになるみたいです。そして、このVisio Viewer 2007は、たったの3ファイルをDLしてインストールするだけ。たった1ファイルをDLしてインストールするようなアプリケーションとは一味違いますね。かっこいい!


CakePHPのEmailComponentを使い、文字コードISO-2022-JPのメールを送信する。

2009/11/22 00:16
naoto5959

メールの文字コードはISO-2022-JPにしたい。

というわけで、あれこれした結果です。CakePHPのEmailコンポーネントを使って、文字コードISO-2022-JPのメールを送る際に以下のようにすると文字化けせずに送信出来ました。

$this->Email->to = '受信先<naoto5959@example.com>';
$this->Email->bcc = array('naoto5959@example.com');
$this->Email->replayTo = '返信先<naoto5959@example.com>';
$this->Email->from = '送信元<naoto5959@example.com>';
$this->Email->subject = 'メールのタイトル';
$this->Email->charset = 'ISO-2022-JP';
$this->Email->sendAs = 'text'; // html形式にしたい場合はhtmlに
$this->Email->lineLength = 1000; // 長いURLを改行しないようにする
$this->Email->template = 'hoge'; // elements/email/text/hoge.ctp
$this->Email->set('hoge', $hoge); // viewに渡す変数

// templateを使ってレンダリングされた結果を取得する
$message = $this->Email->__wrap(null);
$message = $this->Email->__renderTemplate($message);

$this->Email->template = null;
$message = mb_convert_encoding(implode("\r\n", $message), 'JIS');
$this->Email->send($message);
$this->Email->reset();

以下、はまった点。

subjectはmb_convert_encodingすると、かえって文字化けしてしまう。

ソースを読んでみると、charsetで指定したエンコードに変換する処理があるので、自分出わざわざ変換する必要はないみたいです。

lineLengthを指定しないと長いURLが改行されてしまう。

長いURLを改行するのは、RFC2822的には78文字で改行してねなので実は正しいです。ただ、お客さん的には改行しちゃだめよ、というお話にもなりがちなので難しいところなのですけど。

というわけで、ISO-2022-JPでメール送信出来るようになりました。良かった良かった。


Next