composerによるcakePHPのインストール

http://book.cakephp.org/2.0/ja/installation/advanced-installation.html
composer.jsonに
{
    "name": "example-app",
    "repositories": [
        {
            "type": "pear",
            "url": "http://pear.cakephp.org"
        }
    ],
    "require": {
        "cakephp/cakephp": ">=2.4.9"
    },
    "config": {
        "vendor-dir": "Vendor/"
    }
}

あとは
$php composer.phar install
とするだけ

requireの書き方を以前
"pear-cakephp/cakephp": "2.*"
このような形でかいていたんだけど
vagrantでprovisionしたときに
Your requirements could not be resolved to an installable set of packages.

 Problem 1
 - The requested package pear-cakephp/cakephp could not be found in any version, there may be a typo in the package name.
とのエラーが出たため

requreを
"cakephp/cakephp": ">=2.4.9"
とすることで実行可能だった

 

composerでのcakePHPインストール

環境作るの面倒ですね

最近はvagrantで環境持ってくるので楽してたんですが

第三者に見せる場合等、サーバ上にインストールする必要があるので

サーバでcomposer使ってインストールしてみました。

composerはパッケージ等でインストールしておきます。

手順はほぼcakeのドキュメントそのままです

http://book.cakephp.org/2.0/ja/installation/advanced-installation.html

プロジェクトのホームディレクトリにcomposer.jsonを作成

$cd /home/project

$vi composer.json

<pre>{
    "name": "example-app",
    "repositories": [
        {
            "type": "pear",
            "url": "http://pear.cakephp.org"
        }
    ],
    "require": {
        "pear-cakephp/cakephp": ">=2.3.4"
    },
    "config": {
        "vendor-dir": "Vendor/"
    }
}</pre>

php composer.phar install

これでVendor/配下にインストールされます。
この後projectを作成します。
$ Vendor/bin/cake bake project
Welcome to CakePHP v2.4.0 Console
—————————————————————
App : project
Path: /home/project/
—————————————————————
What is the path to the

project you want to bake?
[/home/project/myapp] >

変更の必要がなければこれで完了です。

ブラウザからアクセスして

いつもの画面が表示されれば設定完了です。

#色々バージョンが古いとcomposerが動かないかもしれません。(一気にyum updateとかしたら凄く時間かかりましたw)

cakePHP2でコマンド実行

cronで実行したかったのでcakePHP2でのシェル実行の仕方を調べました。

