CakeEmailでメール本文が文字化けする

とっても悩んで解決したのでメモを残しておく。

CakePHPのCakeEmailを初めて使ってみたら、送信したメールの本文が文字化けする。今までQdmailを使っていたので、そんな現象には合わなかった。

Googleさんに聞いてみると

CakeEmailを使っていて本文が文字化けたらとりあえずcharsetを疑ってみる

なんて書いてあるけど、charsetにISO-2022-JPを設定しても現象は変わらない。今度はメールヘッダがも文字化けする。

しかたないので、CakeEmailをNetBeansのデバッガで追ってみる。CakeEmailの_encodeString()メソッド辺りに見当をつけてブレークポイントを設定する。デバッグしてみると何とmb_convert_encoding()を処理する前にreturnしていた。

原因はmb_convert_encoding()関数が存在しないことだった。つまり、mbstringモジュールをインストールしていないことが、そもそもの原因である。

php.iniにmbstringモジュールを読み込んであげて、mbstringモジュールの設定を適当にしてphpinfo()でmbstringがサポートされていることを確認する。

今度は文字化けせずにメールを送れた。

WindowsのローカルPCに開発環境にPHPをインストールしたままで動かしたのが原因かもしれない。

#baserCMS で管理者ページにログインできないときの対応メモ

今のお客さんのIRサイトをリニューアルをしたいという案件で、以前テストで作成したbaserCMSのテストサイトを復活させます。テストサイトはvagrant+VirtualBoxでローカルのPCに作成しています。

久しぶりにvagrant upでサーバーを起動してきます。Vagrantで起動したらberkshelfでのmysqlのChefのクックブックの仕様が変わって動かないというトラブルがありましたが、これは自分でレシピを作って対応します。後はMySQLのバックアップを投入すれば、今まで作成したサイトにはアクセスできます。しかし、baserCMSの管理者ページにはログインできません。

ここでNetBeansのデバッガを使ってログインの処理を追っていきます。ログインが成功した後のリダイレクトの処理以降がうまくいっていないようです。管理者ページのトップにリダイレクトしようとして、どういう訳か遷移しません。

調べてみるとCakePHPのエラーログを見ろとあります。ログには

2015-08-18 11:16:43 Warning: Warning (2): Unknown: Failed to write session data
(files). Please verify that the current setting of session.save_path is correct
(/vagrant/app/tmp/sessions) in [Unknown, line 0]

なんて書かれています。セッションデータをうまく書き込まれていないようです。

Googleさんにセッションデータがなぜ書き込めないかを聞いてみると、Vagrantの同期フォルダの権限の設定が間違っているとのこと。こちらのページのsynced_folderの設定を行うとうまく行きました。オーナーとグループをapacheにすればよさそうです。

baserCMSのGitHubにVagarantFileのサンプルがありますが、こちらのsynced_folderの設定のままだと、私のところではうまくセッションの書き込みができませんでした。今までうまくいっていましたがどうしてなのだろうか?

以上、2日位悩んだ結果のメモです。まずはCakePHPで何かあったらログを読めということでしょうか。いつも基本を忘れます。

CakePHPのDebugKitプラグインでのエラー

CakePHPを2.6.3にバージョンアップしたら、コントローラーでセットした値がビューに渡っていない。色々調べてみるとDebugKitプラグインでエラーをしている。

Could not load class DebugKitLogListenerLog

このエラーメッセージから調べると、GitHubのDebugKitのissusが見つかった。

https://github.com/cakephp/debug_kit/issues/144

APP/Plugin/DebugKit/Lib/Panel/LogPanel.phpの25行目を

'engine' => 'DebugKit.DebugKitLogListener',

'engine' => 'DebugKit.DebugKitLog',

にする。これでエラーがなくなった。

MySQL Workbenchのマイグレーションで文字化け

SQLServerのデータベースをMySQLに変換しようと、MySQL Workbenchのマイグレーションの機能を使ってみた。スルスルとテーブル構造やデータを変換できた。これはすごい。

と思っていたら、日本語で格納した項目はすべて???で文字化け。ダメじゃん、と思って、いろいろ調べてみた。MySQL Workbenchに文字コードを設定できる設定はないし、さてどうしたものか。

どうせ最後にはMongoDBのコレクションに変換する予定なので、CakePHPのシェルで変換プログラムを書いている。そのプログラムからSQLServerを直接見に行けばいいじゃない、と思ってFreeTDSだのODBCだのCentOSにインストールしてやってみると接続はできた。しかし、Linux, Mac OS X, FreeBSDからはSQLServerは接続できないとCakePHPのドキュメントには書いてある。実際に/Config/databese.phpにSQLServerをデータソースとして設定しても接続できなかった。CakePHPのソースを負っていくとPDOのライブラリが見つからない云々というエラーとなる。

