ようこそゲストさん

CPA-LABテクニカル

2008/02/11(月) プラグインモデルを読み込まない?Missing Database Table

プラグインのコントローラーでCakePHPの規約と異なるデータベースのテーブルを使用する場合、usesの書き方を間違えると、モデルをうまく読み込まず、Missing Database Tableのエラーが出る。モデルをうまく読み込めないから、「モデルがない」というエラーが出そうなものだけど、なぜかこうなる。
Missing Database Table
Error: Database table ・・・・ for model ・・・・ was not found.
というエラーがでる。
なので、

var $uses=array( 'モデル名' );
ではなく、
var $uses=array( 'プラグイン名.モデル名' );
と、小数点(ドット)で、プラグインの名前とモデル名をつながなくてはならない。
それはルール通りなんだろうけど、エラーメッセージがちょっと的外れなので、かなり時間を食ってしまった。

CakePHP version 1.2.0.6311 beta

1: ひでまん 2008年04月11日(金) 午後6時53分

ありがとうございます。すごい役に立ちます。

2: ぜー 2010年07月16日(金) 午前10時22分

私もすごく時間の節約になりました
ありがとうございます


名前:  非公開コメント   

  • TB-URL  http://www.cpa-lab.com/tech/075/tb/

2008/02/11(月) EmailComponentをコード改変なしで使うには

CakePHP1.2b EmailComponentをコード改変なしで使おうとする時のまとめ。UTF-8&SMTP送信なら、比較的簡単に日本語も大丈夫のよう(ただし完全ではない)。(コーディングもUTF-8の場合です。)
この情報は古いうえに、若干間違いもあります。ご注意ください。
なお
メールヘッダーの日本語については、ちゃんとCakePHPが mb_encode_mimeheader と同じ変換をしてくれる*1から、素直に日本語が通るようになっている*2。問題が出やすいのは、本文のほう(1行が70バイトを超えた時)。


UTF-8JIS(ISO-2022-JP)
引数渡し本文の1行字数制限    あり(70バイト*3)
Viewの文字コードUTF-8JIS
Content-Transfer-Encoding7bitになってしまうが、メーラーでは読めるよう7bitでOK
htmlメールOKOK
長い日本語subject大丈夫渡す前にJISにエンコードしておけばOK
Shift-JISは試してないけど、JISと同じでしょう。

UTF-8で送る場合

設定
$conponents=array('Email');以外は、になし。

本文
$this->Email->send($message=null,'viewName','LayoutName');
とし、第1引数のmessageは、すべてviewで処理してしまう。
こうすれば、引数渡し制限の70バイト/行にひっかかることはない。
(NULLのところに本文を渡してもいいけど、70バイト制限で分割されてviewに渡されることとなる。
viewでは、変数$contentに、messageを処理した内容がわたされている。)

subuject(メールのタイトル)
そのままUTF-8で、$this->Email->subject に渡してやれば、CakePHPが、Email::__encode関数にて、mb_encode_mimeheaderと同じ変換をしてくれるので大丈夫。長いタイトルも適切に分割される。
From,Reptyto,Bccヘッダの日本語
$this->Email->from='日本語での宛先'.'<example@example.com>'
とやって渡せば、CakePHPがUTF-8で、エンコードしてくれる。
Toヘッダの日本語
デフォルトのmail関数を使う方法の場合は、日本語は通らない。
SMTP経由の送信であれば、Fromと同じ形式で通る。
UTF-8の場合の欠点
Content-Transfer-Encoding|7bitとなり、若干気持ち悪い。たいていのPCメーラーでは大丈夫のよう。
au携帯ではutf-8は適切に表示できない。(Docomo,softbankは大丈夫のよう。携帯メールの文字コード

文字化け
PHPのmail関数にそのままUTF-8のマルチバイトコードを渡すことになるので、文字化けがでることがある。messageの最初に空行を入れておくとうまくいく場合があるが、危なっかしい。
SMTP送信「EmailComponentの使い方。mail関数を使わず、smtpで送る。CakePHPメール」であれば、うまくいくことがあるが、これもsendmailに直接utf-8を渡すことになるの。
なお、CakePHP1.2b時点では、本文のbase64エンコードはサポートしていないよう。
絶対に文字化けさせたくない
という方は、こちらをご参照。
EmailComponentで簡単日本語メール。CakePHPメールCakePHP1.2b

利点
文字コードを気にせず、一番簡単にメールを送ることができる。

JIS(ISO-2022-JP)の場合

設定
$this->Email->charset='ISO-2022-JP';
本文
UTF-8と同じだけれど、引数として渡す前にmb_convert_encodingにて ISO-2022-JP への変換が必要。
view,layoutもすべてjisにするか、PHPスクリプトにてISO-2022-JPに変換して出してやらないといけないので、若干面倒&ちょっとしたミスですぐに文字化けのもと。

subuject(メールのタイトル)
$this->Email->subjectに設定する前に、mb_convert_encodingでJISへの変換が必要。
$this->Email->subject=mb_convert_encoding('日本語での件名タイトル',"ISO-2022-JP");
From,Reptyto,Bccヘッダの日本語
$this->Email->from=mb_convert_encoding('日本語での宛先',"ISO-2022-JP").'<example@example.com>
'*2
Toヘッダの日本語
UTF-8と同じ事情。SMTPの場合は、Fromと同様に、JIS変換すれば通る。
ISO-2022-JPの場合の欠点
文字コードに気を遣うコーディングが必要。特にview,layoutもJISで書かなくてはならないのがちょっと。。。
softbank携帯はうまく表示できないそう。
ソフトバンクもiso-2022-jpOKだそうですが、ちゃんとしたメールヘッダーでないものはプロバイダとして受信拒否する、と書いてあるので、若干心配です。
(Sofbankメール注意点  FAQ)

利点
ほとんどの日本語メールは、ISO-2022-JPである。
CakePHPがISO-2022-JPを正しく処理して送れば、クライアント側で文字化けすることはまずない。(機種依存文字除く)

もっと楽にメールを送りたい
という方は、こちらをご参照。
EmailComponentで簡単日本語メール。CakePHPメールCakePHP1.2b

共通

MIME-Version: 1.0
のヘッダーがつかないようで、若干気になる。

*1 : EmailConponent::__encode

*2 : 当該日本語のcharsetと$this-Email->charsetは揃えておくことが重要

*3 : $this->_lineLengthにて変更可能


名前:  非公開コメント   

  • TB-URL  http://www.cpa-lab.com/tech/068/tb/