「PHP」カテゴリーアーカイブ

【cakePHP】重複を省いたPaginator

重複を省いて正しい件数をだすPaginatorのやり方です。

データを取得するだけなら
CakePHP の find で DISTINCT を使って重複した行を除外してデータを取得する方法[WEBLE]

でいけます。

ページ分けをしてくれる便利プラグイン、Paginatorを使っているとどうでしょう。
fieldsはPaginatorに設定することができますが、カウントしている部分には使ってくれません。
どうしようかと思ったらPaginatorで自分用のカウント方法を設定する方法がありました。

モデルの中にpaginateCount関数を作ればよかったです。

【cakePHP】SSLと非SSLが共存するサイト

ひとつのサイトの中にSSLページと非SSLページを混ぜる場合は注意が必要です。

http://book.cakephp.org/2.0/ja/development/sessions.html
に書かれてあるように、session.cookie_secureをfalseにしないとcookieが継続できません。

SSLページから他のページに飛ぶときに、相対リンクだとやはりSSLのかかったページにとびます。暗号化通信を解除しようと思うとhttp://から始まる絶対リンクで書かないといけません。
これを相対リンクのままにして強制的にhttpかhttpsに振り分けるようにしたやり方も書いときます。

config/route.phpでsslディレクトリ以下へのアクセスはpssl/を省いたコントローラ・アクションにアクセスし、パラメータsslを入れるよう設定。

AppControllerでアクセスのたびに環境変数のHTTPSとパラメータsslを比べてリダイレクトし直しています。

【cakePHP】コントローラからViewファイルを使う

cakePHPのサイトでユーザーにメッセージを送るときに、テンプレートファイルで内容を用意しておきたいな、と思ったもので、コントローラーから好きなViewファイルの内容を変数に入れるのをやってみました。CakeEmail.phpを参考にしました。

コントローラのアクションの中で

フォルダ名は既存のものに階層を掘っても(/スラッシュが使える)新しく作ってもかまいません。ファイル名のtemplate_nameを書き換えることで好きなViewファイルを使えます。

【cakePHP】トグルスイッチをAJAXで反映させる

さして目新しいことでもないですが簡単な小ネタでも。

トグルスイッチを切り替えるたびにDBを書き換えることは簡単にできます。
cakePHP2.0+jQueyMobile1.2でのトグルスイッチのDBへの反映のやり方です。いいやり方か分からないですが何かの助けになればと。

cakePHPのアクションは

こんな感じです。これをコントローラに記述して /{コントローラ名}/toggleValid/{ID} にアクセスするたびにvalidカラムが0と1に交互に変わります。CASE文で判定すればいろいろできて便利なのでcakePHPでSQL組み立てるやり方が分からないときはとりあえずqueryファンクション使っちゃいます。

そしてこの関数はコントローラーでなくモデルに書くべきものなので実際にはモデルに書いてます。またjQueryMobileと組み合わせているので下のようになります。

[共通読み込みJavaScriptファイル]

このファイルはjQueryMobile特有の処理をしています。最初のイベントバインドはDOMキャッシュを有効にしたままJavascriptを実行させるため、data-role=”page”の属性を持つコンテナにidを割り振り、そのページコンテナの初期イベントを監視しています。

[ビューファイル(index.ctp)]

$validと$idはコントローラからセットしておいてください。data-idはjQueryMobileではおなじみのHTML5の独自データ属性です。これでデータIDをjQueryへ渡すのが簡単です。

[AJAX呼び出し先コントローラー]

[モデル]

【cakePHP】検索エンジンに補足されないよう削除リンクはPOSTにしよう

かなり前に作ったサービスなんですが、入れたはずのデータが時間が経つと消えているという怪現象に遭遇しました。

いや、分かってみると怪現象でもなんでもなかったんですが、とある中華検索サイトが削除リンクをクローラ収集中に踏んでいたのでした。

こういうことが起きないよう、クローラにアクセスされるとデータが変わってしまうようなリンクはPOSTかJavaScriptを使ったリンクにしましょう。

元のリンク

cakePHP1.3のajaxヘルパー(2.0では非推奨)を使ってリンク先の画面を画面を遷移せずに取得していました。変換されるHTMLをみると

とJavaScriptが実行できないクローラでも普通のリンクとして辿れるようにできています。
POSTに書き換えました。(div内を書き換えるのでなく特定のdivを削除するようやり方は変わってます)
jQueryを使用しています。

ちなみにcakePHP2.0のFormヘルパーにはpostLINKという関数が追加されていますので、動的に書き換えたりしないならこっちを使ったほうが簡単なのではないでしょうか。

キャッシュ可能なURLはGETで、データ操作のあるURLはPOSTで行うと考えると分かりやすいでしょう。

しかし検索クローラはPOSTをSUBMITしないのでしょうか。googleは2012年のWEBマスター向け公式ブログでPOSTリクエストに対応していると明記しています。
いずれまた対策を施さないといけなくなるかもしれません。その時は、パーミッションの与えられた会員ユーザーかどうかをチェックしたうえで削除することになるでしょう。