それでも、しつこく調べてみると、無理矢理CakePHPのSQLServerのデータソースを書き換えてSQLServerに接続する方法があって試してみたけど接続できるが文字化けという同じ結果だった。しかし、pearのDB.phpだと文字化けせずにうまく接続できる。でも、今さらDB.phpなんて使うなんてね・・・。

と、諦めているときに、とても当たり前のことに気が付いた。とても恥ずかしいこと・・・。

何とMySQLで文字コードの設定を何もしていなかった。ここのサイトに書いているように/etc/my.iniに

[mysqld]

character-set-server=utf8

[mysql]
default-character-set=utf8

[mysqldump]
default-character-set=utf8

を設定しみる。今度は、MySQL Workbenchのマイグレーションで文字化けせずに、うまくSQLServerからMySQLに変換できた。

やれやれ、大変な回り道をしてしまった。もっと早く気付けよ > 自分。

#CakePHP 3を試してみました。

環境を作ってインストールできたので、CakePHP 3を試してみました。試したみたと言ったけど、簡単にいつものブログのデータベースを作って、ControllerとModelをBakeして、使用している値をダンプしてみる。あとは、CakePHP3のドキュメントを読んでみる。

つまるところ、大幅に変わったMVCのModelの部分が肝かな。ModelがTable ObjectEntitiesになって、ORMがどう関わってくるというところが大事か。それとコントローラーとTable ObjectEntities、ビューがどう関しているかをもっと理解しなくてはいけない。

CakePHP3のドキュメントTable ObjectEntitiesを訳しながら読み進めていたけど、これはおもしろぞ。

Berkshelf のWindowsへのより簡単なインストール方法。

以前、Berkshelf のインストールが面倒、と書きましたが、もっと簡単なイントール方法が紹介されていました。紹介されていたのは、「CakePHPで学ぶ継続的インテグレーション」という本です。ここで、ChefDK(Chef Development Kit)を利用する方法が書かれています。

ChefDKを使えば、Rubyやgemをインストールことなく、ChefやBerkshelfなどのChefに関連するツールをまとめてWindows上にインストールできます。面倒なRuby関連のツールをChefDKでWindowsに簡単にでききます。これでChefを使いたいだけなのに、Ruby関連のインストールと格闘しなければいけない、なんてことがなくなります。

CakeFest2014報告会の参加 #CakePHP  

CakeFest2014報告会の参加 #CakePHP  

たまたまFacebookに前日に見つけて、速攻で参加申し込み。本日行ってきました。

コワーキングスペースに行ったのは初めて、こういった勉強会に行ったのも初めて。今回は、日本で活動しているしているCakePHPのコアなメンバーが揃ったなのかな。

この勉強会の懇親会で「CakePHPで学ぶ継続的インテグレーション 」の著者とお話して、帰りの地下鉄の中から、これまた速攻でアマゾンに注文してしまいましたよ。本日発売だそうだ。CakePHPのテストに関しては、いろいろなところから情報をGetしなければいけなかったので、これでまとめてスキルアップできるといいな。

とりあえず、ここで本を注文しましたよ、と報告。

CakeFest 2014 報告会 for CakePHP JAPAN
2014-09-19(金)19:30 – 21:30 CakeFest 2014 の報告会です。

CakeFest 報告会 for CakePHP JAPAN

CakeFest2014の報告会イベントをCo-Edoにて9/19に行ないます。
できれば多くの参加者の方に来ていただき、来年10周年となるCakePHPの盛り上がりと、CakeFest2015に日本から参加するきっかけにもなれば良いなと思っています。

内容

以下を予定しています。

@sizuhikoさんによる報告
@yandoさんによる報告
CakeBeer

CakePHPと言えばビール!
時間があればLTタ…

#baserCMS のPDFリンクプラグイン作成

baserCMS公式サイト10年以上お付き合いしている会社の株主向けのサイトを運営しているのですが、そろそろリニューアルしましょうということになりました。今まではベタにPHPを使って書いていましたので、キチンとPHPのフレームワークを使って作成することにします。PHPのフレームワークといっても、CakePHPしか知らないので、CakePHPで作成してきます。

CakePHPの上で作っていくのもいいのですが、今回はCakePHPの上で動いているbaserCMSというコンテンツ管理システムの上で作成して行きます。会社のサイトですので、Wordpressのように時系列で記事を並べていくのではなく、固定ページ中心ですので、WordpressではなくbaserCMSが丁度いいのです。

