SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

symfony入門

symfony入門(3):掲示板アプリケーション作成でsymfonyを理解しよう(後篇)

symfonyによる実践的なPHPアプリケーション開発


  • X ポスト
  • このエントリーをはてなブックマークに追加

検索機能/カスタムヘルパー

 ここまでで掲示板アプリケーションに返信、削除、ページャーの各機能が実装されました。ここから検索機能を実装しますが、検索結果表示の際、検索文字列を強調表示すべく、カスタムヘルパーを設定してみましょう。

 その前にまずは、検索用フォームとアクションを作成します。

検索用フォームの作成:listSuccess.php

 リスト画面に検索文字列入力フォームと、検索ボタンを追加します。

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を設定して行います。今回はTITLEAUTHORBODYの3つのフィールドから検索を行うため、それぞれ別個に検索基準を設定し、orでまとめる必要があります。

actions.class.php(抜粋)
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」を定義します。

SearchHelper.php
<?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を表示するようにします。削除処理された投稿は表示しません。先程作成したカスタムヘルパーも使用します(ページャー機能は割愛します)。

SearchSuccess.php
//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; ?>
 :
 :

 先程定義したヘルパーのおかげで、ハイライトされた各項目表示部分の記述がすっきりしました。以下は検索結果表示画面です。

検索結果表示
検索結果表示

次のページ
リファクタリング:ロジックをまとめる

修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
symfony入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 川北 季(カワキタ ミノル)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/911 2007/03/09 10:08

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング