検索フォームと検索結果ページを作ってみた2の続き。


/site(サイトID)/script/soycms_search.php

上記のディレクトリに配置したPHPファイルに検索のためのスクリプトを書いてみる。


function entry_search(){
	//ブログに設定しているラベルIDはベタ打ち
	$blogLabelId = 1;
	
	//検索フォームに入力した文字列を取得してみる。何も取得できなければ空の配列を返して終了
	if(!isset($_GET["q"]) || strlen(trim($_GET["q"])) === 0) return array();
	$query = htmlspecialchars(trim($_GET["q"]), ENT_QUOTES, "UTF-8");
	
	//検索のためのSQL構文
	$sql = "SELECT * FROM Entry entry ".
			"INNER JOIN EntryLabel label ".
			"ON entry.id = label.entry_id ".
			"INNER JOIN EntryAttribute attr ".
			"ON entry.id = attr.entry_id ".
			"WHERE label.label_id = :label_id ".
			"AND (entry.title LIKE :query OR entry.content LIKE :query OR entry.more LIKE :query) ".
			"AND entry.isPublished = 1 ".
			"AND entry.openPeriodEnd >= :now ".
			"AND entry.openPeriodStart < :now ".
			"ORDER BY entry.cdate desc ";

	//プレースホルダ-で使うバインド変数
	$binds = array(
			":label_id" => $blogLabelId,
			":query" => "%" . $query . "%",
			":now" => time()
	);
	
	//下記の5行でSQL構文を実行
	$dao = SOY2DAOFactory::create("cms.EntryDAO");
	try{
		$results = $dao->executeQuery($sql, $binds);
	}catch(Exception $e){
		return array();
	}
	
	//検索結果を一旦SOY CMSで使える様にEntryオブジェクトに変換してから結果用の配列に入れる
	$soycms_search_result = array();
	foreach($results as $key => $row){
		if(isset($row["id"]) && (int)$row["id"]){
			//取得できた記事の配列をSOY CMSで使うための記事のオブジェクトに変換
			$soycms_search_result[$row["id"]] = $dao->getObject($row);
		}
	}
	
	return $soycms_search_result;
}

上記のスクリプトを書くにあたって参考にしたサイトは下記になる。

SOY2DAOで外部のデータベースから値を取得する | SOY CMS開発ブログ

SOY App開発の説明 SOY2DAOでデータベースを利用する1 | SOY CMS開発ブログ


上記のスクリプト内のコメントにある

記事のオブジェクトというのは、


/common/domain/cms/Entry.class.php

上記ファイル内のオブジェクトを指し、


foreach($results as $key => $row){
	if(isset($row["id"]) && (int)$row["id"]){
		//取得できた記事の配列をSOY CMSで使うための記事のオブジェクトに変換
		$soycms_search_result[$row["id"]] = $dao->getObject($row);
	}
}

検索結果の記事配列が$rowに格納されている時、$dao->getObject($row);でEntryオブジェクトに変換される。

変換されたEntryオブジェクトを$soycms_search_result配列に入れることで、

ページに記載した<!-- block:id="result" -->で表示できる様になる。




ここまでできたら、



フォーム部分のHTMLを


<form method="get" id="searchform" action="/search">	
	<fieldset>
		<input name="q" placeholder="Search this Site..." type="text" value="">
		<input id="search-image" class="sbutton" src="/site/images/search.png" type="image">
	</fieldset>
</form>

こんな感じでテンプレートに記載して終了。

設置後に検索してみて、結果が表示されるか確認しましょう。