CakePHP 2.7の導入方法

CakePHP 2.7を導入する方法についてまとめてみます。

#前提
* Gitでソースコードを管理する。
* DBとしてSQLite3を使用する。
* jQuery,jQuery UI,Datepickerを使用する。
* システムを日本標準時を基準に稼働させる。
* 画像のアップロード処理に、UploadPackを使用する。
* 実行環境のドキュメントルートが`~{ユーザ名}/public_html`にある。
* 開発環境の`{プロジェクトディレクトリ}/{開発用ディレクトリ}`内に、開発用のファイルが置かれる。
* 実行環境のPHPのバージョンが5.4.16よりも前のものである(5.4.16以降の場合には、最新のCakePHPが使用できます)。

#開発環境の設定
##前提
* Git,SQLite3がインストールされている。

##手順
1. `cd {プロジェクトディレクトリ}`コマンドを実行し、カレントディレクトリをドキュメントルートに移動します。
2. `git clone --single-branch --branch 2.7 git://github.com/cakephp/cakephp.git {開発用ディレクトリ}`コマンドを実行し、CakePHP 2.7をダウンロードします。
3. `cd {開発用ディレクトリ}`コマンドを実行し、カレントディレクトリを移動します。
2. `git clone --single-branch --branch 2.2 git://github.com/cakephp/debug_kit.git app/Plugin/DebugKit`コマンドを実行し、DebugKitを追加します。
2. `git clone --single-branch git://github.com/szajbus/uploadpack app/Plugin/UploadPack`コマンドを実行し、UploadPackをダウンロードします。
3. `rm -rf .git`コマンドを実行し、Gitの設定ファイルが入ったディレクトリを削除します。
3. `rm  -rf app/Plugin/DebugKit/.git*`コマンドを実行し、Gitの設定ファイルを削除します。
4. `rm  -rf app/Plugin/UploadPack/.git*`コマンドを実行し、Gitの設定ファイルを削除します。
3. `rm app/Plugin/empty`コマンドを実行し、`empty`ファイルを削除します。
3. `mkdir app/webroot/upload`コマンドを実行し、`upload`ディレクトリを作成します。
4. `touch app/webroot/upload/empty`コマンドを実行し、`empty`ファイルを作成します。
3. `{プロジェクトディレクトリ}/{開発用ディレクトリ}/.gitignore`を次のように編集します。

        # User specific & automatically generated files #
        #################################################
        build
        dist
        tags
        *.mo
        *.diff
        *.err
        *.orig
        *.rej
        *.swo
        *.swp
        *.vi
        *.lock
        bin
        
        # OS generated files #
        ######################
        .DS_Store*
        ._*
        .Spotlight-V100
        .Trashes
        Icon?
        *.db
        *~
3. `{プロジェクトディレクトリ}/{開発用ディレクトリ}/app/Config/bootstrap.php`の末尾に、`CakePlugin::loadAll();`を追加します。
4. `{プロジェクトディレクトリ}/{開発用ディレクトリ}/app/View/Layouts/default.ctp`と`{プロジェクトディレクトリ}/{開発用ディレクトリ}/app/View/Layouts/error.ctp`の`<?php echo $this->element('sql_dump'); ?>`を削除します。
4. `{プロジェクトディレクトリ}/{開発用ディレクトリ}/app/Controller/AppController.php`を次のように編集します。

        class AppController extends Controller {
        	//追加部分
        	public $components = array('DebugKit.Toolbar');
        }
