cakePHP 2.3 AjaxなPagination

はまりにはまったができた。

コントローラー

ビュー(/View/Customers/index.ctp)

ビュー(/View/Customers/json/search.ctp)

追記(2013年6月8日):

上記だと、Sortとか次のページとかがAjaxにはなるけど、検索条件が維持されていない!!!!セッションとかで勝手に管理してくれてたりするわけではないらしい。自分でセッションつかうか、Paginatorヘルパーが出力するJavascriptのコードを書き換える必要があるようだ。セッション使うのが一番お手軽っぽいけど、AjaxなPaginatorを複数で使っているので全部修正するのがめんどくさい。検索したらセッションに検索条件を入れて、新たに検索されたらセッションの検索条件を変更しないといけない。Paginatorヘルパーをオーバーライドして、sortとかのオプションで検索条件のフォームをしていできるようにしたら修正もお手軽である。

Paginatorヘルパーは、$this->Paginator->sort(‘id’,’ID’,array(‘update’=>’#search_result));みたいな感じである。この第三引数に、’method’=>’post’を追加すると、POSTでアクセスしてくれる。さらに、この第三引数の配列に、’form’=>’#フォームのID’といった感じで検索条件を設定しているフォームを指定することで検索条件をdataとしてリクエストしてくれるようにする。

sort関数などは、標準だと、オプション配列はJqueryEngineHelperのrequest関数で扱われている。これをMyJqueryEngineHelperとしてオーバーライドする。

そして、これをコントローラーで呼び出す。今回はAppControllerで呼び出した。classNameというのは便利だ(参考:【CakePHP2】コンポーネント、ヘルパーのメソッドをオーバーライドする)。

そして、ビューで下記のようにオプション設定をする。

追記(2013年6月10日)

注意!$this->Paginator->sortというように、paginatorではなく、Paginatorと最初のPを大文字に統一しないと、オプション設定が反映されません。なぜかpaginatorでも動くんだけど。

cakePHP 2.3 JSONビュー

http://book.cakephp.org/2.0/ja/views/json-and-xml-views.html

1.ルーターの設定をする。
Router::parseExtensions(‘json’);

2.コントローラーで、RequestHandlerComponent を有効にする。
public $components = array(‘RequestHandler’);

3.ビューは、専用のビューを使うか、シリアライズするかのどちらか。

4.URLは、パス+.jsonとする。
(例)/users/add.json

cakePHP 2.3 View内でjavascriptを追加する

http://book.cakephp.org/2.0/ja/views.html

cakePHP Bakeのコマンド(Xampp)

XAMPP使っているので、XAMPPフォルダの中にあるhtdocsフォルダにプロジェクトフォルダがある。

WordPress ContactForm7からのREST

ContactForm7のフォーム情報をサーバに飛ばす

WordPress ContactForm7は、/includes/classes.phpがメインっぽいファイルで、WPCF7_ContactFormクラスに色々な処理が記載されている。
function setup_posted_data()で、メールフォームのフォーム情報をゲットして、WPCF7_ContactForm::posted_dataに格納している。
$posted_dataの中身は、$posted_data[$name] = $valueといった形になっている。
フォームのnameが、subjectであった場合、subjectへの記載内容は、$this->$posted_data[‘subject’]で取得できる。
function submit()で、エラー等がない場合にメール送信処理をしている。
メール送信処理は、do_action_ref_array( ‘wpcf7_mail_sent’, array( &$this ) );っぽい。
do_action_ref_arrayはWordPressの関数で、指定したアクション$tagに登録された関数を実行する。(参照:WordPressのプラグインを作る際に覚えておくと便利な関数まとめ

どこ探しても、wpcf7_mail_sentを設定している箇所がない。
http://wordpress.org/support/topic/plugin-contact-form-7-php-after-form-submit これを見ると、functions.phpに下記のような設定すると、submit時の追加処理ができるっぽいことが書いてある。

ということで、下記functions.phpに下記にように記載すると、実際にできた。

ContactForm7の情報をcakePHPで受け取る

参考;RESTリクエストとレスポンスオブジェクト

/app/Config/routes.phpに、下記を追加

コントローラーに下記を追加

postメソッドの場合、function add(addアクション)が動作するので、function addで、下記のようにする。

WordPress Debugモード

wp-config.phpに、下記記載をする。

define(‘WP_DEBUG’, true);は、デフォルトで記載があり、false設定されているが、その他2行は記載がない。
define(‘WP_DEBUG_LOG’, true);は、有効化すると、/wp-content/ ディレクトリに debug.log が作成され、そのファイル内にエラー内容が記録される。
define(‘WP_DEBUG_DISPLAY’, true);は、有効化すると、画面上にエラーが表示される。

参考:WordPressのデバッグモード

cakePHP Paginator Sort 任意の順番でソートさせる

cakePHPのPaginatorのsort機能は便利だが、例えばフィールドに格納されている内容が、”非常に忙しい”、”忙しい”、”平均的”、”暇”、”すごく暇”といった文字列になっている場合、忙しい順に並べたいと思っても、cakePHPは日本語が読めないし、意味も分からないのだから難しい。

よって、何らかの対処が必要である。
参考にしたサイトは、下記4サイト。

http://snowland.net/nucleus/item/2984
MySQLはOrder byで任意の順番でソートすることが簡単にできる。

http://d.hatena.ne.jp/atcorp/20100213/p1
cakePHPのPaginatorは、毎回$model->beforeFindメソッドを2回実行する。

http://blog.kabadna.com/20110731-1297/
CakePHPのPaginatorに独自のパラメータを追加する方法がのっている。

https://groups.google.com/forum/?fromgroups=#!topic/cake-php/3968QIqsi8A
cakePHPでのORDER BY FIELDの設定方法がのっている。

結論的には、ビュー上でソートしたいフィールドを指定された際に、sortパラメタにそのフィールド名を設定してコントローラーを呼び出し、コントローラー内で、sortパラメタの値(フィールド名)に応じて、$this->paginateに、ORDER BY FIELDを設定することで解決できた。

↓コントローラー内

cakePHP 2.3 Paginator (GET)

まずコントローラで、$paginatorの設定を行う。

次に検索条件の設定が必要であれば行う。

findの代わりにpaginatorを使う。

次にビューの設定をする。

ここまでは簡単だが、次のページや、前のページを、上記のようなリンクにすると、情報を引き継がない。
あとPOSTでやろうとしても、上記リンクだとできない。とはいえ、GETだったら自動で情報を引き継ぐかというとそういうわけでもない。
単に現在のページに、page:2というパラメータが降られるだけで、その他のパラメタは削除される。

上記をビュー内に記載すると、次へページとかのURLに、自動でパラメタが付加される。しかし、パラメタの付加の仕方が半端ない。
Paginatorは通常ではNamed parametersを使うらしい。FormからNamed parametersを作成するのはめんどくさそうだが簡単な方法があるのかもしれない。今時点では、GET送信を前提に調べる。

Using GET parameters for paginationというタイトルで英語で説明されているページを発見した。さらに、ここ(Pagination with GET parameters)に明確な回答があった。

コントローラーで、下記を設定する。

下記でもいいらしい。

これでいいらしい。

さらに和訳を発見した。

GETパラメータを用いたページネーション
CakePHPの以前のバージョンでは、ページネーションのリンクは名前付きパラメータを使ってのみ生成が可能でした。それでも、もしGETパラメーターでページがリクエストされたらページネーションは動作していました。2.0では、ページネーションのパラメーターを生成する方法を、操作性を上げ、矛盾のないようにすることを決意しました。クエリ文字列を使うか、名前付パラメーターを使うかをコンポーネントで選ぶことができます。やってくるリクエストは選らんだ種類だけが受け入れられます。また、PaginatorHelperは選んだ種類のパラメーターを用いてリンクを生成するでしょう。
var $paginate = array(
‘paramType’ => ‘querystring’
);
上記はクエリ文字列パラメーターを解析し生成することを有効にします。また、PaginatorComponentの$settingsプロパティを修正することもできます。
$this->Paginator->settings[‘paramType’] = ‘querystring’;
デフォルトでは、クエリ文字列が使われているときは全ての種類のページングパラメーターはクエリ文字列に変換されます。もし他のルーティングパラメーターを強制的にクエリ文字列として扱いたいなら、$this->Paginator->options(array(‘convertKeys’ => array(‘your’, ‘keys’, ‘here)));とできます。

ということで、ビューで下記のようにやると、すべてのパラメタがクエリ文字列に変換された。

(参考)
http://cakephp20sysnsa.blogspot.jp/2012/06/blog-post.html
http://book.cakephp.org/1.3/ja/The-Manual/Core-Helpers/Paginator.html
http://book.cakephp.org/1.3/ja/The-Manual/Common-Tasks-With-CakePHP/Pagination.html

cakePHP 2.3 パラメタへのアクセス

リクエストパラメータにアクセスする方法は3つある。

上記はすべて同じ値にアクセスする。

クエリ文字列は、下記のようにアクセスする。

$this->request->queryは、queryが空でもセットはされている。issetすると必ずtrueになる。queryがある場合を調べる場合は、if($this->request->query)でエラーにならない。

POSTデータは、下記のようにアクセスする。

上記アクセスの場合、$this->request->dataに指定されたキーがない場合はNullが返る。

cakePHP モデル Tips

list

アソシエーションがあるモデルでForm上でセレクトボックスを作成する予定がある場合、find(‘list’)を使う可能性はきわめて高いが、listとして得られる値は、フィールド名がnameかtitleのいずれかがあれば、それがデフォルトのValueとされる。find(‘list’)は連想配列を返し、この場合、keyはidフィールド、valueはname(title)フィールドとなる。このfind(‘list’)の結果をFormヘルパーのセレクトボックスにセットすれば、自動的にリストに基づいた選択肢が作成される。

createdとmodified

フィールド名をcreatedかmodifiedにしておけば、cakePHPは自動的に、それぞれデータ作成日時・データ更新日時を登録してくれる。

http://book.cakephp.org/1.3/ja/The-Manual/Developing-with-CakePHP/Models.html

cakePHP HTMLヘルパー タグの埋め込み (cakePHP2.3)

埋め込んだタグはデフォルトではエスケープされるので、エスケープ回避設定をする必要がある。回避は’escape’=>falseと設定する。

CSVからテーブル作成用のSQL文を作成するPHP

macのnumbersで、windowsエクセルを開き、csv化することは問題なくできるが、フィールドの値にカンマが使われていたり、改行文字が使われている場合は注意が必要である。カンマが使われている場合は往々にしてあるので、事前にカンマを<カンマ>などのユニークでフィールド内の値として利用されていない文字列に変換する必要がある。また、改行文字が使われている場合は、それを<br>に変換する必要がある(これはフィールドの値の利用方法によって変わる)。

この2つの事前準備をnumbers上で実施した上で、csvとして書き出す。書き出した後で、下記ソースコードのPHPファイル実行する。このPHPファイルで先程のcsvファイルを読み込む。これによって、csvファイルの内容に応じた、MySQLのテーブルを作成する為のSQLが出力されるので、そのSQLをphpmyadmin上で実行する。すると、テーブルが作成される。合わせて、PHPファイルの実行によって、読み込んだCSVファイルを加工して出力することができる。加工内容は、区切り文字をカンマから任意の文字列に変更することと,numbers上で変換した<カンマ>をカンマに戻すことの2点である。この加工後のcsvファイルを、phpmyadminのインポート機能によってインポートすれば、テーブル作成〜データインポートまでが完了となる。

cakePHP 認証

AppController

UsersController

User(Model)

login.ctp

cakePHP Form Helper セレクトフォームの表示

cakePHP バリデーション