CakePHPでBluetrip(CSSフレームワーク)を使う

BluetripのCSSファイルをapp/webroot/cssにコピーしておく。
app/views/layouts/default.ctpを作成し、レイアウトを変更する。default.ctpは以下のようなコードになるかと思います。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title><?php echo $title_for_layout?></title>
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
<?php echo $html->css('screen', null, array('media' => 'screen, projection')); ?>
<?php echo $html->css('print', null, array('media' => 'print')); ?>
<!--[if IE]>
<?php echo $html->css('ie', null, array('media' => 'screen, projection')); ?>
<![endif]-->
<?php echo $html->css('style', array('media' => 'screen, projection')); ?>
<?php echo $scripts_for_layout ?>
</head>
<body>

<?php echo $content_for_layout ?>

</body>
</html>

CakePHPのAuthコンポーネントでメールアドレス&パスワード認証にする

標準ではusername, passwordで認証する形になっているAuth componentですが、ログインする際にメールアドレスを使った方が忘れにくい上、打ち間違いが少なくユーザーにとって良いと思います。
Auth コンポーネントの変数を設定する :: 認証 :: 主要なコンポーネント :: マニュアル :: 1.3コレクション

app/controllers/users_controller.php

<?php
function beforeFilter(){
        //認証に使うペアをemail, passwordに変更
        $this->Auth->fields = array(
            'username' => 'email',
            'password' => 'password'
        );
    }

app/views/users/login.ctp

<?php
if  ($session->check('Message.auth')) {
    $session->flash('auth');
}

echo $form->create('User', array('action' => 'login'));
echo $form->input('email'); //変更部分
echo $form->input('password');
echo $form->end('Login');

app/views/users/register.ctp

<?php
echo $form->create('User');
echo $form->input('email'); //変更部分
echo $form->input('username');
echo $form->input('password');
echo $form->input('password_confirm', array('type' => 'password'));
echo $form->end('Register');

コードのフォントが小さくなってしまう問題解消のためにブログのデザインを変更しました

Before

After

はてなダイアリーではプログラムのソースコードを色づけしてきれいに見せることができます。
ソースコードを色付けして記述する(シンタックス・ハイライト) - はてなダイアリーのヘルプ
しかし、ブログのデザインによってはこのシンタックス・ハイライトを使った部分のフォントが妙に小さくなってしまう問題がありました。
そこで、hatena2-darkgrayというデザインに変更したところ、通常のフォントサイズになりました。

CakePHPでAuthコンポーネントを利用して会員認証を実装する方法

CakePHPで会員制サイトを作り始めました。Authコンポーネントは使ったことがなかったので、備忘録代わりに流れを書いておきます。

データベースにusersテーブルを作成する

フィールドはid, username, password, modified, createdを作成

app/controller/app_controller.php

すべてのコントローラでAuthコンポーネントを使うためにAppControllerを定義します。

<?php
class AppController extends Controller{
    var $components = array('Auth');
}

app/controllers/users_controller.php

アクションを定義します。実装が空ですが、Authコンポーネントがなんとかしてくれます。

<?php
class UsersController extends AppController{
    var $name = 'Users';
    
    function login(){
        //empty for auth component
    }
    
    function logout(){
        $this->redirect($this->Auth->logout());
    }
}

app/views/users/login.ctp

ビューを実装します。

<?php
if  ($session->check('Message.auth')) {
    $session->flash('auth');
}

echo $form->create('User', array('action' => 'login'));
echo $form->input('username');
echo $form->input('password');
echo $form->end('Login');

ここまでで、/users/loginにアクセスすればログイン画面は表示できます。
次は、新規登録画面です。

app/models/user.php

Userモデルを定義していなかったので作成します。

<?php
class User extends AppModel{
    var $name = 'User';
}

app/controllers/users_controller.php

コントローラに追加してください。

<?php
function register(){
    //debug('register');
    if(isset($this->data)){
        //debug('found data');

        if($this->data['User']['password'] == $this->Auth->password($this->data['User']['password_confirm'])){
            $this->User->create();
            $this->User->save($this->data);
            
            $this->flash("ユーザー" . $this->data['User']['username'] . 'を登録しました', '/users/login');
        }else{
            //パスワードと確認用パスワードが一致しなかった場合
            $this->flash('パスワードと確認用パスワードが一致していません', '/users/register');
        }
    }
}

app/views/users/register.ctp

<?php
echo $form->create('User');
echo $form->input('username');
echo $form->input('password');
echo $form->input('password_confirm', array('type' => 'password'));
echo $form->end('Register');

とりあえず、これで動作するかと思います。
次はvalidationを行おうかと思います。
なにか不備がありましたら、コメント欄によろしくお願いします。

ブログにスクリーンショットとか貼り付けるためにFlickrを始めてみた


いまさらFlickr始めてみました。登録は簡単で、Yahoo!(America)のアカウントを取得するか、Facebook or Googleのアカウントとひも付けするか、どちらかでした。
スクリーンをキャプチャしてそのままFlickrに送れるアプリケーションを探していたところ、「Jing」というアプリケーションがよさそう。
TechSmith | Jing, instant screenshots and screencasts, home
特に難しいこともなく、アップロードできました。Flickrを利用するには設定でFlickrボタンを追加する必要があります。Clipboard ContentsをEmbed Codeにしておくと、クリップボードのHTMLをペーストするだけで済むので、非常に便利です。

ブックマークバーを最大限に活用する方法

chrome_favicon
この方法はおそらくChrome以外のブラウザでも活用できると思います。ありきたりといえばありきたりな方法なので既にやっている人も多いと思いますが、紹介してみます

  1. フォルダを作成し、その中にブックマークを整理する

ブックマークバーは狭いので、ブックマークを生身のまま配置するとすぐいっぱいになってしまいます。私は、My Site, SNS, English...のようにフォルダを作成し整理しています。2階層にしてもよいでしょう。

  1. よく使うブックマークはフォルダに入れない

フォルダに入れると1クリック動作が増えてしまいます。よく使うサイト(Gmailなど)はフォルダに入れずルート階層に並べておくと良いでしょう。

  1. ルート階層にあるブックマークはタイトルを消す

最近のWebサイトはFaviconを用意していることがほとんどです。アイコンを見ればどのサイトだか分かるのだったら、文字でサイト名が書いて無くても大丈夫ですよね。
[右クリック]->[編集...]->[名前]を空欄にしましょう。すっきりして、広々使えますよ。

CakePHPでページネーションをする


たいていのウェブサイトではページネーションをする必要が出てくると思います。
ページネーションの処理は自分で実装するのは意外に大変ですので、CakePHPに頼るのがよいでしょう。CakePHPにはPagenateメソッドとPagenatorヘルパーという力強い機能があります。
CakePHPでページネーションを実装する上で参考になるページを集めました。

ページ付け(Pagination) :: CakePHPによる作業の定石 :: マニュアル :: 1.3コレクション

CakePHP公式のリファレンスです。わかりやすく書かれているのでまずこれを読むのがよいかと。

CakePHP Note > コントローラー > ページング | GARACTER

上記2ページには載っていない情報があります。うまくまとまっています。

Pagination of data from a HABTM relationship - cakebaker

英語です。HABTMのモデルでページネーションをする際には参考になります。
たとえば、RecipeモデルとTagがあった際、この2つのモデルは互いに複数のRecipe, Tagと関連を持ちますが、ある特定のTagを持つRecipeを出力しページネーションしたい、場合などです。