[CakePHP] CakeEmailの使い方

CakePHPにはメール送信のためのコアライブラリが用意されている。以下、管理者へ簡単な通知メールを送信する前提での基本的な使い方覚え書き。

設定 app/Config/email.php

メールレイアウト app/View/Layout/Emails/text/notify.ctp

メールビュー app/View/Emails/text/notify.ctp

送信処理 (コントローラ)

参考サイト

CakeEmail — CakePHP Cookbook 2.x documentation
http://book.cakephp.org/2.0/en/core-utility-libraries/email.html

[CakePHP] Timeヘルパーの使い方

複数のタイムゾーンにユーザが分散している会員サイトの場合、ログインしているユーザのタイムゾーンに合わせて時刻表示を補正する必要がある。CakePHPでは、そのためにTimeヘルパーが用意されている。以下ざっくり覚え書き。

ユーザのタイムゾーンに合わせて日時を補正するには

基本的なストーリは以下のとおり。

  • アプリのタイムゾーンをUTCにする
    (app/Config/core.php の date_default_timezone_set(‘UTC’)を有効にする)
  • データベースに保存する時刻はUTCで統一する
  • ユーザのタイムゾーンをデータベースに保存する
    (ログインしているユーザのタイムゾーンをわかるようにする)
  • Timeヘルパーを使って時刻を補正して表示する
    (Timeヘルパーのメソッドの多くにタイムゾーンが指定できる)

Timeヘルパーの使い方

ビュー内ではTimeHelperクラス経由でメソッドを呼び出す。

バージョン2.1からはCakeTimeクラスのグローバルメソッドに含まれるようになったので、任意の場所から呼び出すことが可能。

サンプル

以下Cookbookから。

Timeヘルパーには役立ちそうなメソッドがいろいろ用意されている。

参考サイト

TimeHelper — CakePHP Cookbook 2.x documentation
http://book.cakephp.org/2.0/en/core-libraries/helpers/time.html

[CakePHP] Formヘルパーを使って日時を入力する

Formヘルパーはオプションが多いので、良く使いそうな形式のサンプルを記しておく。

デフォルト

datetime1

日本式 (12時間表記)

datetime2

日本式 (24時間表記)

datetime3

[CakePHP] WordPressを共存させる

例えば、以下の構成の会社サイトをCakePHPベースで構築するとする。

  • / ホーム
  • /products 製品紹介
  • /support サポート
  • /about 会社紹介
  • /contact お問い合わせ

そこへ社長が「会社サイト内に社長ブログを設置したい」と言い出したとする。

  • /blog 社長のブログ

カスタムでブログCMSを作る予算は無いので、じゃあWordPressを使いましょうという話になったとする。で、CakePHPにどうやってWordPressを入れ込むか、という話になる。

WordPressを配置するディレクトリ

事前準備として、まずはWordPressを配置するディレクトリを決める。CakePHPのルールではapp/webrootがホームなので、そこにWordPressを配置するのが定石かもしれない。

だけど、そうするとWordPressがCakePHPに依存しすぎる感じがする。もし将来CakePHP以外のフレームワークを使ってサイトを作り直すことがあると、WordPressを移動させる必要が出てきてしまう。CakePHPとWordPressの2つのCMSの依存関係は出来る限り低くしておきたいので、CakePHPの内部にWordPressを配置することは得策ではないように思う。

というわけで、WordPressは公開ディレクトリのホーム直下に配置することにする。こうしておけば、もしCakePHP関係のファイルを全て削除したとしても、WordPressは生き残る。

  • /www
    • /app
    • /blog ← ここにWordPressを配置
    • /lib
    • /plugin
    • /vendors

.htaccessの設定

あとは、ブログへのアクセスが正しくWordPressに流れるように.htaccessを設定してやればよい。

ホームディレクトリの.htaccessを見ると、全てのトラフィックはapp/webroot以下に転送されるようになっているので、blogへのトラフィックだけはblogディレクトリ以下に転送されるように、以下のように設定を追記する。

これで事前準備は完了。あとは通常通りWordPressの初期設定をすればよい。

[CakePHP] デフォルトの名前でないビューを指定する

CakePHPは「設定よりも規約(convention over configuration)」の考え方に従っているけど、時には規約から外れた実装のほうが効率が良い場合もある。実際にそういうケースがあったので覚え書き。