2. `mkdir db`コマンドを実行し、SQLite用DBファイルを格納するディレクトリを作成します。
2. `sqlite3 db/{DBファイル名}`コマンドを実行し、SQLiteを起動します。<br>この際、DBファイル名を`{ファイル名}.sqlite3`といった形にすると、他のファイルと区別がついて良いでしょう。<br>※`db`という拡張子にはしないことをおすすめします(後述のデプロイメントの設定をそのまま適用できなくなるため)。
3. 何らかのコマンドを実行します。<br>この際にテーブルを作成しても良いですが、そのつもりがなければ、とりあえず`.tables`コマンドあたりを実行しておくと良いでしょう。
3. `.exit`コマンドを入力し、SQLiteを終了します。
2. `cp app/Config/database.php.default app/Config/database.php`コマンドを実行し、`{プロジェクトディレクトリ}/{開発用ディレクトリ}/app/Config/database.php.default`を`{プロジェクトディレクトリ}/{開発用ディレクトリ}/app/Config/database.php`というファイル名で同じディレクトリ内にコピーします。
3. `{プロジェクトディレクトリ}/{開発用ディレクトリ}/app/Config/database.php`を次のように編集します。

        class DATABASE_CONFIG {
        
        	public $default = array(
        		//変更部分
        		'datasource' => 'Database/Sqlite',
        		'persistent' => false,
        		//変更部分
        		'database' => '{実行環境でのDBファイルの絶対パス}',
        		'prefix' => '',
        		//'encoding' => 'utf8',
        	);
        
        	public $test = array(
        		//変更部分
        		'datasource' => 'Database/Sqlite',
        		'persistent' => false,
        		//変更部分
        		'database' => '{実行環境でのDBファイルの絶対パス}',
        		'prefix' => '',
        		//'encoding' => 'utf8',
        	);
        
        }

1. `{プロジェクトディレクトリ}/{開発用ディレクトリ}/.htaccess`を次のように編集します。

        <IfModule mod_rewrite.c>
        	RewriteEngine on
        	RewriteRule ^$ app/webroot/ [L]
        	RewriteRule (.*) app/webroot/$1 [L]
        	#追加部分
        	RewriteBase /{ドキュメントルート}/{サイト名}
        </IfModule>

1. `{プロジェクトディレクトリ}/{開発用ディレクトリ}/db/.htaccess`を次のように作成します。

        order deny,allow
        deny from all

1. `{プロジェクトディレクトリ}/{開発用ディレクトリ}/app/webroot/.htaccess`を次のように編集します。

        <IfModule mod_rewrite.c>
        	RewriteEngine On
        	RewriteCond %{REQUEST_FILENAME} !-d
        	RewriteCond %{REQUEST_FILENAME} !-f
        	RewriteRule ^ index.php [L]
        	#追加部分
        	RewriteBase /{ドキュメントルート}/{サイト名}/app/webroot
        </IfModule>


1. `{プロジェクトディレクトリ}/{開発用ディレクトリ}/app/Config/core.php`を次のように編集します。
  1. セキュリティ関連の値の設定
  
            /**
             * A random string used in security hashing methods.
             */
            	//変更部分
            	Configure::write('Security.salt', '{適当な文字列}');
            
            /**
             * A random numeric string (digits only) used to encrypt/decrypt strings.
             */
            	//変更部分
            	Configure::write('Security.cipherSeed', '{適当な数値}');
  1. タイムゾーンの設定

            /**
             * Uncomment this line and correct your server timezone to fix
             * any date & time related errors.
             */
            	//変更部分
            	date_default_timezone_set('Asia/Tokyo');
