Author Archive

    はてなブックマーク - Search Plugin for CakePHPで簡単検索機能実装
    このエントリーをはてなブックマークに追加

    最近CakePHPプラグインづいている小山です。

    今回はCakeDC謹製のSearch Pluginを紹介します。
    (CakePHPのバージョンは1.3.0を想定しています。)

    Search Plugin

    みなさんはCakePHPで検索機能を作るとき、どのように実装していますか?

    たとえば一般的な一覧画面(index)で検索機能を実装しようと思ったら、まずはformを作成して検索条件をPOSTで飛ばして利用すればいいですが、
    さらに最近デフォルトで実装されているページネーション機能と連携して、検索結果でページングを実現しようとするとちょっと面倒です。

    さらに細かい検索条件を実装しようと思ったら、もう考えたくありません。
    自分は新規案件のたびに毎回1からつくっていたような気がします。

    CakePHPのコアデベロッパーの75%を抱える(CakeDCのサイト情報)CakeDCでも、やはり面倒だと思っていたのか、Search Pluginという検索プラグインを作成して使っていたようです。

    最近いくつかのプラグインのソースが公開されたので自分も使ってみました。
    実際に触ってみると面白いくらいに簡単に検索機能が実装できます。

    CakePHPの初期設定

    どれくらい楽かがわかるように、CakePHPをダウンロードしてくるところから実施してみます。

    $ wget http://github.com/cakephp/cakephp1x/tarball/1.3.0
    $ tar zxvf cakephp-cakephp1x-1.3.0-0-g1c06478.tar.gz
    $ mv cakephp-cakephp1x-3bb7793/ cakesearch
    $ cd cakesearch

    次にデータベースを作成します。

    今回はcakesearchというデータベースにpostsというテーブルを作成します。

    次にCakePHPいつもの設定をします。

    appフォルダをそのまま使うつもりですが、app/config/*.phpをいじったりtmpフォルダのパーミッションの設定をするのが面倒なので、今回はbakeコマンドを利用してちょっと楽をします。

    $ php cake/console/cake.php bake

    bakeコマンドメニューの”[D]atabase Configuration”を使ってデータベースの設定をしたあと、”[P]roject”を使ってプロジェクトの設定をします。

    そこで、「What is the full path for this app including the app directory name?」と聞かれるので、ここであえてappフォルダのパスを指定します。

    [/var/www/cakesearch/app/myapp] > /var/www/cakesearch/app

    このあとは導かれるままにEnterを押していくと、app/config/core.phpのSecurity.saltやCakePHP1.3から新たに導入されたSecurity.cipherSeedの設定をしてくれます。app/tmpのパーミッション設定までしてくれています。

    つぎにbakeコマンドを使ってpostsテーブルのMVCのファイルを作成します。

    このとき、「Would you like to create some basic class methods」と聞かれたときにyを選択してindexアクションを作成しておいてください。

    Search Pluginの設定

    さて、ここまででCakePHP自体の設定は終わりです。

    ここからSearch Pluginを導入してみます。

    CakeDCのgithubリポジトリからSearchプラグインをダウンロードして設置します。

    $ cd app/plugins
    $ wget http://github.com/CakeDC/Search/tarball/master
    $ tar zxvf CakeDC-Search-xxxxxx.tar.gz
    $ mv CakeDC-Search-xxxxxx search

    これでSearch Pluginの設置は完了です。
    次にpostsの一覧画面(posts/index)にtitleで検索する機能を実装してみます。

    bakeコマンドで作成されたapp/models/post.phpを以下のように書き換えます。

    $filterArgsは大体想像できると思うのですが、「titleフィールドをLIKEで検索する」ための設定です。typeには他にも完全一致や、サブクエリなどをつかった条件指定などもできます。

    次にapp/controllers/posts_controller.phpを書き換えます。
    (簡単のためindexアクションまでを表示しています)

    $presetVarsは、検索フォーム内のデータを管理するための設定値です。

    $this->Prg->commonProcess()は検索条件のデータのハンドリングを行っています。例えば検索条件自体のバリデーションなどもすることが可能です。

    $this->Post->parseCriteria()は$this->passedArgsと$this->Post->filterArgsを利用して$this->paginateに渡す条件を作成します。

    次にapp/views/posts/index.ctpを書き換えます。
    (簡単のため書き加えた部分周辺のみを表示しています)

    これでbakeコマンドで生成したファイルの修正はすべて終了です。

    なんとこれだけです。
    たったこれだけの修正で、ページネーションと連携したり、検索した条件が保持されたりする検索機能を実装できました。

    まとめ

    今回は、CakeDC謹製 Search Pluginの簡単な導入方法を紹介しました。

    もう少し込み入った使い方などはREADMEなどに詳細に書かれていますので、是非参考にしてみてください。

      はてなブックマーク - PHP開発環境 on Emacs
      このエントリーをはてなブックマークに追加

      はじめまして。Fusicでエンジニアをしている小山です。
      普段はPHP(主にCakePHP)とJavaScriptを使って開発を行っています。

      皆さんは開発を行う時エディタは何を使っていますか?

      Fusicではエディタについて特に指定はなく、みんなそれぞれ好きなものを使用しています。
      NetBeansにはじまりEclipseやTextMate、Emacs、Vim。Visual Studioを使うメンバもいます。
      そして自分はEmacsを愛用しています。ちなみに社内のEmacsユーザはマイノリティです。

      個人的にはプログラマにとってエディタは料理人にとっての包丁、大工にとってのノミと同じものと思っています。
      そういう意味でEmacsは、Emacs Lispを利用してかなり自由度をもったカスタマイズができる特徴をもっており、自分にあった環境を作ることができます。

      ただ、逆にいうと初期設定のEmacsは若干使いにくいのは否めません。

      そこで、今回はEmacs上に簡単なPHPの開発環境を作成してみます。
      Emacsのバージョンは22を想定します。

      .emacs、.emacs.d/の作成

      Emacsの設定は.emacsファイルなどに記述することで出来ます。
      この設定ファイルの作り方、書き方にはいろいろな方法があるのですが、
      今回は以下のようにホームディレクトリに.emacsファイルと.emacs.dディレクトリを作成し
      その中にelispディレクトリを作成します。

      ~/
      |-- .emacs
      `-- .emacs.d
          `-- elisp

      load-pathの設定

      .emacsや.emacs.dディレクトリだけでなく、elispディレクトリ内にインストールするEmacs Lispを読み込んでもらうためにload-pathの追加をします。
      .emacsに以下の設定を記述します。

      (setq load-path
            (append
             (list
              (expand-file-name "~/.emacs.d/elisp/"))
             load-path))

      読み込むディレクトリを増やしたい場合(例えば~/.emacs.d/confディレクトリ)は以下のように追加していきます。

      (setq load-path
            (append
             (list
              (expand-file-name "~/.emacs.d/conf/") ;追加
              (expand-file-name "~/.emacs.d/elisp/"))
             load-path))

      これで最低限の設定は完了しました。
      M-x load-fileコマンドで.emacsファイルを再読み込みするかEmacsを再起動すると設定が反映されます。

      本当はここからフォントの設定や文字コードの設定などが必要な場合があるのですが、今回は割愛します。
      ちなみに自分の設定は以下です。

      (set-language-environment "Japanese")
      (set-default-coding-systems 'utf-8)
      (set-terminal-coding-system 'utf-8)
      (set-buffer-file-coding-system 'utf-8)
      (prefer-coding-system 'utf-8-unix)
      (set-keyboard-coding-system 'utf-8)
      (setq default-buffer-file-coding-system 'utf-8)

      auto-install.elのインストール

      auto-install.elはEmacs Lispのインストールを簡単にするためのEmacs Lispです。
      大抵のEmacs Lispはauto-install.elで簡単にインストールすることが可能になります。

      まず、auto-install.elをダウンロードして~/.emacs.d/elisp/ディレクトリに設置します。
      そして、.emacsに以下の設定を記述します。

      ;; auto-install
      (require 'auto-install)
      (setq auto-install-directory "~/.emacs.d/elisp/") ;Emacs Lispをインストールするディレクトリの指定
      (auto-install-update-emacswiki-package-name t)
      (auto-install-compatibility-setup) ;install-elisp.elとコマンド名を同期

      これでauto-install.elの設定は完了です。

      Anythingのインストール

      Anythingは候補選択フレームワークと呼ばれるEmacs Lispです。
      名前のとおり「何でも」選択候補にあげてくれて選択したものに対していろいろな操作をすることができるEmacs Lispです。
      Anything環境の構築にはいくつかのEmacs Lispをインストールする必要があるのですが、
      auto-install-batchを利用して一気にインストールすることができます。

      M-x auto-install-batchでanythingを選択します。
      するとEmacsWikiから各種必要なEmacs Lispを取得しインストールが開始されます。
      途中でインストールを継続するためにC-c C-cと入力していきます。

      インストール後M-x anythingでAnythingを起動できます。
      何も設定していない状況では

      • バッファ
      • カレントディレクトリのファイル
      • コマンドの履歴

      を選択できるようになっています。
      それぞれに対して

      • バッファを選択 → そのバッファを表示
      • カレントディレクトリのファイルを選択 → そのファイルを開く
      • コマンドの履歴を選択 → コマンドを再実行

      ができるようになっています。
      これが「同じインターフェースで何でも選択して、何でも操作する」Anythingの醍醐味です。

      簡単にanythingを実行できるようにキーバインドを(例えば)C-x bに割り当てておきます。
      .emacsに以下の設定を記述します。

      ;; anything
      (global-set-key (kbd "C-x b") 'anything)

      今回は詳しい説明は割愛しますが是非使いこなしてみてください。

      Auto Complete Modeのインストール

      Auto Complete Modeはインライン上での補完フレームワークです。
      よくNetBeansやEclipseなどのIDEでソースコード入力中に補完候補を出して選択できるアレです。
      Auto Complete Modeもauto-install-batchを利用して一気にインストールすることができます。

      M-x auto-install-batchでauto-complete development versionを選択します。

      .emacsに以下の設定を記述します。

      ;; auto-complete
      (require 'auto-complete)
      (require 'auto-complete-config)
      (global-auto-complete-mode t)
      (setq ac-auto-start t)

      設定反映後、.emacsのファイル上で文字列を入力すると補完候補がインライン上に表示されると思います。
      Auto Complete ModeもAnythingと同様フレームワークですので、様々な拡張が可能です。
      (こちらも詳しい説明は割愛します)

      PHP Modeのインストール

      PHP ModeはPHPの開発用のメジャーモードです。
      PHPのソースコードのシンタックスハイライトやインデント等のサポートをしてくれます。
      これもauto-install.elを利用してインストールをします。

      M-x auto-install-from-urlでhttp://php-mode.svn.sourceforge.net/svnroot/php-mode/tags/php-mode-1.5.0/php-mode.elをセットします。
      (ちなみにM-x install-elispでも構いません)

      .emacsに以下の設定を記述します。

      ;; php-mode
      (require 'php-mode)
       
      (setq php-mode-force-pear t) ;PEAR規約のインデント設定にする
      (add-to-list 'auto-mode-alist '("\\.php$" . php-mode)) ;*.phpのファイルのときにphp-modeを自動起動する

      php-completionのインストール

      php-completionはPHP開発用のマイナーモードです。
      AnythingやAuto Complete Modeのインターフェースを利用してさらにPHPの開発をサポートしてくれます。

      これもauto-install.elを利用してインストールをします。

      M-x auto-install-batchでphp-completionを選択します。

      Auto Complete Modeの設定も合わせて.emacsに以下の設定を記述します。

      ;; php-mode-hook
      (add-hook 'php-mode-hook
                (lambda ()
                  (require 'php-completion)
                  (php-completion-mode t)
                  (define-key php-mode-map (kbd "C-o") 'phpcmp-complete) ;php-completionの補完実行キーバインドの設定
                  (make-local-variable 'ac-sources)
                  (setq ac-sources '(
                                     ac-source-words-in-same-mode-buffers
                                     ac-source-php-completion
                                     ac-source-filename
                                     ))))

      これで今回のPHPの開発環境設定は完了です。

      実際にPHPファイルを開いてみてソースを書いてみたり、
      C-x bC-oといったキーバインドも実行してみてください。
      どのような動きをするか体感できると思います(そして是非体感してみてください)。

      今回紹介した開発環境の設定はほんの一例です。
      是非さらに自分にあったカスタマイズをしてみてください。

      これからも、Emacsを普及させるべくPHPに限らず他にも便利なEmacs Lispや設定例を紹介していきたいと思います。