class MyShell extends Shell{
のようにShellを継承して作成出来るようです。
いくつもバッチを作成して共通化させたい場合はapp/Console/Command/AppShell.phpを作成せよとのことです。
バッチに使用するファイルは
app/Console/Command/MyShell.php
とCommandに配置します。
このバッチでコンポーネントを使用したかったのですがなかなか回答に辿りつきませんでした。
$component = array()とかは使えないようで、startup()を使用してインスタンス化させらます。
</span></pre>
<pre></pre>
&lt;?php
App::uses('ComponentCollection','Controller');
App::uses('JsonApiComponent','Controller/Component');
<pre></pre>
//共通化がいるならAppShellを作成する
class EvaShell extends Shell {
<pre></pre>
public function startup() {
$collection = new ComponentCollection();
$this-&gt;JsonApi = new JsonApiComponent($collection);
parent::startup();
}
public function main() {

$this-&gt;out("test");
$data = $this-&gt;JsonApi-&gt;getData();
}
}
<pre><span style="font-family:monospace;">

色々試した結果、ここに行き着きました。
裏付けはありませんw

/app/Console/Command/MyShell.php
で実行できます。
http://book.cakephp.org/2.0/en/console-and-shells.html

cakePHP selectフォームのdisabled

前のエントリーで入力後の確認画面を作成する場合を書いたが
そのままadd.ctpをコピーすると当然フォームのままだったりします
テキストとかはそのまま表示に変えやすいんですけど
連動したリストボックスとかメンドクサイですよね
といっても値表示用のメソッド書けばいいんですが
さくっと逃げるためにリストの選択自体は
エラーチェックで再描画するようのままで
disabledにすることで逃げちゃいました

select(‘category_id’,
$list,
null,
array(‘id’=>’categories’,’disabled’=>’disabled’),”選択してください”);
?>

cakePHP 日本語のヴァリデーション

デフォルトのグローバル関数(?)のmaxLengthでvalidationを行うと
strlenが利用されているため
日本語の文字数が正しくカウントされない
ヴァリデーションルールはカスタマイズチェックの場合と同様に
同一モデル内に記述すれば、こちらが参照されるので
function maxLength($data, $max) {
$str = array_shift($data);
$length = mb_strlen($check,mb_detect_encoding($str));
return ($length array(
‘rule’ => array(‘maxLength’, 25),
‘message’ => ‘名前は25文字以内で入力してください。’,
),
で変更せずにOKです

cakePHP ビューでの日付の整形

2009-05-06 03:00:00のような日付のフォーマットを日本語表記に変えたい場合
htmlヘルパーをカスタマイズすると変換が楽になる

$cp cake/libs/view/helpers/html.php app/views/helpers/

としてhtml.phpの複製をしたのち

function dateFormat($date,$format = “Y年m月d日”) {
return date($format,strtotime($date));
}
function df($date,$format = “Y年m月d日”) {
return $this->dateFormat($date,$format);
}
function dfh($date,$format = “Y年m月d日H時”) {
return $this->dateFormat($date,$format);
}
のようにフォーマットを追加して
ビュー内では
$html->dfj($date_str);
※date_strにはタイムスタンプが入っている

参考URL
http://www.jamboree.jp/cms/archives/41
http://cakephp.blog16.jp/index.php/2008/07/01/p27

cakePHP TOPページカスタマイズ

ドキュメントルートでアクセスする

TOPページをカスタマイズする場合

/app/views/pages/home.thtmlを作成すればよい

コントローラで処理を行う場合

/cake/libs/controller/pages_controller.php

/app/controller/pages_controller.php

としてコピーし

indexファンクション内で処理を書けばよい

cakePHP 確認画面

日本人って確認画面好きですよね~
まぁ金額大きくなればしかたないでしょうが
お金とか関係ない、かるーい項目でも入れますよね
といっていてもしかたないので確認画面つくります(笑

bakeで焼いたのをベースに変えます
function add() {
$this->set(‘list’,$this->Category->getCategory());
$this->set(‘options’,array());
if(@$_POST[“mode”]){
$this->Entry->set($this->data);
if($this->Entry->validates()){
$this->render(‘confirm’);
}else{
$this->Session->setFlash(__(‘The Entry could not be saved. Please, try again.’, true));
}
}else{
if (!empty($this->data)) {
$this->Entry->create();
if ($this->Entry->save($this->data)) {
$this->Session->setFlash(__(‘The Entry has been saved’, true));
$this->redirect(array(‘action’=>’thanks’));
} else {
$this->Session->setFlash(__(‘The Entry could not be saved. Please, try again.’, true));
}
}
}
}
こんな感じでしょうか?
add.ctpにはの記述が必要です
このadd.ctpから入力をした場合modeにconfirmが入っていますので(条件判定では見てませんが)
confirm.ctpを作成してあればこれが表示されます
ここの内容はadd.ctpをコピーしてrenameすればいいと思います
そのままだと入力フォームなので表示のみにしたり、リストの値取得したりって処理は必要になって
しまいますが
これで確認画面が表示されます

cakePHP modelの再定義

データベースが開発途中で変更された場合
序盤は変更も踏まえてbakeでサンプル作ったりすると思うのですが
再定義したもので再度bake使用と思うと昔の定義のまま選択肢が出てきたりします
どっかで似たことやったなーと思ったら、確か昔Ethnaでも同様のエントリ書いたの思い出しました。
ということできっとキャッシュが悪さしているということで
/home/cool/cake/app/tmp/cache/models
にありました
この中にあるcake_model_default_**
なファイルを削除して再度bakeすると
新しい定義が選択肢に表示されます

cakePHP redirect

管理画面上でコントローラ毎にページを生成しているときに
処理を追加したりしたときに
処理完了で別アクションへリダイレクトさせようとしたら
呼び出し元のコントローラにリダイレクトしてしまった
userコントローラとかの中で
$this->redirect(array(‘action’=>’/company/top’));
としてみたら
/usr/company/top
に遷移した
そりゃそうだというかんじですが(^^;
$this->redirect(array(‘controller’ => ‘company’,’action’=>’top’));
とコントローラを指定すれば
別コントローラにリダイレクトされました