cakephp雑記帳 ITかあさん

ITかあさん

CakePHP2.x Formヘルパーコピペ用

CakePHP2.x Formヘルパーコピペ用(自分用)にメモっていくわよ

CakePHPのFormヘルパーがいつまでたっても覚えられないので、自分用にコピペ用にメモっていきたいと思います。(今後どんどん追記していこうかと)
使えるな〜と思ったらどうぞ使って下さい。なお、記法はPHP5.4以降のarray短縮構文です。

Form create

//フォームの書き出し(なお、デフォルトではmethodはpost)
echo $this->Form->create('User');
//postじゃなくて、methodをgetにしたい時
echo $this->Form->create('User', ['type' => 'get']);
//multipart/form-data(ファイルアップロード用のフォーム作成時に)
echo $this->Form->create('User', ['type' => 'file']);
//action先を任意で設定したい時
echo $this->Form->create('User', ['url' => ['controller' => 'search', 'action' => 'list']);

input type text

エラーも、ラベルもテキストフォームも一緒に表示したい時

//labelを変更したい時
echo $this->Form->input('name', ['label' => '名前']);
//フォームパーツを囲うdivタグが不要な時
echo $this->Form->input('name', ['label' => '名前', 'div' => false]);

dateフォーマット

何年〜何年までと期間指定出来ることと、monthNamesをfalseにすることで、Aprilなどの月表記を数字に出来る。
maxYearとminYearの設定で、何年〜何年までのプルダウンになります。dateの扱いはけっこう便利。

echo $this->Form->input('birthday', [
    'dateFormat' => 'YMD',
    'monthNames' => false,
    'minYear' => date('Y') - 50,
    'maxYear' => date('Y') - 13,
    'separator' => array(' 年 ', ' 月 ', ' 日 '),
     ]);

radio

legendのfalseグループ化fieldsetを除去

$options = ['0' => '男性', '1' => '女性'];
$attributes = ['default' => '0','label' => false, 'legend' => false ];
echo $this->Form->radio('gender', $options, $attributes);

checkbox

チェックボックスが一つか、複数かで書き方は変わります。

//項目が複数
echo $this->Form->input('Model.field',   
    ['type' => 'select',   
          'multiple' => 'checkbox',  
          'options' => $options,  
          'label' => false,  
          'div' => false,  
          'id'=> false]); 
//〜に同意します などに使えるチェックボックス
echo $this->Form->input('registration', [
    'type' => 'checkbox',
    'label'=> false,
    ]);

Select

empty設定で、未選択状態を設定可能。

echo $this->Form->input( 'field', [ 
    'empty' => '-----',
    'label' => false,
    'type' => 'select', 
    'options' => ['Cakes','Cookies']
    ]);

submit

echo $this->Form->end('変更');

まとめ

ひっさしぶりにしばらく別の仕事でZendFrameworkに関わっていたため、すっかりCakeのViewを忘れてしまいました。
特のFormヘルパーはすぐ忘れておたおたしちゃうんで、すぐコピペして使えるようにメモがてら残しておきたいと思います。
Formヘルパーを使うと余計なdivで囲われたり idが勝手に付与されたりするので、便利といえば便利なんですけど、時に邪魔な時はfalseを設定しましょう。
classを付与したい場合はclassを以下のように設定しますが、複数classを付与したい時はHTML同様、半角スペースを付けてあげれば複数classが設定出来ます。前にclass複数付与するにはこれも配列で渡すのかとおもってつまづいたことがあるので念のため。

echo $this->Form->input( 'field', [ 
    'div' => false,
    'label' => 'false', 
    'class' => 'class1 class2', 
    ]);

CakePHP2.4 Authログイン中に同一テーブルにsaveすると勝手にupdateするんですががが

Authログイン中に同一テーブルにsaveすると勝手にupdateするんですががが

なぜだ!UserモデルでAuthログイン中に同一テーブルにsaveしようとするとなぜupdateするんだ!!!

↑↑↑↑なぜこの現象が起きるのですか?Why??

↑↑↑↑CakePHP2.x Authコンポーネントの使いかたはこちらが分かりやすいざます。

普通にsaveをしているだけなのに

$this->User->save($this->request->data);
UserモデルにAuthログインしていると、なぜかid渡していないのに、ログイン中のAuthのIDのデータをアップデートしてきます。

最初何のことやら分からず大混乱しましたが、、、
直前にidにNULL代入して無事新規データとしてInsertが実行されました。

$this->request->data['User']['id'] = NULL;
$this->User->save($this->request->data);

なぜだ〜。でもUserモデルにAuth認証してIDを常にSession持っているからそういうもんなのかな〜と思ってみたり。

CakePHP2.x SQLをModelに書いて実行する

CakePHP2.x SQLをModelに書いて実行する

CakePHP使いとしては、SQLを書くことそのもが気が引けるのですが。。やむなしって時。

ControllerにSQLを書くケース

$return = $this->Model->query($sql);
SQLを書いて実行する場合はこれが一般的。

ModelにSQLを書くケース

もちろん、プレースホルダーをつかってSQLインジェクション対策もします。

class Model extends AppModel {
    public function getMember($id){
        $sql = "SELECT * FROME table WHERE member_id = ?;";
        $params = array(
            'member_id'=> $id
        );
        $data = $this->query($sql,$params);
        return $data;
    }

あとはController内で受け取ります。

//Controller
public function index($id) {   
        $data = $this->Model->getMember($id);
        $this->set('data', $data);
    }

。。特にメモるほどでもなかったかも・・

Facebookでログイン・・だけじゃない! CakePHP-Facebook-Plugin

CakePHPでFacebookアカウントを利用したログインを実装した〜い!

CakePHPのFacebook認証
Facebookアカウント以外にもTwitterやGoogle+など多彩なソーシャルアカウントとログイン連携を取るならOpauthがオススメです。日本語情報も多いですしね。

CakePHPとFacebookの連携が数段便利になるCAKEPHP FACEBOOK PLUGIN

日本語情報がほとんどないため、一部実装に悩んだ部分もありましたが、導入できました!

CAKEPHP FACEBOOK PLUGINで出来ること

このプラグインを導入することで、ログイン以外にこれだけのことが実装出来るようになります。WordPressのプラグインみたいですね〜。CakePHPで作った自作CMSにコメントなど色々導入出来たら楽しそうですね!

  • ログイン機能
  • Facebookユーザー情報の表示 サムネイル表示
  • シェア
  • いいね
  • コメント
  • ファンボックス
  • ライブストリーム

CAKEPHP FACEBOOK PLUGINを導入するよ〜

CakePHP2.2で導入しました。なお、1.3から導入出来るらしいですし、本家サイトの解説もCakePHP1.3系の書き方をしてあります。

本家解説サイト WebTechNick

プラグイン配布元

プラグインはGitHubで公開されています。プラグインをダウンロードして、Facebookとフォルダ名を付けて、
/app/Plugins/ に設置します。

プラグインをロードする

//app/Config/bootstrap.php
CakePlugin::load('Facebook');

Facebookデベロッパーズよりアプリの登録を行う

Facebookのアプリケーション登録をしないと、ログインも何も使うことが出来ません。
Facebookアプリケーション登録

アプリの登録例

Facebookアプリケーションの登録例
今回私はローカルのMAMPでやってみましたが、どう考えても存在しないようなドメインの形だと登録出来ないので、それっぽい、存在しそうなドメイン名で登録しました。

さらに、facebookでログインするWEBサイトの登録部分は Facebookでログイン後にリダイレクトされることになるので、ログイン後に表示させたいURLを登録すればよいみたいです。

アプリ情報を記載する

app/Config/facebook.phpに Facebookのアプリ情報を記載します。appIdとapiKeyの2つはだいたい同じだと思うのですが。
日本だとlocaleはja_JPとなります。

//app/Config/facebook.php
$config = array(
    'Facebook' => array(
        'appId'  => 'YOUR_APP_ID',
        'apiKey' => 'YOUR_API_KEY',
        'secret' => 'YOUR_SECRET',
        'cookie' => true,
        'locale' => 'ja_JP',
    )
);

ヘルパー

ヘルパーの記載はこんな感じ。プラグインのヘルパーなので、このような記載になりますね。
シェアボタンやいいねボタンの設置などに使います

public $helpers = array('Facebook.Facebook');

コンポーネント

ログイン認証に関わる部分。Authコンポーネントと連携して、Facebookのアカウントで認証を行います。
CakePHP2系のAuth認証の参考サイトはこちらが分かりやすいです。
予めCakePHPのAuth認証は作っておいて下さい。
CakePHP 2.x 系で会員認証 / ログイン関係の機能を AuthComponent を使って構築する方法 ウェブル

今回はそれに少し追記して実装する形になっています。

//usersController.php
//Example AppController setup
public $components = array('Session',
    'Auth' => array(
        'authenticate' => array(
            'Form' => array(
                'fields' => array('username' => 'email')
            )
        ),
        'authorize' => 'Controller'
    ),
    'Facebook.Connect' => array('model' => 'User')
);

layoutファイル

ヘルパーを使うことで、Facebookとの連携が出来るようになります。

<?php $this->Facebook->html(); ?>
<head>
<title>Facebook Plugin Example</title>
</head>
<body>
<?php echo $content_for_layout ?>
<?php $this->Facebook->init(); ?>
</body>
</html>

基本的なAuthは今回は解説しません。普通のCakeのAuthとFacebook.Connectとを連携させればOKです。

CakePHPでFacebookを通して認証しちゃうよ

Facebook未ログインの時

Facebook未ログインの時にはFacebookにログインを促す表示

Facebookにログイン

Facebookにログインする

Facebookログイン

Facebookにログインしているとサムネイルの表示がされる

Facebookアプリから認証

Facebookアプリを通して認証を行う

ログイン認証後のページ

Facebookアプリを通して認証を行うと、ログイン情報を入力していないのに ログイン後のページにリダイレクトされる。

ただFacebookアプリを通して認証するだけならこれだけでOK。

ちゃんとFacebookIDをデータベースに登録してから、FacebookIDの存在の有無をチェックし、FacebookIDがデータベースに存在しなければ新規登録を促せばよいですね。

Facebookのユーザー情報を確認する

Facebookそのものにログインしている状態(CakeのAuthの方じゃなくて)であれば、

debug($this->Connect->user());

と、するだけでプラグインの設定が完了していればFacebookに登録済みのユーザー情報を引っ張ることが出来るのです。
Facebook情報の引き出し

これらをview側にsetして、入力補助も出来ますね。
//ユーザー登録時にFacebookIDも合わせて登録する
if($this->request->is('post')) {
            $this->User->create();
		$this->request->data['User']['facebook_id'] = $this->Connect->user('id');
            if ($this->User->save($this->request->data)) {
                $this->Session->setFlash(__('The user has been saved'));
                $this->redirect(array('action' => 'login'));
            } else {
                $this->Session->setFlash(__('The user could not be saved. Please, try again.'));
            }
        }

このように登録しておけば、認証時にデータベースにFacebookIDの有無を確認すればよいですね。
最初は難しいと思ったけれど、使い方が分かるととっても簡単でした!

CakePHPのcounterCacheでhasManyの数を自動取得

hasManyの数を自動取得出来るcounterCacheが便利すぎる

CakePHP CounterCacheで件数を自動保存
GWなのに、お仕事してますよ ITかあさんです。先日教えてもらった

CakePHPのhasManyの数を取得する

のに、

counterCacheを使うと、増減毎にフィールドに自動保存してくれる

っていう便利な機能を教えてもらいました。

counterCacheはどういうところに使えるの?

例えばブログの記事投稿ってカテゴリーを指定しますね。あのような

このカテゴリーは何個の記事データを持っていますか?

っていうお前は一体何個hasManyしているんだ!っていうのが知りたい時に大変便利です。

CakePHPのcounterCacheの使い方

今回のModeの例

・Post 記事データが入る
・PostCategory CategoryとPostの紐付け
・Category カテゴリー(PostCategoryをhasManyしている)

このような構造で、今回はCategoryモデルにPostCategoryの数を保存する構造にします。

belongsToのModelに記述を追加するよ

var $belongsTo = array(
    "Category" => array(
		'className'=>'Category',
        "counterCache" => true,//これだけ!
		'foreignKey'=>'category_id'
    ),
	
);

hasManyのModelにフィールドを追加

Category Modelに数値型でフィールドを追加します。

image_category_count

複数系にならず、hasManyのModelの名称(小文字)+_countとなります。

以上、終了!

たったこれだけで、ImageCategoryのデータが登録される度に、または削除される度にimage_category_countの数値が増減します。

DeleteAllでカウントがうまく取れない

で、ここまでの情報は出回っているものの、問題は一度に削除したり、一度にたくさん登録するケース。
この場合、DeleteAllなどたくさんの登録や削除が終わった段階で現在何件あるかを問い合わせすることで、カウントの値が変更されます。

updateCounterCacheで現在の件数を登録する

一度にたくさん登録した、たくさん削除した場合はそのままでは件数が更新されないためupdateCounterCacheをデータをたくさん登録したり削除した後に実行します。updateCounterCacheをしたタイミングで、その時の件数を数えてくれるイメージでしょうか。

$this->PostCategory->updateCounterCache(array('post_id' => $post['Post']['id'],'category_id' => $category_id));

queryした時も同様で、updateCounterCacheは1件ずつsaveやdeleteで増減した時でないと自動でカウントはしないみたいです。この時もupdateCounterCacheを実行してあげればいいみたいです。

うん、これで今データは何件あるかの管理は相当楽になりますね。

CakePHP Pagenatorの使い方まとめ

CakePHP Pagenatorのまとめ

CakePHPに限らず、WEBサイトのプログラムを作っていると、ページネーションは欠かせないですね。
CakePHPのPagenatorにはView側に非常にたくさんのオプションがあるので、まとめてみました。

CakePHP Pagenatorの基本的な使い方

1.3系でも2系でも基本的な使い方は変わりません。View側がほんの少し違うだけです。

Controller

データの取得条件であるconditionsについては適時変更して下さい。

$this->paginate = array(
	'conditions'=>array(),
		'order' => array('Model.id' => 'desc'),
		'limit'=>10,//1ページあたりの表示件数
	);
	
$this->set('datas', $this->paginate('Model'));

ここからはView側をまとめていくよ

ここからが本題。CakePHP Pagenatorのview側のオプションについてです。

なお、CakePHP2系でのサンプルになりますが、それほど違いはありません。

$paginator->next();//1.3
$this->Paginator->next();//2系

基本的な次へ、戻るリンク

基本的な次へ、戻るリンクです。次へリンクのある場合prevクラスが、先にデータがもうない場合はdisabledのクラスが当たります。

echo $this->Paginator->prev('[前へ]', array(), null, array('class' => 'prev disabled'));
echo $this->Paginator->next('[次へ]', array(), null, array('class' => 'next disabled'));

出力結果

[次へ]

デフォルトだと、spanタグで囲われていいます。(基本Pagenatorは何でもspanみたいです)

次へ、戻るリンクのタグをspan以外のタグにする

以下のようにすると、spanがpタグに変わります

echo $this->Paginator->prev('[前へ]', array(), null, array('class' => 'prev disabled','tag' => 'p'));

各ページへのリンク

各ページへのリンクタグも囲っているタグはspanなので、tagでspan以外のタグに変更出来ます。
separatorとは区切り文字です。『|』などがいいでしょうし、必要なければ書かなくても問題ないです。

echo $this->Paginator->numbers(array('separator' => '','tag' => 'li'));

カウンター

現在 何件のデータがあって、何ページで、何件中何件のデータを表示しているか

echo $this->Paginator->counter('{:count}件中{:start}-{:end}件({:pages}ページ中{:page}ページ)
');

ページングの次へ、戻るリンクに画像を使う

もちろん画像も使うことが出来ます。

$this->Paginator->next("", array("escape" => false , "tag"=>"span"),  
                     "",//off  
                        array("escape" => false , "tag"=>"span")  
                     );

こんなもんかな?もしあれば今後追加します。

CakePHP UploadPackプラグインのディレクトリ分散

CakePHP UploadPackプラグインのディレクトリ分散がしたい!

UploadPackでアップロードしたファイルをイイ感じに分散したい!
そこそこ反響がありました、

最後にちらっと

一度画像を登録してから最後に自分のオリジナルのディレクトリにファイルを移動させるようなことを処理として行っています。(今回はUploadPackの解説なので、それはまた次の機会に。)

と言ってしばらく放置していたら、UploadPackでアップロードしたファイルのフォルダ分散についてやはり質問を頂きましたので解説します。

ただ、やっていることは非常にシンプルで、

ファイルのアップロード自体はUploadPackで行い、最後に自分の指定した保存先に移動する

ただそれだけなんですよ。

CakePHP UploadPackの唯一の問題点

ITかあさんがCakePHPでCMSを開発する際には、もう無くてはならないプラグインになっているUploadPackなんですが、唯一問題なのは

デフォルトの仕様ではアップロードファイルが一か所に溜まりすぎる

と、いうことなんです。

CakePHP UploadPackのpathのおさらい

UploadPackでアップロードしたファイルの保存先はModelに指定しますね。

	var $actsAs = array(
			'UploadPack.Upload' => array(
				'img' => array(
				'path' => ':webroot/img/:id/:style.:extension',
				'styles' => array(
				'big' => '200x200',
				'small' => '120x120',
				'thumb' => '80x80',
				)
			)
		)
	);

UploadPackのフォルダ

すると、ファイルの保存は1アップロードにつき、1フォルダ。スタイルごとのファイルも同じフォルダに保存されます。

これ、マスター管理者しかアップロードしないケースならそれほど気にならないですが、ユーザーが自由にどんどんアップロードするプログラムなら、3000回アップロードされたら3000フォルダも作られてしまいます。

長く運用するなら、デフォルトのままではちょっと無理があると思います。1つのディレクトリにたくさんファイルやフォルダがあるのはちょっとした重さの原因になったり、管理上もよろしくないです。

たくさんファイルをアップロードするプログラムのフォルダ分散の基本

登録したidを指定した桁数までゼロ埋めして、さらに2桁、3桁くらいでフォルダ分散させます。今回は8桁でやってみます。

$cont_id = sprintf("%08d", $id);
$dir1 = substr($cont_id, 0, 2); //0埋めしたIDをスライスして、一定のファイルごとにディレクトリ分散
$dir2 = substr($cont_id, 2, 3); //一応これで、99999999以上は余裕でいけます。
$file = '/home/example.com/public_html/app/webroot/img/banner/'.$dir1.'/'.$dir2.'/'.$cont_id;

フォルダをちゃんと分散させたほうがいいんだな、ということを頭に入れて、CakePHP UploadPackプラグインで実際にファイルをイイ感じに分散したいと思います。

CakePHPでループ中にsaveしたい!

CakePHPでforeachのループ中にsaveしたい!

CakePHPのSaveメソッドはforeachなどのループ中に実行できるの?

「出来るみたいです」

CakePHPのもっとも典型的なSaveメソッドの使い方

CakePHPのsaveメソッドとは、読んで時のごとく

「データをデータベースに保存(save)するメソッド」です。

CakePHPブログチュートリアルだと

CakePHPブログチュートリアルだとこんな風になっています。

function add() {
        if (!empty($this->data)) {
//saveメソッド。saveしたらリダイレクトをしている
            if ($this->Post->save($this->data)) {
                $this->flash('Your post has been saved.','/posts');
            }
        }
    }
つまり、ループ中にsaveを実行すればいいわけだな!

あれれ?ループ中にsaveを繰り返し実行しても、最初のデータしか保存されない!!

何となくループ中にこのようにsaveメソッドを実行しただけでは なぜか最後のデータしか登録されず、全ループ分データが登録されません。

foreach($this->data as $data){
$this->Post->save($data);
}

同じような疑問を持つ方が他にいましたよ

回答としては、これを実行してね!とあります。

$this->Model->create(false);

どうやら、ループ中にsaveを行いたい場合は必ずcreateメソッドを実行してあげる必要があるようです。

// Create: idがセットされていない
$this->Recipe->create();
$this->Recipe->save($this->request->data);

// Update: idに整数値がセットされている
$this->Recipe->id = 2;
$this->Recipe->save($this->request->data);

createメソッドについては本家にも説明があります。

ループ中のsaveではcreateメソッドを実行するよ

そんなわけでこれらを踏まえてループ中に何度もsaveメソッドを実行するとこうなります。

foreach($this->data as $data){
//saveの前にcreateを実行
$this->Post->create(false);
$this->Post->save($data);
}

なぜfalseなのか。それはIDがないよ(新規登録だよ)と、いうことと同じことみたいです。なので、

foreach($this->data as $data){
//idはないよ、新規登録だよ という意味に。
$this->Post->id = false;
$this->Post->save($data);
}

updateの時はどうなるの?

今回の例だと、ループ中にidがセットされていないケースなので、updateの場合はhiddenでidを渡せばOKだよ!

ループでsaveするならcreateメソッド

よく覚えておこう。

CakePHP画像リサイズ最強プラグインUploadPackをCake初心者でも分かるよう徹底解説

CakePHP画像リサイズ最強プラグインUploadPackをCake初心者でも分かるよう徹底解説




先日仕事でCakePHPの画像リサイズで、プラグインのUploadPackを使いまして、日本語の詳細な解説が少ないことから自分自身躓いたこと、分かったことをCakePHPの初心者でも分かりやすく解説していきたいと思います。

UploadPackで出来ること

  • ファイルのデータベース管理(ファイルをアップする時にデータが登録されます)
  • ファイルタイプのバリデーション(指定された拡張子以外アップできない)
  • サイズ制限(○○キロバイト以下にして下さいなど)
  • ピクセルサイズ制限
  • 画像ファイルのリサイズ・複製

画像アップロードに関してはほぼ全てのバリデーションが備わっており、ピクセルサイズ指定はもちろん、指定した大きさにリサイズ・複製など画像のリサイズに関してもかゆい所に手が届く仕様になっており、画像のアップロードに関してはUploadPackプラグインに全て任せることが出来るので、ぜひCakePHP初心者にも覚えて頂きたいプラグインとなっております。

CakePHP使うなら、使わないともったいないプラグインの一つです。

UploadPackのダウンロード

CakePHP1.3と、CakePHP2系では利用するバージョンが違うようで、この点は注意しなければならないポイントです。

ダウンロード

CakePHP1.3版UploadPackのダウンロード

ファイルの解凍と設置

zipファイルをダウンロードして解凍すると「uploadpack-master」というフォルダが出現しますので、このフォルダ名を「upload_pack」というファイル名に必ずリネームして、「app/plugins」(Cake1.3) 「app/Plugin」(Cake2系)フォルダに設置します。

app直下のpluginsフォルダです。間違えないように設置して下さい

データベースの設計

データベースの設計については特にCakePHPのテーブル設計と何ら変わりませんが、この「UploadPack」を利用して画像を保存したいものは必ずフィールドを用意する必要があります。

img_file_name

画像を保存したいフィールドには 名称+_file_nameとする必要があり、
今回の例だとimg_file_nameとしました。
modelのvalidationを利用するので、必ず画像の保存したい種類だけフィールドを用意します。

数に制限はないので、何個でも設定することも出来ます。

ControllerとModelの準備

ではUploadPackプラグインを利用する準備に入ります。

app/Config/bootstrap.php

この指定はCake2系で行います。「bootstrap.php」の最終行に以下の記述を加えます。
これで設置したプラグインが自働で読み込まれます。

CakePlugin::loadAll();

プラグイン CakePHP Cookbook v2.x documentation

Model- image.php

imagesテーブルを使うためのImage Modelを作ります。
Cake2系ではファイル名が「Image.php」となるだけで、記述内容は全く一緒です。

リサイズしたい大きさや、バリデーションについては基本こちらのModelに記述してゆきます。
<?php
class Image extends AppModel{
}
?>

images_controller.php

まずはimages_controller.phpを以下のように記述しました。
Cake2では「ImagesController.php」というファイル名になるだけです。

一先ずCakePHPブログチュートリアルをほぼそのまま持ってきたような形になっていますが、UploadPackヘルパーの読み込みを忘れずに行ってください。

class ImagesController extends AppController {
  var $uses = array('Image');
//ヘルパーの読み込みを忘れずに行う
  var $helpers = array('Form','UploadPack.Upload');
function index() {
  $this->set('posts', $this->Image->find('all'));
  }
function add() {
  if (!empty($this->data)) {
  if ($this->Image->save($this->data)) {
  $this->redirect('/images');
  }
  }
  }
function edit($id = null) {
  $this->Image->id = $id;
  if (empty($this->data)) {
  $this->data = $this->Image->read();
  } else {
  if ($this->Image->save($this->data['Image'])) {
  $this->redirect('/images');
  }
  }
  }

}

View- Images/index.ctp

先ほど作ったImageControllerに対応するviewファイルを作成します。まずはindex.ctpだけ作って、画像追加用のフォームを含めたctpファイルは後ほど作ることにします。

<h1>UploadPack</h1>
<p>This is UploadPack Test!</p>
<h2><?php echo $this->Html->link("Add New Image", "/add/"); ?></h2>
<table>
<tr>
<th>ID</th><th>TITLE</th><th>IMAGE</th><th>CREATED</th><th>EDIT</th>
</tr>
<?php foreach($images as $image):?><tr>
<td><?php echo $image['Image']['id'];?></td><td><?php echo $image['Image']['title'];?></td><td><?php echo $image['Image']['img_file_name'];?></td><td><?php echo $image['Image']['created'];?></td><td><?php echo $this->Html->link("EDIT", "/edit/".$image['Image']['id']); ?></td></tr>
<?php endforeach;?>
</table>

画像保存用ディレクトリを準備

後で任意で画像保存のディレクトリは変更できるのですが、デフォルトで画像が保存されるディレクトリが決まっています。
webrootにuploadディレクトリを準備し、先ほど作ったModelの「テーブル名」と同じ名称のフォルダを準備して、パーミッションを777にしておきます。
今回だと以下のようになります。

app/webroot/upload/images/

(Modelと同じ名称ではなく、テーブルと同じ名称なので、「images」と複数系のフォルダになるわけですね。)

以上で準備が完了しました。
CakePHP2系と、1.3系と大きく作業内容が変わることはありません。bootstrap.phpにプラグインの読み込み指定がCakePHP2ではある点だけ注意してください。

それでは早速画像のアップロードを実装してきたいと思います。

CakePHPでデータをデフォルト値に戻す

CakePHPでデータをデフォルト値に戻す

CakePHPのapp_controller.phpのbeforeFilterでModelを使う
MysqlやPostgreSQLなんかのデータベースでデータのデフォルト値を設定しているケース、あると思います。

このデフォルト値を設定しているデータ、削除というていで、デフォルト値に戻したい、というのが今回の問題。

これをSQLでやる時は

Mysql

UPDATE personal SET total = DEFAULT(total);

CakePHPだとして、クエリー投げてもいいんだけどCakePHPチックに出来ないものかな~と考えていたら、出来ましたよ

CakePHP

function default($id = NULL){
$this->Model->id = $id;
$this->data = $this->Model->read();
$this->Model->saveField('your_field_name', DboSource::expression('DEFAULT(your_field_name)'));
}

ただこれ、クエリーで投げちゃったほうがシンプルですね。でも書き方がCakePHPのデータ変更の基本的なやり方とほぼ一緒なので、
何かのデータ変更の時のついでとかにナイス。今後もたまに使います。