7月
15
2010
0

[メモ]SBM登録URL
このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

自分専用メモです。
参考にしないと思いますが、もしする場合は自己責任で^^;

はてブ
http://b.hatena.ne.jp/append?[url]

ヤフー
http://bookmarks.yahoo.co.jp/bookmarklet/showpopup?t=[title]&u=[url]&opener=bm&ei=UTF-8

NiftyClip
http://clip.nifty.com/create?url=[url]&title=[title]

livedoorClip
http://clip.livedoor.com/clip/add?link=[url]&title=[title]&jump=ref

Delicious
http://del.icio.us/post?url=[url]&title=[title]

pookmark
http://pookmark.jp/post?url=[url]&title=[title]

FC2
http://bookmark.fc2.com/user/post?url=[url]&title=[title]

当然のことながら[url]や[title]はurlencodeしてね♪

Written by suzukenn in: メモ |
6月
08
2010
0

[CakePHP]別プロジェクトの画像(その他)の利用方法(殴り書き)
このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

時間が無いので自分以外には役に立たない記事しか書けなくて、まずごめんなさい。

/hoge
  app1/webroot/img
  app2/webroot/img
  cake/…
  …

こんな感じで複数のCakePHPプロジェクトがあったとして、app2からapp1/webroot/imgを参照したい場合。

散々悩んだ挙句「PHPで作る携帯サイト」を読んで解決。

シンボリックリンク貼れよ・・・と。

ただ、僕のようにWindows環境で開発している人は・・・

窓の杜 – 【REVIEW】エクスプローラ上で手軽にシンボリックリンクを作成「Link Shell Extension」

↑コレで解決。

インストール方法、使い方は調べればわかるはず。僕はわかりました!

app2/webroot/imgをapp1/webroot/imgのジャンクションに置き換えれば万事OK!

最後に・・・はじめにも書いたけど役に立たない糞記事でごめんなさい。ごめんなさい。ごめんなさい。

Written by suzukenn in: メモ | タグ:
5月
06
2010
3

[CakePHP]CakePHP1.3でDebugKitを使う
このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

CakePHPの1.3がリリースされたので、早速使ってみたところ色々と問題が発生。
その中でも一番困ったのがDebugKitが使えない!

検索しても同様の事例が出てこなかったのが不思議なのですが、
解決策がわかったのでとりあえずメモしておきます。

問題の確認

まずはインストールをして問題の確認から。
下記から最新のソースを取得(現時点で1.2)。

Downloads for cakephp’s debug_kit – GitHub

インストールは我らがcakephperさんのブログの超便利なDebugkitを画面キャプチャ付きで解説 – cakephperの日記を参考に。
※解凍したフォルダ名を「debug_kit」にするのを忘れずに。

で、無事インストールした状態でブラウザから開いても、あれ?右上にケーキアイコンが出てこない。
開いたページの下部にデバッグ内容がずらずら出てきちゃいますよね?

原因はjs_debug_toolbar.jsの読み込みに失敗しているため。
で、色々と調べてみると、

Plugin assets :: Plugins :: Developing with CakePHP :: The Manual :: 1.3 Collection :: The Cookbook

まさに探していた答がここに。*1

よくわかりませんが、どうもCakeの1.3からは、今までvendors/から読込んでいたjsなどをwebroot/で呼べるようになりましたよってな事のようです。ホント良くわかりませんが。

対処方法

debug_kit/vendorsをdebug_kit/webrootにリネームすると、無事右上にケーキアイコンが表示されました。
めでたしめでたし。

  1. こういう情報は日本語のページのみの検索では駄目なんだと反省 []
Written by suzukenn in: メモ | タグ:
4月
05
2010
2

[CakePHP][ktaiLibrary][メモ]リダイレクトがうまくいかないときの対処方法
このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

最初に前置きしますが、これは僕のプロジェクトの環境に由来することかもしれませんので、一般的なTIPSではないことをご了承ください。

【前提条件】

  • とりあえず検証したのはWindows+xampp1.7.0+CakePHP1.2.6
  • config/routes.phpにRouter::parseExtensions();を設定している(たしかRSS配信のためだったと思う)
  • /genres/clip/100にアクセスした場合に、100という引数をclip処理して/genres/index/100にリダイレクトする

【問題点】

$this->redirect(”/genres/index/100″);でリダイレクトすると「/genres/index/pass~Array/url~Array」こんな感じでURLが壊れてしまい、引数なしの/genres/indexにアクセスしてしまう。

【原因】

redirectに指定したurl「”/genres/index/100″」は、app_controller.phpに追加した__redirect_url($url)の処理でRouter::parse($url)すると配列に置き換えられる。
この置き換えられた配列を、元のredirect処理(parent::redirect)の処理中のRouter::url($url)すると、pass:Arrayに変換してしまうのが原因のようだ。

