cakePHP2.3 Formヘルパー datetimeのセレクトボックスを年月日区切りにする

Formヘルパーのdatetimeのセレクトボックスで、簡単に下記のような感じで”年月日”区切りにする。
スクリーンショット 2013-05-23 0.07.56

(1) /lib/Cake/View/Helper/FormHelper.phpを、/app/View/Helperにコピーする。
(2)コピーしたFormHelper.phpの、下記の部分を修正する。

(3)コントローラーでdatetime()のオプション配列をつくってビューに渡す

(4)ビューでdatetime関数を使う

以上です。

ちなみに、今日から1年後まで選択できるようにしたい場合は、オプションを下記のような感じにする。

参考文献:
CakePHP1.2 HTMLヘルパーの日付コンボを年月日で表示する
【CakePHP2.2.0】dateTimeで初期値を設定する

cakePHP Form dateのセレクトボックスを日本語にする

参考: 日付セレクトボックスを日本語にする

cakePHP2.3 Ajaxな投稿画面の処理例

Jsヘルパー使ってAjaxなフォームをビューでつくる
コントローラーで処理してAjax用ビューに渡す
Ajax用ビューを表示先の要素に表示する

以上でございます。

Ajaxなビュー

コントローラー

表示内容ビュー

ちなみに、最初のビューで、ファイル添付できるようになっているが、上記例のコントローラーにファイル登録処理はない。

cakePHP Transitionコンポーネント

便利らしい。調べよう。fileBinderの例文で使われているので調べた。多分これだろう。

24時間cakePHP Transitionコンポーネント1.0

24時間cakePHPといのはいい名前だな。

↓TransitionComponentの紹介記事
TransitionComponent for CakePHPで簡単確認画面実装

Transition Componentは、セッションと、主にCakePHPのモデルバリデーションの機能を利用してページ遷移を管理しており、
使いこなすとページ遷移管理を非常にすっきりとしたコードで実現することができます。

これはフォーム入力→確認画面→完了画面みたいなやつをすっきりと書けるということだなー!いいねえ。

追記:cakePHP2.3でTransitionコンポーネントを使ってみる

使ってみたらかなり便利だった。まだ初歩的な使い方しかしてないけど。
特にモデルに特別なことを追記するような必要はない。
コントローラーでTransitionコンポーネントを呼び出して、使えばいいだけ。

コントローラー UsersController.php

ビュー(ユーザー登録画面の最初の画面)index.ctp

ビュー(登録内容確認画面) confirm.ctp

ビュー(登録完了画面) save.ctp

参考:
[PHP][CakePHP] とっても便利なTransitionコンポーネント
hiromi2424 / TransitionComponent

cakePHP 2.3 ファイルアップロード – FileBinderプラグイン

最初、FileBinderを使おうと思ったが、uploadのが人気ありそうなので、uploadを使ってみようと思った。しかし結局日本人が作ってるし、まだ元気なプラグインだとどこかに書いてあったのでFileBinderを使うことにした。こっちのが書くこと少なくてすみそうだったし。

FileBuinderの参考:
CakePHPの超便利なファイルアップロードプラグイン、FileBinderプラグインの使い方をまとめてみた。
FileBinderプラグイン

uploadの参考:
cakePHP 2.x 画像アップロードプラグイン“upload”の使い方

/****** 追記 ******/

ただいま2013年5月31日です。
上記のFileBinderに関しまして超ウルトラスーパーはまったので追記します。
上記と同様にコードを書いているつもりなのに一向にうんともすんともいわない状況が続いておりました。
$this->Ring->bindUp();を実行しても、$this->request->dataのファイルの内容が変わらない状態です。
なぜだか全く分からなかったのですが、$this->Ring->bindUp(‘モデル名’);とやると、解決しました。
どーして書かなくてもOKな場合と、NGな場合に分かれるのか分かりませんが、今度調べるとして、モデル名はしっかり書くようにしようと思った次第です。

cakePHP 2.3 JsヘルパーでAjaxなsubmitボタン

updateが、かえってきた内容の表示先。withは、対象formの指定。
これで、コントローラーで$this->dataでアクセスできるようになる。
便利過ぎ。

参考:http://book.cakephp.org/1.3/ja/The-Manual/Core-Helpers/AJAX.html

cakePHP2.3 エレメント・ブロック

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

cakePHP 2.3 Buttonをクリックしたら別ページに飛ぶ(onClick)

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で、下記のようにする。

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を設定することで解決できた。

↓コントローラー内