Posts tagged http
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 用のコントローラも作りたいときは携帯用コンポーネント、携帯用ヘルパーを使用する方法がよいかと思います。
CakePHP アクションでエレメントを出力する方法
2Rendering elements from controllers – cakebaker
上記エントリでエレメントのみを出力する方法が紹介されています。
バージョン1.2 の場合
app/views/elements/controller/hoge.thtml のエレメントを出力する場合
$this->render(DS.'elements'.DS.'controller'.DS.'hoge');
バージョン1.1 の場合
app/views/elements/controller/hoge.thtml のエレメントを出力する場合
$this->render(null, null, ELEMENTS.'controller'.DS.'hoge.thtml');
注意点
レイアウトは指定しないと default になります。Ajax などでエレメントのみを出力したい場合はレイアウトに ‘ajax’ を指定してhead タグや body タグが出力されないようにする必要があります。
v1.2$this->render(DS.'elements'.DS.'controller'.DS.'hoge', 'ajax');
v1.1$this->render(null, 'ajax', ELEMENTS."controller".DS."hoge.thtml");
イケア BRÄDA ラップトップサポート(膝上 PC ボード)購入
1IKEA | テーブル&デスク | コンピューター ワークステーション | BRÄDA | ラップトップサポート
[を] IKEA の膝上 PC ボードは良い! で紹介されていたイケアの PC ボードがすごく気になっていた。これは下の部分がビーズクッションになっていて、上の部分が PC を置きやすいように天板がついているクッションです。
昨日イケア港北にクリスマスツリーを返しに行ったので、そのツリー代の返金のギフトカードで PC ボードを買いました。昨年購入したもみの木のツリーをイケアに持っていくと代金1990円をギフトカードで返金してくれるというものです。ギフトカードの額とPC ボードの額が同じなのでちょうどよかった!
クッション系ものもなので1階のマーケットプレイスにおいてあるのだろうと思い、マーケットプレイスのクッションのところや事務系のものがあるところを探したのですが見つからない。イケアスタッフに聞いてみると2階のオフィス家具のところにおいてあるとのこと。ショートカットしつつ2階のオフィス家具のところに行き探すと、赤タグ(っていうのかな、セルフサービスで1階の倉庫みたなところから自分で商品を出すやつ)がついている。それほど大きなものでもないけど、そういう商品なんですね。。。ショートカットしつつもイケアを2周もしてしまいました。
購入を考えている方は注意してくださいね!
使い心地はいいですねー!いままでソファーで作業しているときは薄いクッションを足と PC の間に入れていたのですが、やはりフラットになると作業しやすいです。
左サイドに携帯電話を入れられるポケットもついています。私は携帯よりもペンやマウスなど入れようと思います。
iTunes ちょっと便利なショートカット
1iTunes を使用していて検索にカーソルを移動させるのにマウスを使用するのが面倒だったので Ctrl+F とかしてみたけどダメだったので、改めて調べてみたところ Ctrl+Alt+F で OK でした。
そこで iTunes のショートカットで便利そうなものをメモ代わりにリストアップしてみました。
- 選択した曲を再生
- Enter
- 選択した曲を再生/停止
- Space
- 早戻し・早送り
- Ctrl+Alt+← or Ctrl+Alt+→
- 前の曲へ・次の曲へ移動する
- ← or →
- ミニプレイヤに切り替え
- Ctrl+M
- 検索フィールドを選択
- Ctrl+Alt+F
- 音量を上げる・下げる
- ↑ or ↓
- ミュートする
- Ctrl+Alt+↓
- ブラウザの表示・非表示
- Ctrl+B
- iTunes ヘルプを開く
- Ctrl+?
- iTunes を終了する
- Ctrl+W
なにげにスペースで再生・停止が切り替えられるのが便利でした。
その他のショートカットは Ctrl+? でヘルプを開きショートカットのページを見ると詳しく載っています。
または、アップル – iTunes – Hot Tips – iTunesキーボードショートカット でも詳しく載っています。
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シリーズ)
.htaccess で error_reporting を設定するときの注意点
5.htaccess で PHP が出力するエラー表示を制御するには E_ALL などの定数は使えないので、ビット値で指定する必要があります。
E_ALL & ~E_NOTICE を設定する場合
php.ini
error_reporting = E_ALL & ~E_NOTICE
php コード内
error_reporting(E_ALL ^ E_NOTICE);
.htaccess
php_value error_reporting 6135
error_reporting に設定する値は PHP: error_reporting – Manual を参照するといいでしょう。
値 | 定数 |
---|---|
1 | E_ERROR |
2 | E_WARNING |
4 | E_PARSE |
8 | E_NOTICE |
16 | E_CORE_ERROR |
32 | E_CORE_WARNING |
64 | E_COMPILE_ERROR |
128 | E_COMPILE_WARNING |
256 | E_USER_ERROR |
512 | E_USER_WARNING |
1024 | E_USER_NOTICE |
6143 | E_ALL |
2048 | E_STRICT |
4096 | E_RECOVERABLE_ERROR |
ちなみに E_ALL & ~E_NOTICE の値が 6135 になる理由は E_ALL の値が 6143、E_NOTICE の値が 8 なので 6143-8=6135 になります。(または E_NOTICE と E_STRICT 以外の値を足した数が 6135 になります。
私は開発中は E_NOTICE も表示するようにしていますが、結構表示させない人が多いようで人のコードを修正するときなど Notice エラーが出て困ることがあります。E_NOTICE を表示するようにしておくと未定義の変数などバグの元になりやすいものを教えてくれるのでお勧めです。
また、開発終了して本番運用するときにはブラウザにエラーを出力しないように
error_reporting(0);
を設定しておくことを忘れずに!
その際も PHP のエラーはエラーログに記録されるようにしておかないのも忘れずに。
CakePHP JQuery ヘルパー
3JQuery helper for CakePHP ( PQuery port ) at NGCoders
CakePHP から JQuery を簡単に使うことができます。
正確には PQuery ヘルパーかもしれません。PQuery は JQuery を PHP から簡単に使用するライブラリで PQuery ヘルパーと同じ開発者が開発しています。
参考:PQuery – PHP and JQuery at NGCoders
インストール
JQuery helper for CakePHP ( PQuery port ) at NGCoders から JQuery ヘルパーをダウンロードし、解凍した pquery.php を /app/views/helpers にコピーします。
そのほかに jquery.js ファイルも必要になります。こちらもダウンロードして /app/webroot/js にコピーします。
コントローラ
Pquery ヘルパーと Javascritp ヘルパーを使用します
var $helpers = array('Pquery', 'Javascript');
ビュー
jquery.js の読み込み
<?php echo $javascript->link('jquery.js'); ?>
使用例
トグルボタン
<div id='msg'>Message...</div> <?php echo $pquery->link_to_function('toggle', $pquery->toggle('#msg'));?>
フォームで送信された内容により HTML を更新
入力したテキストを /controller/action/ に GET で送信し、id=idtoupdate に受け取った HTML を表示する
<?php echo $pquery->form_remote_tag(array('url'=>'/controller/action/','update'=>'#idtoupdate'));?> <input type='text' name='field' /> <input type='submit' /> <div id='idtoupdate'></div>
pquery.php を見ると色々なメソッドがあります。使い方はソースを見ればすぐに分かると思います。
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>
scriptaculous.js を使って並び替えを行う
2JavaScript の読み込み
まず prototype.js と scriptaculous.js を読み込む
<script type="text/javascript" src="prototype.js"></script> <script type="text/javascript" src="scriptaculous.js"></script>
ソートするリストを作成する
ここでのポイントはドラッグさせたい要素に drag_1 のように「共通の名前+アンダバー+数字」を付けることです。
<ul id="sortarea"> <li id="drag_1">A1</li> <li id="drag_2">A2</li> <li id="drag_3">A3</li> <li id="drag_4">A4</li> <li id="drag_5">A5</li> <li id="drag_6">A6</li> <li id="drag_7">A7</li> <li id="drag_8">A8</li> <li id="drag_9">A9</li> </ul>
ソートする JavaScript コード
ソートするエリアとソートする要素を定義した後で実際にソートするための JavaScript コードを書く。このコードがソートさせたい要素よりも前に書くとエラーになるので注意。
<script type="text/javascript" language="javascript"> // <![CDATA[ Sortable.create("sortarea",{ onUpdate:function(){ new Ajax.Updater( 'sortarea', '/path/to/phpcode', { asynchronous:true, evalScripts:true, parameters:Sortable.serialize("sortarea") } ); } }); // ]]> </script>
onUpdate でソート結果をPHP に送りデータベースなりに反映させる。
データベースに反映などが必要なければ、onUpdate は不要です。
デモ
これを実際に使用した例が下記になります。
#sortarea { width: 350px; border: 1px solid #000; } #sortarea li { cursor: default; }
- LIST1
- LIST2
- LIST3
- LIST4
- LIST5
- LIST6
- LIST7
- LIST8
- LIST9