検索機能/カスタムヘルパー
ここまでで掲示板アプリケーションに返信、削除、ページャーの各機能が実装されました。ここから検索機能を実装しますが、検索結果表示の際、検索文字列を強調表示すべく、カスタムヘルパーを設定してみましょう。
その前にまずは、検索用フォームとアクションを作成します。
検索用フォームの作成:listSuccess.php
リスト画面に検索文字列入力フォームと、検索ボタンを追加します。
<div align="right"> <?php echo form_tag('bbsdata/search') ?> <?php echo input_tag('kensaku_key', '') ?> <?php echo submit_tag('検索') ?> </form> </div>
検索語を「kensaku_key」としてsearchアクションへ送ります。
検索用アクションの作成:executeSearch()
実際の検索はCriteriaを設定して行います。今回はTITLE
、AUTHOR
、BODY
の3つのフィールドから検索を行うため、それぞれ別個に検索基準を設定し、orでまとめる必要があります。
public function executeSearch () { $this->skey = $this->getRequestParameter('kensaku_key'); $c = new Criteria(); $c1 = $c->getNewCriterion(BbsdataPeer::AUTHOR, '%'.$this->skey.'%', Criteria::LIKE); $c2 = $c->getNewCriterion(BbsdataPeer::TITLE, '%'.$this->skey.'%', Criteria::LIKE); $c3 = $c->getNewCriterion(BbsdataPeer::BODY, '%'.$this->skey.'%', Criteria::LIKE); $c1->addOr($c2); $c1->addOr($c3); $c->add($c1); $c->addDescendingOrderByColumn(BbsdataPeer::ID); $this->bbsdatas = BbsdataPeer::doSelect($c); }
「->getNewCriterion(<モデルクラス名>Peer::<大文字フィールド名>, <検索文字列>, Criteria::<比較演算子記述(LIKE, EQUAL等)>)
」メソッドで、抽出基準を定めています。
カスタムヘルパーの作成
検索結果の表示では、検索文字列がマッチした部分の背景を黄色にして表示するようにしますが、symfonyのヘルパーではそのようなものはない(単純な強調表示を行うhighlight_text()
ヘルパーはある)ので、カスタムヘルパーとして作成します。
カスタムヘルパーはアプリケーションフォルダ内の「lib/helper」フォルダ(デフォルトでは存在しないので作成する)内に「<カスタムヘルパー名(個々のヘルパー名ではなく、このファイル内で定義するヘルパー群の総称)>Helper.php」というファイルを置いて定義します。今回は「SearchHelper.php」を作成し、カスタムヘルパーhighlight_and_format_text($text, $sentence)
、highlight_mail_to
」を定義します。
<?php function highlight_and_format_text($text, $sentence) { return nl2br(str_replace($sentence, '<span style=\'background-color: #ff0\'>'.$sentence.'</span>', $text)); } function highlight_mail_to($address, $text, $sentence) { return str_replace($sentence, '<span style=\'background-color: #ff0\'>'.$sentence.'</span>', $text).' <<a href=\'mailto:'.$address.'\'>'.$address.'</a>>'; } ?>
highlight_and_format_text($text, $sentence)
では$text
内の$sentence
の背景を黄色にして、改行文字を<br />
に置換しています。また、メールリンクが張られていたauthor表示をハイライトさせたいので、ハイライトとアドレスの別表示を行うhighlight_mail_to($address, $text, $sentence)
を定義し、mail_to
ヘルパーの代わりに用いることにします。
作成したファイルはテンプレート内で次のように宣言します。
<?php use_helper('Search') ?>
カスタムヘルパー定義ファイル「***Helper.php」の***の部分をuse_helper()
内に宣言すれば、「***Helper.php」内に定義したすべてのヘルパーが使用可能になります。
カスタムヘルパーを用いたビュー(searchSuccess.php)の作成
検索結果表示画面を作成します。「listSuccess.php」をベースに作成していますが、スレッド表示は行わず、書き込み日時の横に親記事/返信記事の区別、返信記事の場合は親記事のidを表示するようにします。削除処理された投稿は表示しません。先程作成したカスタムヘルパーも使用します(ページャー機能は割愛します)。
//SearchHelper.phpに定義したカスタムヘルパーの使用を宣言 <?php use_helper('Search') ?> //Searchアクションから検索文字列$skeyを受け取り表示) <h1>検索結果: <?php echo $skey ?> </h1> : : <?php foreach ($bbsdatas as $bbsdata): ?> <?php if ($bbsdata->getTitle() != "DELETED"): ?> : : <tbody> <tr> //TITLEとAUTHORフィールドの表示にカスタムヘルパーを使用 <td> <?php echo $bbsdata->getId() ?> </td> <td> <big><?php echo highlight_and_format_text($bbsdata->getTitle(), $skey) ?></big> </td> <td> <?php echo highlight_mail_to($bbsdata->getMail(), $bbsdata->getAuthor(), $skey) ?> </td> <td> <small>[<?php echo $bbsdata->getCreatedAt() ?>]</small> </td> <td> <?php echo link_to('Url', $bbsdata->getUrl()) ?> </td> <td> //親記事であれば「Parent article」と表示 <?php if ($bbsdata->getParentId() == 0): ?> <?php echo '<b> Parent article </b>' ?> <?php else: ?> //返信記事であれば親記事のidを表示 <?php echo '<i> Parent article id:'.$bbsdata->getParentId().'</i>' ?> <?php endif; ?> </td> </tr> </tbody> </table> <br /> //カスタムヘルパー使用 <p> <?php echo highlight_and_format_text($bbsdata->getBody(), $skey) ?> </p> <br /> <br /> : : <?php endif ?> <?php endforeach; ?> : :
先程定義したヘルパーのおかげで、ハイライトされた各項目表示部分の記述がすっきりしました。以下は検索結果表示画面です。