■ユーザーズフォーラム リニューアルのお知らせ
新規投稿は新ユーザーズフォーラムにお願いします。

Re: 特定の親カテゴリーIDに属する子カテゴリーのリストで、[カテゴリ検索]は出来ないでしょうか?

n1215 > Re: 特定の親カテゴリーIDに属する子カテゴリーのリストで、[カテゴリ検索]は出来ないでしょうか? @ 2014/5/1 19:27
well 様

こんばんは。

追記:下記でなんとかなると思って試してみたらそんなことありませんでした。申し訳ないです。
検索用のインデックスが入っているcontentsテーブルに、最上位カテゴリのデータだけしか登録されていないようので、
ほかの部分もごっそりいじる、ないしプラグインとして作成しないと辛そうです。


お察しの通り、BcFormヘルパーのinputメソッドでは
 ・第一引数にinputやselectタグのid属性やname属性と対応する値
 ・第二引数のフォームのタイプなどの設定を表す連想配列
が利用されます。

$this->BcForm->input('Content.c', array('type' => 'select', 'options' => BcUtil::unserialize($this->BcBaser->siteConfig['content_categories']), 'empty' => 'カテゴリー: 指定しない ');


search.phpから出力されているHTMLのソースを見ていただければわかりやすいと思いますが、
第二引数の'options'にはそれぞれoptionタグの属性のvalueと表示に対応した連想配列が入っています。(今回はbaserCMSの仕様でたまたま一致していますが)

・HTMLソース
<form action="/index.php/contents/search" novalidate="novalidate" id="ContentSearchForm" method="get" accept-charset="utf-8">
<select name="c" id="ContentC">
<option value="">カテゴリー: 指定しない </option>
<option value="ニュース">ニュース</option>
<option value="スポーツ">スポーツ</option>
</select>
<input name="q" type="text" id="ContentQ"/>
<input class="submit_button" type="submit" value="検索"/>
</form>


・連想配列
array (size=2)
  'ニュース' => string 'ニュース' (length=12)
  'スポーツ' => string 'スポーツ' (length=12)


つまり、カテゴリ1の子カテゴリを引っ張ってきて、この形の連想配列に整形してやれば同じように検索フォームが使えるはずです。


・参考:baserCMSの処理
BcUtil::unserialize($this->BcBaser->siteConfig['content_categories'])

baserCMSは検索に利用するカテゴリー一覧をシリアライズして(Base64エンコードを行い)文字列に変換し、
site_configsテーブルに格納しています。
これはそのカテゴリ一覧のデータを引き出す際に、シリアライズした文字列からあるべき連想配列へと戻すという処理です。


●テーマヘルパーを作りました
-----------------------------------------------------------------
Blogヘルパーにあるカテゴリの子カテゴリを返してくれる機能があるかと期待したのですがなかったので、
BlogCategoryモデルから必要な値を引っ張ってくるコードを書いてみました。
テンプレートに直書きすると見栄えもメンテナンス性も悪いのでテーマヘルパーにしています。

・app/webroot/theme/テーマ名/Helper/MyBlogCategoryHeper.php
<?php 
/**
 *  Myブログカテゴリーヘルパー
 *
 */
App::uses('AppHelper', 'View/Helper');

class MyBlogCategoryHelper extends AppHelper {

/**
 * ブログカテゴリーモデル
 * 
 * @var BlogCategory
 */
	private $BlogCategory;

/**
 * コンストラクタ
 *
 * @param object $View
 * @param array $settings
 * @return void
 */
	public function __construct(View $View, $settings = array()) {
		parent::__construct($View, $settings);
		if (ClassRegistry::isKeySet('Blog.BlogCategory')) {
			$this->BlogCategory = ClassRegistry::getObject('Blog.BlogCategory');
		} else {
			$this->BlogCategory = ClassRegistry::init('Blog.BlogCategory');
		}
	}

/**
 * IDで指定したカテゴリの子カテゴリを、検索に利用するselectタグのoptionのリストとして取得する
 * 
 * @param int $parent_id 親カテゴリのID
 * @return array $selectOptions
 */

	public function getSelectOptions($parent_id) {
		$conditions = array('parent_id' => $parent_id); //検索条件
		$fields = array('title'); //取得するフィールド名

		//カテゴリを取得
		$categories = $this->BlogCategory->find('all', array(
			'conditions' => $conditions,
			'fields' => $fields
		));

		// Hashクラスで連想配列を加工
		$selectOptions = Hash::combine($categories, '{n}.BlogCategory.title', '{n}.BlogCategory.title');
		return $selectOptions;
	}
}



・テンプレートでの使い方
※テーマディレクトリの中:app/webroot/theme/テーマ名/Elements/search.phpに設置するとbaserコアを書き換えることなく上書きできます
<?php $select_options = $this->MyBlogCategory->getSelectOptions(1) //引数には親カテゴリのIDを調べて入れてください ?>
<div class="section search-box">
	<?php echo $this->BcForm->create('Content', array('type' => 'get', 'action' => 'search', 'url' => $url)) ?>
	<?php echo $this->BcForm->input('Content.c', array('type' => 'select', 'options' => $select_options, 'empty' => 'カテゴリー: 指定しない ')) ?>
	<?php echo $this->BcForm->input('Content.q') ?>
	<?php echo $this->BcForm->submit('検索', array('div' => false, 'class' => 'submit_button')) ?>
	<?php echo $this->BcForm->end() ?>
</div>

Twitter: @n_1215

ログイン
ユーザー名:
パスワード:


  新規登録 / パスワード紛失

検索

facebook
フォーラムで悩みが解決した場合など、よかったら「いいね!」をポチっとクリックしてください!質問の回答者や開発者の励みになります

フォーラムガイド


関連リンク

オンライン状況
5 人のユーザが現在オンラインです。 (5 人のユーザが フォーラム を参照しています。)

登録ユーザ: 0
ゲスト: 5