1. [ThemeRoller | jQuery UI](http://jqueryui.com/themeroller/)の左のボックスのにある`Gallery`をクリックし、お好みのテーマを選びます。
1. `{プロジェクトディレクトリ}/{開発用ディレクトリ}/app/View/Layouts/default.ctp`を次のように編集します。

        //追加部分
        echo $this->Html->css('//code.jquery.com/ui/1.11.4/themes/{前の手順で選んだテーマ名の空白をハイフンで置換した名称}/jquery-ui.css');
        echo $this->fetch('css');
        //追加部分
        echo $this->Html->script('//code.jquery.com/jquery-1.11.3.min.js');
        echo $this->Html->script('//code.jquery.com/ui/1.11.4/jquery-ui.min.js');
        echo $this->Html->script('//ajax.googleapis.com/ajax/libs/jqueryui/1/i18n/jquery.ui.datepicker-ja.min.js');
        echo $this->fetch('script');
#デプロイメントの設定
※IntelliJ IDEAを基準に書いているため、他の開発環境では異なる可能性があります。

|項目|内容|
|:--:|:--:|
|デプロイメント元|`{プロジェクトディレクトリ}/{開発用ディレクトリ}`|
|デプロイメント先|`{ドキュメントルート}/{サイト名}`|
|デプロイメントから除外するファイル|`.svn`<br>`.cvs`<br>`.idea`<br>`.DS_Store*`<br>`.git*`<br>`.hg`<br>`build*`<br>`*.md`<br>`.editorconfig`<br>`*.yml`<br>`LICENSE.txt`<br>`composer.json`<br>`.jshintrc`<br>`._*`<br>`.Spotlight-V100`<br>`.Trashes`<br>`Icon?`<br>`*.db`<br>`*.diff`<br>`*.err`<br>`*.orig`<br>`*.rej`<br>`*.swo`<br>`*.swp`<br>`*.vi`<br>`*~`<br>`.cache`<br>`.project`<br>`.settings`<br>`nbproject`<br>`tags`<br>`dist`<br>`*.mo`<br>`*.default`<br>`*.lock`<br>`.classpath`<br>`.eml`<br>`bin`<br>`README*`<br>`license`<br>`*.eml`<br>`*.zip`|

#実行環境の設定
##前提
* 管理者権限が使えない。
* SQLite3がインストールされている。

##手順
1. 開発環境から実行環境へデプロイメントを行います。
1. `cd {ドキュメントルート}/{サイト名}`コマンドを実行し、カレントディレクトリを移動します。
1. `chmod 757 -R app/tmp`コマンドを実行し、`tmp`ディレクトリのパーミッションを設定します。
4. `chmod 777 -R app/webroot/upload`コマンドを実行し、`upload`ディレクトリのパーミッションを設定します。
4. `chmod 707 db`コマンドを実行し、`db`ディレクトリのパーミッションを設定します。
4. `chmod 606 db/{DBファイル名}`コマンドを実行し、SQLite用DBファイルのパーミッションを設定します。
1. CakePHPを導入したサイトにアクセスし、出てきたページに(DBに何も入っていないという警告を除く)エラーや警告が表示されてなければ、導入に成功したということになります。

#参考文献
* [szajbus/uploadpack](https://github.com/szajbus/uploadpack)
* [CakePHP - Wikipedia](https://ja.wikipedia.org/wiki/CakePHP#CakePHP_3.0)
* [cakephp/debug_kit at 2.2](https://github.com/cakephp/debug_kit/tree/2.2)
* [CakePHP2でSQLite3を使う方法](http://www.serverlog.jp/cakephp2-sqlite3/)
* [怒涛のめもめもリンク集 | CakePHP練習(2)](http://mechsys.tec.u-ryukyu.ac.jp/~oshiro/SiteList/2012/04/12/2300)
* [CakePHP 2.x - CakePHP インストール時エラーの対処](http://kwski.net/cakephp-2-x/1009/)
* [CakePHPのダウンロードとインストール - CakePHPの使い方](http://www.phpbook.jp/cakephp/install/index1.html)
* [database.phpの作成とデータベースの用意 - CakePHPの使い方](http://www.phpbook.jp/cakephp/install/index2.html)
* [[SQLite] DB作成・起動・終了・table/index/db表示 : まぁ、モカでも片手に。](http://mocha.exblog.jp/5090052)
* [Git で空のディレクトリを追加する場合は empty ファイルを入れる | ウェブル](http://weble.org/2011/03/10/git-add-directory)
* [超簡単！カレンダーから日付入力する方法：jQuery ui Datepicker | WEBデザインファン](http://www.webdesign-fan.com/jquery-ui-datepicker)
* [jQuery-UI テーマの一覧、比較　社長の進捗 2014.8.2 | Javascript | 株式会社メイドインクリニック](http://www.madeinclinic.jp/javascript/20140802/)
* [[CakePHP] インストールディレクトリの.htaccessだけではなく、appディレクトリとapp/webrootディレクトリの.htaccessも修正する必要がある。 - SumiTomohikoの日記](http://d.hatena.ne.jp/SumiTomohiko/20061225/1167071865)