CakePHP の一覧表示には標準搭載のPaginate機構を使う事が多いと思います。お手軽ですから。bakeで焼いたままで、ソートや改ページといった細かい手間も省いてくれますしね。 でも、一覧画面でありがちな「条件で絞り込み」みたいな要件にどう対応したらいいのかってドンピシャで書いてるところ少ないんですよね。前に確かに実装したのにな・・・って事で覚書。(今回はCakePHP 1.3.10 で動作確認しています。) 【今回の要件】 例えば、人の一覧画面で、[全て|男のみ|女のみ]みたいなスイッチで絞り込みをしたいとしましょう。 やり方は色々あるのですが、どうせなら通常「http://あああ.com/・・・/index/page:2/sort:name/derection:asc」とかなってるURLにさらに「/seibetu:1」みたいな独自のパラメータが追加できればいいですよね。 【nam
過去記事の問題点 Paginateオプションをモデルに移行する - 24時間CakePHP http://d.hatena.ne.jp/hiromi2424/20100426/1272289702 では、paginateオプション内に"order"や"limit"が無いため、これらオプションを指定すると動作が謎になってしまいました。 そこで、AppControllerにページネートタイプを指定するとともにオプションをセットする機構を設け、この問題点をクリアします。 向上点 virtualFieldsをコレクションとすることで、デフォルトのvirtualFieldsと追加のvirtualFieldsの親和が容易になり、指定の幅も広がりました。 準備 AppController,AppModelに汎用メソッド・プロパティを定義します。 AppController <?php class App
paginate する対象がテーブルやそのカラムと1対1なら かなり簡単に使えるんだけど、 たとえばソートキーが複数カラムに渡る場合とかになるとちょっとカスタマイズがいる。 コントローラ内で $this->paginate('Model'); とすると、通常は Model::find('count'); Model::find('all'); がコールされて paginate する。 ※all は通常の場合。controller の default プロパティでインデックス0に type 指定するとそれを使用できる。 該当のモデルに「paginateCount」「paginate」メソッドが定義されていると こちらがコールされる。引数は以下の通り。 Model::paginateCount($conditions, $recursive, $extra); Model::paginate(
とある5丁目で活動する還暦を過ぎたWebプログラマーの覚え書きです。それとかかってくる迷惑電話や、家業のアパート経営について。 CakePHPで用意されているpaginateのsortのメモです。paginateのsortは便利ですが、最初はテーブルの1項目しかソートの対象になりません。お客さんから、「価格」と並び替えるときに、もう一つ「価格条件」でも合わせてソートしてくれという入り用とのこと。しかし、CakePHPのレファレンスによると、ソートするには一つの項目だけしかソート項目を指定できません。・・・/cake/libs/controller/controller.phpのpaginate()のソースを追っても、複数のソート項目を設定できるようにはなっていません。 そこで、再度調べてみると、検索する前にモデルでbeforeFind()を呼んくれるとのこと。そこでモデルでbeforeFi
ということを調べてみた。 CakePHPのバージョンは1.2.5。 使ってるDBMSはMySQL。 複数の列でソートしたい CakePHPのpaginatorは便利。例えば、Controller内で $this->set('data', $this->paginate('modelname', $options)); を実行して、View側で <th> <?= $paginator->sort('hoge', 'columnname1'); ?> </th> <th> <?= $paginator->sort('hoge', 'columnname2'); ?> </th> <th> <?= $paginator->sort('hoge', 'columnname3'); ?> </th> みたいに記述するだけで、各カラムヘッダにリンクが貼られ、 それぞれをクリックすると、各columnn
CakePHP用のSmartyプラグインを書いてみました。 以前からいくつかあるのですが、バージョンが古かったりViewの全ての機能が使えなかったり、最新版から見ると機能として足りてない部分が見受けられたので、新たに用意してみました。GitHubにおいてあります。MITライセンスっす。 GitHub - kanshin/CakeSmarty: Smarty 3 plugin for CakePHP 1.3 ポイントは 1. ThemeViewに対応 2. デフォルトのctpと共存可能 3. Helperに対応したSmartyプラグインをバンドル 4. Smartyのconfigに対応 2番目、結構重要です。Scaffoldで作られたビューや、デフォルトのレイアウトはそのまま.ctpのままにしておいて、メインコンテンツのみSmartyで記述ということも簡単にできます。.ctpのエレメントも使
CakePHPの「OrderedBehavior」と「TreeBehavior」はマジで使うべき 2011-12-20 あまり知られてなさそうだけど、マジで便利に使えるCakePHPのビヘイビアを2つ紹介します。 OrderedBehavior http://bakery.cakephp.org/articles/alkemann/2008/09/21/orderedbehavior-2-1 順序を管理するビヘイビアです。Webアプリケーションを作っていると、多くの局面で、 「順序を自由に入れ替えたいんだけど...」 という機能要望が上がります。DBの仕様としては順序を振ってソートするだけでよいのですが、愚直にDBを操作しようとするとすごくめんどくさいです。順序番号の振りなおしとか、うわーやってらんねー、ってなります。 そんなめんどくさい実装も、OrderedBehaviorを使えば、超簡
CakePHPには便利な機能が山盛りで、中でもページネータ(以下ページャ)はかなりの使用頻度があるんじゃないだろうか。 データベースの特定のテーブルを一覧表示する際なんか、数千件を1ページに収めるわけにもいかず、かといって先頭の10件だけを表示するなんてアホらしすぎるわけだ。 ページャというのは、1ページ10件、残りは次のページ!的な振る舞いをするコンテナのことだ。 CakePHPではこのページャをヘルパを使っていろいろなスタイルで表示できるんだけど、一つ困ったことがある。それはなにか!? 独自の検索フォームと絡めるとき、検索結果を維持したままページ移動ができないという点だ。 検索フォームの「名前」に「太郎」と入力して「検索」ボタンクリック 「名前」に「太郎」が含まれるリストの1ページ目が表示 ページャで2ページ目へ移動 「名前」に「太郎」が含まれる条件がクリアされ、何も検索してない状態の
Posted on: 2011/11/18 CakePHP セキュリティ対策について考える(SQLインジェクション、XSS、CSRF) 概要 SQLを使って不正にデータベースを操作する攻撃 攻撃例 ユーザー名とパスワードを入力してログインする処理があるとする。 username と password の組み合わせが、データベースのものと一致すれば認証するという仕組みだとする。 SELECT * FROM users WHERE username='$username' AND password='$password' ここで、($username: admin, $password: ' OR 'a'='a)と入力すると、SQLは以下のようになる。 SELECT * FROM users WHERE username='admin' AND password='' OR 'a'='a' こ
自分の URL を取得したいときに使えるメンバや関数。 ドメインを含めない $html->webroot; // ビュー : html ヘルパー $this->webroot; // コントローラ DOCUMENT_ROOT 配下のルートを取得。 基本的な使い方をしていれば 「 / 」 が返ると思っていればよい。 ドメインを含める $html->url($url, true); // ビュー Router::url($url, true); // ビュー以外 $url は DOCUMENT_ROOT 配下を指定。 $url が null の場合は現在の URL 。 $url を指定した場合はドメインを含めた $url で指定したURL ドメインを取得 env('HTTP_HOST'); 他にも REMOTE_ADDR や DOCUMENT_ROOT なども使える。 function env
CakePHP1.3でWebアプリケーションを構築する上で、Authコンポーネントを使った管理画面を作ってみます。 前提として、adminコントローラ配下に認証をかけることにします。つまりCakePHPで構築したサイト内で「http://xxx.xxx.xxx/admin」にアクセスするためには管理者権限を必要とするようにします。 ユーザ管理テーブルを用意する ユーザIDとパスワードを管理するテーブル「users」を用意します。 CREATE TABLE users ( id INTEGER(8) auto_increment PRIMARY KEY, username VARCHAR(50) NOT NULL, password VARCHAR(50) NOT NULL, date_create VARCHAR(19) NOT NULL, date_update TIMESTAMP NO
Sitemaps are although not critical, have been accepted as a standard way to let engines and users find the content on your site. You can generate those sitemaps on the fly in Cake, and show xml to engines, and formatted text to users. Sitemaps that are generated dynamically are always up to date, which is critical in achieving those top search results. How you may ask? Read on and I shall tell you
cakephpでお手軽にxml配信。Flashの更新管理画面とかによく使う。 1.2でのRSS出力の仕組み(参考) ControllerのComponentsにRequestHandlerを追加する。 var $components = array('RequestHandler'); route.phpに下記を追加する。 Router::parseExtensions(); するとrssやxmlのような拡張子に反応して、xml用のviewを見に行くようになる。 xml用のviewは[/app/view/コントローラ/xml/アクション.ctp]に用意する。 そしてレイアウトは[app/view/layout/xml/default.ctp]を下記な感じで用意。 e($xml->header()); echo $content_for_layout; あとは、通常のviewと同じ感覚でxm
Tomoe Ishikawa PHOTOSHOP,Illustrator,DESIGNER /HTML,CSS,Developer/ PHP,CAKEPHP,PROGRAMMER app/controller/のフォルダーの中にXML用のファイルを作成する 例:sitemap_controller.php ①のファイルの中でコンポーネントとヘルパーの設定をする。 var $components = array('RequestHandler'); var $helpers = array('Xml'); xmlの拡張子に反応して、xml用のviewを見に行くようにするために、app/config/route.phpの中でparseExtensions を有効にします。 Router::parseExtensions(); app/view/layout/xml/default.ctpでX
app/controllers/内に、sitemap_controller.php を作成し、以下の内容を記述する。 <?php class SitemapController extends AppController { var $components = array('RequestHandler'); var $helpers = array('Xml'); function index() { } } ?> 拡張子が.xmlの場合、xml用の view が適用されるよう app/config/route.php内に以下の内容を記述する。 Router::parseExtensions(); app/views/layouts/xml/default.ctp に以下の内容を記述 <?php echo $xml->header();//XML宣言を出力 echo $content_
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く