@blog.justoneplanet.info

日々勉強

CakePHPでCSVのダウンロードをする

ベタに書いてもいいんだけどアレなんでヘルパーを使う。

■ヘルパー

vi app/views/helpers/csv.php

CSV Helper (PHP 5)のコードをペーストする。

コントローラ

App::import('Helper', 'Csv');
var $helpers = array(
    'Csv'
);

■データ挿入

Configure::write('debug', 0);
$this->layout = false;
$line = array('hogehoge', 'fugafuga', 'piyopiyo'); 
$csv->addRow($line);

■出力

echo $csv->render('data.csv', 'sjis', 'utf-8');

CakePHPのページャーにクエリを付加する

以下のようにoptionsに記述する。

$this->paginate = array(
    'page'   => 1,// 初期選択ページ
    'limit'  => 100,// 1ページあたりの件数
    'order'  => array('created' => 'desc'),// 順序
    'fields' => 'id, name, birthday, created',
    'joins'  => array(
        array(
            'type'       => 'LEFT',
            'alias'      => 'Data',
            'table'      => 'datas',
            'conditions' => "User.id = Data.users_id"
        ),
    ),
    'options'  => array(
        '?' => array(
            'param' => 'hogehoge'
        )
    )
);

CakePHPでデータを保存する

CakePHPでデータをDBに保存するときは新規登録でも更新でもsaveメソッドを使用する。

■新規登録

新規登録の際は以下のようにcreateメソッドを用いる。

$this->User->create();
$this->User->save($this->data, true, array('name', 'password'));

■更新

更新する際は以下のようにidに更新するレコードの値をセットする。

$this->User->id = 32;
$this->User->save($this->data, true, array('name', 'password'));

CakePHPとMySQLのON UPDATE CURRENT_TIMESTAMPを使う

CakePHPにおいてON UPDATE CURRENT_TIMESTAMPを使用すると、文字列としてCURRENT_TIMESTAMPを格納しようとするので、MySQL側でTIMESTAMPとして処理できない。以下のようにすることで対処できる。

■CURRENT_TIMESTAMP

modifiedというカラム名をつければCakeが自動的に更新日時をセットするので必ずしもON UPDATE CURRENT_TIMESTAMPをセットする必要はない。

■saveメソッド

CakePHP 2系からどうも挙動が変わったようで、1.3系の手法では上手くいかなくなった。以下のように、アップデートして欲しくないカラムにfalseを指定することで対応できる。

$data['modified'] = false;

CakePHP 1.3系

付けたい場合、saveメソッドで保存するカラムを指定することで対処できる。

$this->User->save($this->data, true, array('name', 'birthday'));

上述のようにすることで$this->dataにあらゆるキーとそれに紐付く値が格納されていても、保存されるのはnameカラムとbirthdayカラムのみである。これはアプリケーションをセキュアにする目的でも使用できるので、常時使用することをお勧めする。

CakePHPでログインフォームを作る

<?php
if($this->Session->check('Message.auth')){
    echo $this->Session->flash();// error msg
    echo $this->Session->flash('auth');// error msg
}
echo $form->create(
    'Admin',
    array(
        'url' => array(
            'controller' => 'users',
            'action'     => 'login'
        )
    )
);
?>
<div data-role="fieldcontain">
<dl>
<dt><label for="name">ユーザ名</label></dt>
<dd><?php
echo $form->input(
    'name',
    array(
        'div'   => false,
        'label' => false,
        'id'    => 'name'
    )
);
?></dd>
</dl>
</div>
<div data-role="fieldcontain">
<dl>
<dt><label for="password">パスワード</label></dt>
<dd><?php
echo $form->input(
    'password',
    array(
        'div'   => false,
        'label' => false,
        'id'    => 'password',
        'value' => ''
    )
);
?></dd>
</dl>
<p><?php
echo $form->submit(
    'ログイン',
    array(
        'div'   => false,
        'label' => false,
    )
);
?></p>
<?php
echo $form->end();
?>

MacのXAMPP環境でCakePHPのbakeを使う

パスを通してもいいんだけど個人的に以下のようにアプリのルートディレクトリから叩く。

./cake/console/cake bake

以下のようなエラーが発生する。

No such file or directory (trying to connect via unix:///tmp/mysql.sock)

ソケットが見つからないとのことなので、以下のコマンドでシンボリックリンクを生成して対応する。

ln -s /Applications/XAMPP/xamppfiles/var/mysql/mysql.sock /tmp/mysql.sock

関連

cd /var 
mkdir mysql
cd mysql
ln -s /tmp/mysql.sock mysql.sock

おまけ

本題とかなり違うけど、ちょっとbakeのメモ(●´ω`●)

スキーマの生成
./cake/console/cake schema generate
ACLの生成
./cake/console/cake schema create DbAcl