想定

ブログのようなウェブアプリ。

ビジターには記事(Post)の一覧(index)と詳細(view)を表示する。

PostsController

  • index
  • view($post_id)

管理者(admin)には管理者向けの記事一覧(admin_index)とCRUDの基本機能を用意する。

PostsController

  • admin_index
  • admin_add
  • admin_view($post_id)
  • admin_edit($post_id)
  • admin_delete($post_id)

さらに管理者には、ビジターに見える体裁での記事のプレビュー表示をしたい。

PostsController

  • admin_preview($post_id)

「ビジターに見える体裁」なので、独自にビューを定義せずにPosts/view.ctpを流用したい。そうしておけば、将来ビューの体裁が変わったときに編集しなければいけないビューはPost/view.ctpの1つで済む。

実装

デフォルトの名前でないビューを指定するにはどうするか、調べてみると簡単だった。コントローラのメソッドから復帰する前にrenderメソッドで任意のビューを指定できる。

参考サイト

コントローラ — CakePHP Cookbook 2.x ドキュメント
http://book.cakephp.org/2.0/ja/controllers.html
Controller::render(string $view, string $layout)の説明を参照。

[CakePHP] 環境に応じてデータベースの設定を変える

ローカル、ステージング、本番など複数の環境があって、それぞれデータベースが異なる想定。環境に応じてデータベースの設定を変える方法を考える。

方法1: 設定ファイルを差し替える

環境ごとに設定ファイルを作っておいて、動作環境に応じて差し替える。例えば以下のファイルを作っておいて、ディプロイするときに動作環境に応じたファイルをDatabase.phpにリネームするわけだ。

  • Config/Database.local.php – ローカル用
  • Config/Database.staging.php – ステージング用
  • Config/Database.production.php – 本番用

この方法はわかりやすいが、ディプロイ作業が僅かに煩雑になる。例えば、リモートリポジトリにコードがまとめられている場合、単純にクローンするだけでは足りず、手動でDatabase.phpを仕度する必要がある。ディプロイ手順を工夫すれば済む話だけど。

方法2: プログラムで環境を判別して設定を動的に変える

現在の動作環境をプログラムで判別できるならば、データベース設定を動的に切り替える仕組みをDatabase.phpに組み込んでやればいい。例えば環境ごとにドメインが異なるなら以下のようにできる。

この方法の利点はディプロイが楽なこと。環境ごとに設定ファイルを用意する必要が無く、単純にディプロイするだけで動く。結果的に手間が減るしミスも減る。欠点らしい欠点はみつからないので、僕的には最近はこの方法を使うことが多い。

[Git] 基本メモ: 共有 リポジトリの利用

共有リポジトリの作成

–bare リポジトリをベアとして作成する。
ベアリポジトリはワーキングディレクトリを持たない。更新情報だけを持つ。
ノンベアリポジトリはワーキングディレクトリを持つ。

[A] mywebを共有リポジトリへプッシュ

[B] 共有リポジトリをクローンして変更後にプッシュ

[A] 今日リポジトリをマージ

参考 push vs fetch+merge

Git – pull は本当に fetch + merge なの? – Qiita
http://qiita.com/Teloo/items/95a860ae276b49edb040

Git pullを使うべきでない3つの理由 · DQNEO起業日記
http://dqn.sakusakutto.jp/2012/11/git_pull.html

git pullは、fetchしてmergeするのと同じなのか? | GMOメディア エンジニアブログ
http://tech.gmo-media.jp/post/110492395034/git-pull-and-fetch-merge

[Git] 基本メモ: ブランチ、マージ、タグ、エイリアス

ブランチ

ブランチのマージ

マージの衝突の対処例

タグ

コミットのIDの代わりに解りやすい名前を付ける

エイリアス

gitのコマンドにエイリアスを付ける

[Git] 基本メモ: 設定、初期操作、ログ表示、状態表示・変更、コミット

設定

ローカルリポジトリの初期操作

ログ表示

状態表示・変更

gitに含めないファイルは .gitignore に記述する。

コミット

直前のコミットの変更

コミット前に変更を取り消す (作業ディレクトリ、ステージングエリア)

取り消しを取り消す (resetを取り消す)