Posts tagged log
Eclipse でコマンドラインを簡単に開くプラグイン
0bakeするのに地味に便利なEclipseプラグイン – Writing Some Code
CakePHP で開発を行うときに最近 PDT を使用しています。CakePHP のbake をするときなどコマンドラインから行いますが、Eclipse のエクスプローラからディレクトリを指定して直接コマンドラインを開いてくれるプラグインが Writing Some Code さんで紹介されていました。
コマンドライン以外でもエクスプローラでも開けるので結構便利です。Eclipse のエクスプローラから開きたいフォルダを右クリックして「フォルダを開く」の中にあるメニューを選択するだけでエクスプローラやコマンドラインを開けます。
CakePHP1.2 モデルのビヘイビアを動的に切り替える
0CakePHP 1.2 から追加されたビヘイビアが動的に追加、削除できるようになるようです。
Attaching and detaching model behaviors on-the-fly – cakebaker
以前、CakePHP メール送信許可フラグによってメールを一斉送信するメールビヘイビア を書いたときに初めてビヘイビアというのを使ったのですが、ビヘイビアというのはうまく使えばかなり便利かなと思いました。
モデルに
var $actsAs = array('BehaviorName');
と書くことにより使えるようになるのですが、現在開発中の CakePHP1.2 でビヘイビアがモデルに attach , detach できるようになるようです。
ダウンロードできる最新の CakePHP 1.2.0.6311-beta にはまだ入っていませんが、以下より model.php のソースを手に入れて
cake/libs/model/model.php
に入れることによって試すことができます。
model.php のソース
モデルにビヘイビアをアタッチ、デタッチするのは以下のようになります。
$this->Model->attach('BehaviorName'); $this->Model->dettach('BehaviorName');
CakePHP jQuery を使用した Ajax ファイルアップロード
6下記ページを参考にさせていただきました。
“jQueryを使ったAjaxファイルアップロード” フォーラム – CakePHP Users in Japan
David Golding Design Blog -
上記ページでは jQuery を使用してテキストファイルをアップロードしてテキストの内容を表示するというものですが、画像をアップロードしてアップロードした画像をフォームの下に Ajax を利用して表示するというのをやってみました。
jQuery 使用準備
jquery.js と jquery.form.js を app/webroot/js/ 以下に配置します。
アップロードするビューで上記 JavaScript ファイルを読み込むため下記コードをビューに追加します。
<?php echo $javascript->link(array('jquery.js','jquery.form.js')); ?>
ビューにアップロードするフォームを作成する
今回は users コントローラの form アクションでフォームを表示します。Ajax の処理を行うのは users コントローラの upload アクションです。
views/users/form.ctp
<h1>upload test</h1> <?php echo $form->create('User',array('name'=>'uploadForm','id'=>'uploadForm','type'=>'file'));?> <?php echo $form->input('upload_file',array('label'=>'Upload Text File ','type'=>'file'));?> <?php echo $form->button('アップロード',array('onClick'=>'$('#uploadForm').ajaxSubmit({target: '#uploadFile',url: '/users/upload'}); return false;'));?> </form> <div id="uploadFile"></div>
コントローラの処理
views/users/form.ctp から「アップロード」ボタンを押すと users/upload アクションの $this->data にアップロードファイルの情報が入ってきます。ここでは mime タイプによって JPEG ファイルのみをアップロードできるようにしています。アップロード後に views/users/upload.ctp を出力します。
function upload() { if (!$this->data['User']['upload_file']) { $this->set('error','アップロードするファイルを選択してください'); $this->render('upload','ajax'); } else { if ($this->data['User']['upload_file']['type'] != 'image/jpeg') { $this->set('error','アップロードできる画像は JPEG のみです'); $this->render('upload','ajax'); } else { $filename = '/files/'.intval(rand()).'.jpg'; rename($this->data['User']['upload_file']['tmp_name'], WWW_ROOT.$filename); $this->set('filename', $filename); $this->render('upload','ajax'); } } }
Ajax が返すビューを作成する
/users/upload で処理した結果を返すビューを作成します。今回は veiws/users/upload.ctp として作成しました。ここで img タグによりアップロードしたファイルを表示しています。
<?php if (!empty($error)): ?> <p><?php echo $error;?></p> <?php else: ?> <p>Upload successful</p> <?php echo $html->image($filename); ?> <?php endif; ?>
以上で jQuery を使用して Ajax で画像のアップロードができます。
CakePHP HTML ヘルパーで出力するラジオボタンにラベルを付ける方法
2CakePHP 1.1 の HTML ヘルパーが出力するラジオボタンにはラベルが付いていないのでラジオボタン以外の文字の部分をクリックしてもチェックができません。そこで CakePHP HTML ヘルパーで出力されるタグを変更する方法 のエントリーの方法を使用してラジオボタンにラベルを付加してみました。
app/config/tags.ini.php
radio = <label><input type="radio" name="data[%s][%s]" id="%s" %s />%s</label>
あとは普通に $html->radio() を使用して出力すればラベルが付加されています。
CakePHP 1.2 ではラジオボタンにラベルがついた状態で出力されていました。
CakePHP 1.2 の deleteAll
1CakePHP 1.2 の saveAll その1
CakePHP 1.2 の saveAll その2
のエントリーを書いているときに deleteAll というメソッドがあり気になったので調べてみました。
CakePHP 1.1 で開発時に delete するときに ID を指定するしか方法がなく、ある条件でまとめて削除したいときなどは findAll してからループで delete していました。このときも条件を指定して削除する方法がないかとソースを調べたのですがありませんでした。
使い方は非常に簡単です。findAll のように条件を指定して deleteAll を実行するだけです。
$conditions = array('User.name'=>'suzuki'); if ($this->User->deleteAll($conditions)) { $this->Session->setFlash('削除しました'); } else { $this->Session->setFlash('削除に失敗しました'); }
実行される SQL は以下のような感じです。
SELECT `User`.`id` FROM `users` AS `User` WHERE `User`.`name` = 'suzuki' DELETE `User` FROM `users` AS `User` WHERE `User`.`id` IN (8, 10)
SELECT で条件に合う ID を抽出して WHERE IN で DELETE しています。
ただし CakePHP1.2 の削除ですが、MySQL 4.0 では SQL の DELETE 文でエラーになってしまいます。
MySQL 5.0 ではエラーにならずに削除できました。エラーになる原因は “DELETE” の後ろにテーブルのエイリアス名があるためです。
これは “cakephp1.2でのPostgreSQLエラー。” フォーラム – CakePHP Users in Japan でもあるように既に修正されているようですが、昨日 CakePHP のサイトからダウンロードした CakePHP 1.2.0.6311 beta ではまだ修正されていないようです。
CakePHP 1.2 の saveAll その2
3CakePHP 1.2 の saveAll その1 では同一モデルへの複数レコードを saveAll で保存しました。今回はアソシエーションのモデルのデータを saveAll で保存する方法です。
アソシエーションのモデルのデータを保存
モデル
user.php
< ?php class User extends AppModel { var $name = 'User'; var $hasMany = array('Comment'); } ?>
comment.php
< ?php class Comment extends AppModel { var $name = 'Comment'; var $belongsTo = array('User'); } ?>
コントローラ
users_controller.php
function add() { if (!empty($this->data)) { $this->cleanUpFields(); $this->User->create(); if ($this->User->saveAll($this->data)===false) { $this->Session->setFlash('保存に失敗しました); } else { $this->Session->setFlash('保存しました'); } $this->redirect(array('action'=>'index'), null, true); } }
ビュー
users/add.ctp
< ?php echo $form->create('User');?> < ?php echo $form->input('User.name');?> < ?php echo $form->input('Comment.body'); ?> < ?php echo $form->end('Submit');?>
CakePHP 1.2 の saveAll その1 の同一モデルへの複数レコードの保存よりも使い道は多いのではないかと思います。
追記
このエントリーは CakePHP 1.2.0.6311 beta で検証しています。
CakePHP 携帯専用サイトを作成する
6CakePHP で携帯用のページを作成する際に CakePHP 携帯用ビューを表示する | Shin x blog のページが大変参考になります。
しかし、/m/ のような URL ではなく携帯専用サイトにしたかったので下記のような方法で実装しました。なお、PC でアクセスしたときには /pc.html という静的なページを表示するようにしてあります。
また、PC、携帯の振り分けはユーザエージェントで行っています。
携帯用コンポーネント
app/controller/component/mobile.php を作成し、PEAR の Net_UserAgent_Mobile を使用しています。このコンポーネントでユーザエージェントを判定して PC だったら pc.html へリダイレクトします。
PEAR の Net_UserAgent_Mobile はサーバにインストールしてもいいのですが、今回は app/vendors/ ディレクトリに入れました。また、app/vendors/ に include_path を通すために、CakePHPガイドブック を参考に include_path_vendors.php を作成しました。
app/controller/component/mobile.php
vendor("include_path_vendors"); vendor("Net/UserAgent/Mobile"); class MobileComponent extends Object { function startup(&$controller) { $this->controller = $controller; $mobile = &Net_UserAgent_Mobile::factory(); if ($mobile->isNonMobile()) { $this->controller->redirect("/pc.html"); } } }
今回は簡単に PC か携帯でアクセス振り分けているだけですが、画面の大きさやキャリアなどによって色々な処理の振り分けが考えられます。
携帯用ヘルパー
app/views/helper/mobile.php を作成して HTML 出力時に文字コードを Shift-JIS へ変換します。ヘルパーの afterRender メソッドを使用しています。
class MobileHelper extends Helper { function afterRender() { $out = ob_get_clean(); $out = mb_convert_kana($out, "rak", "UTF-8"); $out = mb_convert_encoding($out, "SJIS", "UTF-8"); ob_start(); echo $out; } }
コントローラで携帯用コンポーネント、ヘルパーを使用する
app/app_controller.php で携帯用コンポーネントと携帯用ヘルパーを使用します。
var $components = array('Mobile'); var $helpers = array('Mobile');
app_controller.php で設定しておけば全てのコントローラで共通に読み込むので各コントローラにその都度書く必要がなくなります。DB の管理画面など PC 用のコントローラが必要な場合は各コントローラに書いた方がいいでしょう。今回は完全に携帯用にしています。PC 用の管理画面もあるのですが、サブドメインを変えて app ディレクトリも違うものを使用しています。
また、各コントローラ内で設定するタイトルの文字コードを変換しないといけないので、app_controller.php の beforeRenderメソッドでタイトルの文字コードを変換します。
function beforeRender() { $this->pageTitle = mb_convert_encoding($this->pageTitle, "SJIS", "UTF-8"); parent::beforeRender(); }
以上で携帯専用のサイトが CakePHP で作成できました。
コントローラの afterFilter で文字コードを変換する方法
コントローラの afterFilter で文字コードを変換することもできます。
app/controller.php
function afterFilter() { parent::afterFilter(); $out = ob_get_clean(); $out = mb_convert_kana($out, "rak", "UTF-8"); $out = mb_convert_encoding($out, "SJIS", "UTF-8"); ob_start(); echo $out; }
この場合は、beforeRender でのタイトルの文字コード変換の処理が必要ないのと、携帯用ヘルパーは必要ありません。
PC 用のコントローラも作りたいときは携帯用コンポーネント、携帯用ヘルパーを使用する方法がよいかと思います。
イケア BRÄDA ラップトップサポート(膝上 PC ボード)購入
1IKEA | テーブル&デスク | コンピューター ワークステーション | BRÄDA | ラップトップサポート
[を] IKEA の膝上 PC ボードは良い! で紹介されていたイケアの PC ボードがすごく気になっていた。これは下の部分がビーズクッションになっていて、上の部分が PC を置きやすいように天板がついているクッションです。
昨日イケア港北にクリスマスツリーを返しに行ったので、そのツリー代の返金のギフトカードで PC ボードを買いました。昨年購入したもみの木のツリーをイケアに持っていくと代金1990円をギフトカードで返金してくれるというものです。ギフトカードの額とPC ボードの額が同じなのでちょうどよかった!
クッション系ものもなので1階のマーケットプレイスにおいてあるのだろうと思い、マーケットプレイスのクッションのところや事務系のものがあるところを探したのですが見つからない。イケアスタッフに聞いてみると2階のオフィス家具のところにおいてあるとのこと。ショートカットしつつ2階のオフィス家具のところに行き探すと、赤タグ(っていうのかな、セルフサービスで1階の倉庫みたなところから自分で商品を出すやつ)がついている。それほど大きなものでもないけど、そういう商品なんですね。。。ショートカットしつつもイケアを2周もしてしまいました。
購入を考えている方は注意してくださいね!
使い心地はいいですねー!いままでソファーで作業しているときは薄いクッションを足と PC の間に入れていたのですが、やはりフラットになると作業しやすいです。
左サイドに携帯電話を入れられるポケットもついています。私は携帯よりもペンやマウスなど入れようと思います。
12月に読んだ本
0先月、宣言(11月に読んだ本 )したように少し小説を読みました。
2冊のみですが、どちらも文庫本で700ページ前後なので読み応えはありました。「幻夜」は「白夜行 」の続編のようで白夜行に迫る面白さで読むのが止まりませんでした。
「最悪」は奥田英郎の最初の頃の作品なので、イラブ先生シリーズやサウスバウンドなどにはかないませんが、引き込まれる作品でした。
幻夜
最悪 (講談社文庫)
あなたが年収1000万円稼げない理由。―給料氷河期を勝ち残るキャリア・デザイン (幻冬舎新書 た 3-1)
【超】WORK HACKS!
起業家2.0―次世代ベンチャー9組の物語
効率が10倍アップする新・知的生産術―自分をグーグル化する方法
勝間さんの本はどれもはずれがなくていいですね。読んでいるだけでやる気が出てきます。(それだけで実践しないと意味ないですが)巻末のお勧め本がかなりいいです。これからの読書の参考にしていきます。早速、今月は「非常識な成功法則―お金と自由をもたらす8つの習慣」をリストを参考に読んでみました。
読みならがメモしたことをいくつかリストアップしておきます。
- 情報こそが現代の通貨である
- 資本主義の本質は賢くない人から賢い人へお金が移動する仕組み
- 情報の発信者になれば情報がラクに収集できるようになる
- 自分が得意なことに集中する
- Not To Do List を作成する
- まずは見返りを求めずに情報を発信し続ける
金融商品にだまされるな!
金持ちの床屋さん
非常識な成功法則―お金と自由をもたらす8つの習慣
レバレッジ人脈術
チーズはどこへ消えた?
ザ・マインドマップ
WEB+DB PRESS Vol.42
人を出し抜く速読術―要領よく生きてるヤツは知っている (凄ビジ・シリーズ 3)
キラー・リーディング 「仕事脳」が劇的に回り出す最強の読書法 (JBシリーズ)
scriptaculous.js を使ってマトリックス状に配置した要素を並び替える
1scriptaculous.js を使って並び替えを行う を応用して格子状に並んだ要素を並び替える例です。基本的な部分はリスト形式の並び替えと同じですので省略します。
最初にデモ、その後にコードを紹介します。
デモ
#sortarea { width: 350px; } #sortarea div { float: left; width: 100px; height: 70px; border: 1px solid #000; margin: 5px; text-align: center; padding-top: 30px; cursor: default; }
ソートする要素
前回は li タグで要素を定義しましたが、今回は div タグで定義しました。
CSS で格子状に並ぶようにしています。
<style> #sortarea { width: 350px; } #sortarea div { float: left; width: 100px; height: 70px; border: 1px solid #000; margin: 5px; text-align: center; padding-top: 30px; cursor: default; } </style> <div id="sortarea"> <div id="drag_1">A1</div> <div id="drag_2">A2</div> <div id="drag_3">A3</div> <div id="drag_4">A4</div> <div id="drag_5">A5</div> <div id="drag_6">A6</div> <div id="drag_7">A7</div> <div id="drag_8">A8</div> <div id="drag_9">A9</div> </div>
ソートする JavaScript コード
Sortable.create の option に overlap:’horizontal’ を指定しなくても並び替えはできますが、少しぎこちない感じになりますので、指定しておいたほうがいいでしょう。
<script type="text/javascript" language="javascript"> // <![CDATA[ Sortable.create("sortarea",{ tag:'div',overlap:'horizontal',constraint: false, }); // ]]> </script>