ちなみにrouter.phpに記載しているRouter::parseExtensions();を追加すると$this->params[url]に配列でarray(”ext” => “html”)が追加されるし、引数のあるパスを渡せば$this->params['pass']に配列で引数が追加される。
僕の環境だとRouter::url()に渡す配列にこれらが含まれている場合、返り値にurl:Arrayやpass:Arrayが含まれてしまうようだ。
これに関してはktai Libraryを組み込んでいない別プロジェクトでも同じだからCakePHPの仕様な気もするけど、後述する対処方法が見つかったので詳しく調べていない。

【解決方法】

コントローラでリダイレクトする際に渡す引数を配列で渡す。

$this->redirect(array("controller" => "genres", "action" => "index", 100));

$this->redirect(”/genres/index/100″);としていたところを、$this->redirect(array(”controller” => “genres”, “action” => “index”, 100));とすることで解決した。(この書き方をしなくてはならないのは面倒だけども。。。)

ktai Libraryの作者MASA-Pさんの著書「PHPで作る携帯サイト デベロッパーズガイド」のP88にCakePHPのredirect処理についての記述があるんだけど、サンプルソースには$this->redirect(Router::url(”action” => “add”));のように書いてあったり、「外部サイトを定義することはできない」*1 と書いてあるのだけど、普段は外部サイトへのリダイレクトでも使っていたし、redirect()の引数指定も今までこのような書き方を知らなかったのでとても悩んだ。

【最後に】

CakePHPの基本くらいは知っているつもりでデベロッパーズガイドのCakePHPについて書かれた章は飛ばしていたんですが、CakePHPについてもとても詳しく書いてあるし、中身も濃いのでもう一度勉強するつもりで最初から読み直してみようと思います。

ちなみにController::redirect(”/genres/index/100″);のようなurlをstring渡しでうまくいくという方がいらっしゃいましたら、「できるよー」と声をかけてもらえると嬉しいです(笑)できる事実があるなら何とか調べてみたいと思いますので^^)

【余談】
先日、debug値が0以外のときにセッションIDの持ち回りができない件もMASA-Pさんに質問させてもらったんだけど、テストサイトでは問題なく動いているとのことだったので、やっぱり僕のCakePHPの使い方に何か問題があるのかも知れないです。。
他の方と比べたことがないのでわからないけど、結構クセのある使い方をしているかもしれません。
上記がすべての方に当てはまるということはないと思いますので、あらかじめご了承くださいね。

  1. 実機で試していないのだけど携帯では外部サイトにリダイレクトできない。という意味なのかな? []
Written by suzukenn in: メモ | タグ: ,
3月
31
2010
0

[CakePHP]counterCacheがすごく便利なのでメモ
このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

例えば以下の2テーブルがあったとして・・・

ユーザの情報をもつユーザテーブル
users(Userモデル)

ユーザーがページを開くたびに保存されるログ(apacheのアクセスログみたいなものだと思ってもらえば)
もちろんuser_idというフィールドを持っている
user_logs(UserLogモデル)

このとき、User.idごとのページビュー(UserLogのレコード数)を取得したい場合はどうしますか?

僕の場合はコントローラで、


$bind = array(
    "hasMany" => array(
        "UserLog" => array(
            "fields" => array("count(id) as pv"),
            "conditions" => array("1 = 1 group by UserLog.id")
        )
    )
);
$this->User->bindModel($bind);

こんな感じで、取得していました。*1

でも、面倒だし、出力されるデータも

↓users = array(
    "User" => // 省略
    "UserLog" => array(
        "0" => array(
            // 省略
            "UserLog" => array(
                "0" => array(
                    "click" => // ここでやっとクリック数
                )
            )
        )
    )
);

すごく深くなってしまう。むだですよね。

counterCacheを使うと

usersテーブルに「user_log_count」*2 というフィールを追加。

UserLogモデルにbelongsToアソシエーションを追加して、counterCacheをtrueに

var $belongsTo = array(
    "User" => array(
        "counterCache" => true,
    ),
);

そうすると・・・

なんということでしょう!
UserLogにデータが追加されるたびにUser.user_log_countの数字がインクリメントされ、カウントが反映されます。
これでもうカウントを取得するためにUserLogをバインドする必要も無く、User単独でカウントが取得できるというわけ。

すごく便利でしょ!?

ちなみに
UserLogのレコードをdeleteしたらどうなるか?
UserLog.user_idを別のuser_idにupdateしたらどうなるか?
こういったことは検証していないので、もしやってみた方は教えていただけると嬉しいです。

  1. UserLogをベースに、group by user_idで取得することもできますよね。 検証はしてませんが、なんとなく重くなりそうな気がするので僕はUserモデルをベースにしてます。 []
  2. user_logsじゃないので注意!複数形じゃなく単数形で”user_log”_countね []
Written by suzukenn in: メモ, リファレンス | タグ: ,

| I have been indebted to Aeros Theme. | Background image owner is NASA.