しかし、会社サイトといっても、株主向けのサイトでもありますので、PDFファイルのIR情報やニュースリリースを掲載しなければいけません。しかも、IR情報というのは面倒なもので、証券取引所からのお達しで発表時間よりも、PDFファイルを前に見せることは厳禁です。IR情報を見て株の売買をするのですから、発表前の情報を手に入れられてしまうことは御法度です。

そこで、PDFファイルを時間によって記事リストを生成できるようなことを実現します。時間での表示管理はbaserCMSにデフォルトでインストールされているブログプラグインに、日付でアクセス制限をする機能がありますので、こちらを利用することにします。

今回はブログブラグインにPDFファイルを登録できるようにしました。ブログプラグインのpostテーブルにPDFファイル名の項目を追加して、プラグインを直接改造する訳にはいかないので、PDFリンクプラグインを別途開発して、postテーブルに1対1でPDF情報を格納するテーブルを用意しました。これでbaserCMSがアップデートした場合にも対応できます。

ブログプラグインの管理ページでPDFファイルを指定してファイルをアップできる機能を、PDFリンクプラグインとして追加しています。同じような機能を持ったプラグインを探しても見つからなかったので自分で作ることにしました。もしも、存在したならば、今回はbaserCMSのプラグインの開発のスキルを習得できたということでよしとしましょう。

作成したbaserCMSのPDFリンクプラグインをGitHubに置いておきます。

https://github.com/muneando/basercms-plugin-pdf

ご自由にお使いください。バグを見つけたり機能アップしたら、GitHubから連絡ください。ただし、今回のサイトを作成するにあたっての必要最上限の機能しか実現していませんので、機能アップをしていただければ、大変うれしいです。

ページ内で表示するPDFファイルへのリンクは、PDFリンクプラグインのヘルパーで実現しています。ブログの本文とPDFファイルをどちらを優先してリンク先で表示できるかを、PDFリンクプラグインの管理ページで指定できます。前述の通りPDFファイルへの直リンクはダメですので、ユーザーがアクセスできないところにPDFファイルを置いて、PDFファイルをダウンロードする前に、時間をチェックできるようにしています。

使い方の説明は、GitHub の README.md をご覧ください。

このプラグインの作成で参考したのは、materializing 氏の Keyword プラグインです。参考というよりも、baserCMSのプラグインのイベント辺りは丸写しです。おかげでCakePHPのイベントについて理解できました。materializing 氏には、baserCMSのプラグインについて相談に乗っていただき感謝です。

実際に動いているサイトは、まだテスト段階なので公開していません。PDFリンクプラグイン以外にも、IRカレンダーを表示するためのbaserCMSブラグインも作成してしましました。もし、お客さんにOKいただいたら、baserCMSの利用例としてご覧いただけるようにします。

#baserCMS のテーマ配置場所がドキュメントルートの下だった

CakePHPでサイトを作成していると、静的ページの編集追加も自分で作らないといけないし、お客さんでも編集可能にしたり、その他諸々便利そうだからということbaserCMSをプラットフォームにしてみたらどうなるかとインストールしてみた。

しかしながらbaserCMSのテーマ配置場所がドキュメントルートの下にあるということはちょっと驚いた。ビューの下ではないのね。CakePHPのテーマの機能は使っていないのかな。

もしかしたら、.htaccessにゴチョゴチョ設定されているから直接ファイルにアクセスできないようにしているとか思ったらそうではなかった。もしかしたらブログでアップロードされたファイルもwebrootのfilesの下に入ってしまうのかな。

何かbaserCMSのドキュメントに書かれていないようなテーマの配置場所を変更する設定方法があるのだろうか?

CakePHPのDebugKitの表示がページの下に表示されるときの対応

CakePHPのDebugKitプラグインですが、正常に動いていると右上にアイコンが表示されます。

CakePHPのバージョンが2.4.7で現時点の最新版のときにインストールすると、Debug Kitプラグインで表示される内容がページに下に丸見えになってしまいました。

Debug Kitプラグインのインストールも正しく行っていると思っていましたが、プラグインから書き出しているwebroot以下のdebug_kitディレクトリに設置されているJavaScriptファイル、CSSファイル、画像ファイルが、すべて404 File not foundになっていました。

調べてみるとDebug KitプラグインのGitHubでも同じことで悩んでいる人がいました。結果として、/app/COnfig/bootstrap.php に以下のコードを付け足せば、正しくDebug Kitプラグインの結果が表示されます。

Configure::write('Dispatcher.filters', array(
'AssetDispatcher',
'CacheDispatcher'
));

Dispatcher.filtersがどういう役割をしているかよくわかりませんが、CakePHPのドキュメントのプラグインアセットのページと、SildeShareのこのページが参考になるかもしれません。

ただし、Vagrantの共有フォルダで開発しているため、シンボリックリンクでの設定はできませんでした。