2012年9月19日水曜日

[CakePHP]AppControllerでコンポーネント設定するとsessionコンポーネントが使えない。

 AppControllerにて下記のようにAuthコンポーネントを設定したところ、

var $components = array('Auth');

以下のようなエラーが出た。
Notice (8): Undefined property: UsersController::$Session [APP\controllers\users_controller.php, line 31]
Fatal error:  Call to a member function write() on a non-object in C:\xampp\htdocs\rakuzon\app\controllers\users_controller.php 
on line 31

以下のサイトによると、どうやらバグっているらしく、AppControllerにコンポーネトを設定すると
Controllerにで設定されたコンポーネントとマージされないらしい。

CakePHPのController->__mergeVars()でcomponentsがマージされてない?


仕方がないので、AppControllerでAuthとsession両方設定しよう。

※CakePHPのバージョンはcakephp-cakephp-1.3.15-9-gacd25c3.zip

2012年9月14日金曜日

[API]楽天の商品URLから、商品コードを取得するには

うわー、これでいけそう。

http://blog.fkoji.com/2012/03130824.html

 プログラムで商品ページのHTMLを取得し、
javascript内に記述されている商品コードを取得。

それができたら、商品検索APIで商品の詳細情報を取得することができるね。

検索とかだけでAPI使うのはつまらないから、
これができれば面白いことができそう。

2012年9月13日木曜日

[Excel]Excelで負の時間を表示させるには

Excelで時間計算をしていて、引き算等で負の値になってしまうことがあるんだけど、
『負 の日付または時間は####と表示されます。』というエラーが出て表示できない。
 
 EXCELで負の日付や時間をエラーにならずに表示する方法はありますか?表示形...

ただ、上記の紹介を参考に
 ツール→オプション→計算方法→ブックオプション→「1904年から計算する」にチェックすると、
負の時間も表示されるようになった。

ただし、日付を入力しているセルは4年と1日プラスされた日付となってしまうので、
修正が必要。

2012年9月12日水曜日

Thinkpad x61sメモリ1Gから4Gへ増設した。

 以下のサイトを参考に増設を行った。

Thinkpad X61sのメモリ増設

ほとんどこのサイトと同じ内容なので書く必要もないかもしれないが、
記念として書いておく。

ctrl+alt+del→タスクマネージャで事前のメモリの大きさを確認。


まず電源ケーブルと電池をはずす。そしてねじ(以下の赤丸部分)をはずしてメモリのふたを外す。



開いたらこんな感じ。



今回購入したメモリはこれ。



Amazonだとこちらね。


メモリの端っこから囲い込んでいるアームみたいなもの(赤丸部分)を外側に引っ張ると、
かちっと持ち上がってはずれる。



新しいのを入れるときは斜めからそっと入れ込めばカチッとアームがつかんでくれる。


PCをさっそく起動してメモリの大きさ確認。





おお!3G越えですね!
動きもサクサクしてます!!








[CakePHP]キーワード検索時にpaginateするために

テキストのフォームからキーワードの検索して その結果をpaginateしようとしていたが、
一番最初の結果は正常に表示されるが、 違うページに遷移しようとすると
エラーとなってしまっていた。 理由と対策は以下で説明されている。

 1.2・検索結果をpaginateする方法

 なぜか検索ワード等のポストで受けたパラメータは次の遷移に
引き継がれないとのこと。
 めんどくさい。。。キーワード検索結果でペイジネイション使う人多いと思うのに、
あまり説明されていない。

リンクのURLの最後に引数という形での検索であれば、
どうやら勝手に次の遷移にパラメータが引き継がれるみたいだね。



[CakePHP]tmp配下の管理の仕方がわからない

app/tmp配下は動的に生成されるキャッシュなので サブバージョンで管理したくない。

 Subversion利用の際、tmpディレクトリを外す

にしたがって設定したが、eclipse上だとどうしても「変化しているマーク 」がでてしまう。

しかもeclipseの「svn:ignoreに追加」がなぜdisableになっているのかもわからない。
これが押せればいけそうなんだけどな。
とりあえず、コミットする前にtmp配下のキャッシュは削除するようにするしか
ないかな。面倒くさいな。
※CakePHPのバージョンはcakephp-cakephp-1.3.15-9-gacd25c3.zip

[CakePHP]validationエラーを入力元の画面に出す方法

例えば、TOPページにある検索ボックスの未入力エラーのメッセージなんかは、
違うページに遷移するのではなく、TOPページのその検索ボックスのすぐそばに
メッセージを出したい場合、以下のようにする。

//in the themes_controller.php
    public function search(){
        if(!empty($this->data)){
            $this->Theme->set($this->data);
            if($this->Theme->validates()){
                //入力エラーが無いときの処理
            }else{
                $this->loadModel('Tag');
                $this->Theme->unbindModel(array('belongsTo'=>array('User')),false);
                $themes = $this->paginate('Theme');
                $tags =   $this->paginate('Tag');
                $this->set('themes',$themes);
                $this->set('tags',$tags);
                $this->render('/main/index');
            }
        }
    }

ポイント
※コードの下から説明していくよ。

・14行目のrenderでトップページを指定するのがポイント。
 ここで、redirectを使用してはだめ。redirectではvalidationエラーの情報を遷移先に
 引き継いでくれないため、エラーメッセージが表示されない。

・そして、9~13行目でTOPページを表示していたコントローラの処理(main_controller.phpの
 indexアクション)をそのままコピペ。これがないと、トップページでDBアクセスして取得する
 情報などが表示できない。(エラーとなる。)
 main_controllerのそのアクションを呼び出せれば楽なんだけどなぁ。
 どうやらそういう時は、コンポーネントという仕組みで処理を共通化するのがよいみたい。
 今度試してみよう。

・8行目で不足しているmodelをloadする。mainコントローラでは$usesに'Tag'が入っていたが、
 themeコントローラには入っていないため、ここでloadする必要がある。
 くわしくは[CakePHP]modelを二つ以上使用する場合の注意点参照。


【2012/09/13追記】
このやり方のだめなところを発見した。
一度入力エラーなしで遷移に成功し、その検索結果の画面にも 検索ボックスがあるとする。
そうすると、その検索結果画面で未入力チェックにひっかかると、そのままの画面ではなく、
main/indexに遷移してしまう。
遷移元のURL$this->referer();で判断できるかと思ったが、これをやると
検索結果画面のペイジネイションが維持できなくなる。3ページ目でひっかかったのに、
なぜか1ページ目で表示されるなどする。
結局、難しいので、全てエラー画面に遷移させてしまうことにする。

※CakePHPのバージョンはcakephp-cakephp-1.3.15-9-gacd25c3.zip