特定の親カテゴリーIDに属する子カテゴリーのリストで、[カテゴリ検索]は出来ないでしょうか?
well > 特定の親カテゴリーIDに属する子カテゴリーのリストで、[カテゴリ検索]は出来ないでしょうか? @ 2014/4/28 1:40 |
---|
baserCMSの関係者の皆様、いつもお世話になっております。
現在、検索が中枢機能となるサイトをbaserCMS3で作りたいと考えております。 フロント機能一覧にて、「サイト内検索:サイト内のコンテンツをカテゴリ別に検索できます。各コンテンツは検索除外設定を行う事ができます。」 という情報を知り、早速試しに実装テストをしてみたところ、 例えば、3つの親カテゴリーを作成した下記の例では、
サイト内検索のセレクトボックスには、
と表示されます。 残念ながらこれは本意の選択肢ではなく、 親カテゴリーがカテゴリ1の子カテゴリーのリストである、
以上のように表示させたい状況です。 親カテゴリーを全部削除して、カテゴリ1の子カテゴリーリストのみで 親カテゴリーを構成すれば、表示は可能ですが、 カテゴリー機能は非常に便利ですので、確実に複数回使いそうですし、 また、親カテゴリーとして、/category/を作成すると、 のちのち全体の条件分岐処理で、非常に重宝すると考えております。 ファイル \basercms\lib\Baser\View\Elements\search.php の中身を デバッガを使って変数を確認してみましたが、
この部分ですが、今の私の理解では改変は難しい状況です。 少し話が離れますが、 固定ページのリスト取得では、下記のように関数getPageList()にて、 親となるページカテゴリのidを指定することで、 子のページカテゴリリストを表示させられることを確認しました。
getPageList()のように親カテゴリのidを指定することで、子カテゴリのリストをカテゴリ検索のセレクトボックスに対応させられる方法がありましたら、どうかご教示いただけますよう、よろしくお願いいたします。 ■ BaserCMS:3.0.6.1 |
n1215 > Re: 特定の親カテゴリーIDに属する子カテゴリーのリストで、[カテゴリ検索]は出来ないでしょうか? @ 2014/5/1 19:27 |
---|
well 様
こんばんは。 追記:下記でなんとかなると思って試してみたらそんなことありませんでした。申し訳ないです。 検索用のインデックスが入っているcontentsテーブルに、最上位カテゴリのデータだけしか登録されていないようので、 ほかの部分もごっそりいじる、ないしプラグインとして作成しないと辛そうです。 お察しの通り、BcFormヘルパーのinputメソッドでは ・第一引数にinputやselectタグのid属性やname属性と対応する値 ・第二引数のフォームのタイプなどの設定を表す連想配列 が利用されます。
search.phpから出力されているHTMLのソースを見ていただければわかりやすいと思いますが、 第二引数の'options'にはそれぞれoptionタグの属性のvalueと表示に対応した連想配列が入っています。(今回はbaserCMSの仕様でたまたま一致していますが) ・HTMLソース
・連想配列
つまり、カテゴリ1の子カテゴリを引っ張ってきて、この形の連想配列に整形してやれば同じように検索フォームが使えるはずです。 ・参考:baserCMSの処理
baserCMSは検索に利用するカテゴリー一覧をシリアライズして(Base64エンコードを行い)文字列に変換し、 site_configsテーブルに格納しています。 これはそのカテゴリ一覧のデータを引き出す際に、シリアライズした文字列からあるべき連想配列へと戻すという処理です。 ●テーマヘルパーを作りました ----------------------------------------------------------------- Blogヘルパーにあるカテゴリの子カテゴリを返してくれる機能があるかと期待したのですがなかったので、 BlogCategoryモデルから必要な値を引っ張ってくるコードを書いてみました。 テンプレートに直書きすると見栄えもメンテナンス性も悪いのでテーマヘルパーにしています。 ・app/webroot/theme/テーマ名/Helper/MyBlogCategoryHeper.php
・テンプレートでの使い方 ※テーマディレクトリの中:app/webroot/theme/テーマ名/Elements/search.phpに設置するとbaserコアを書き換えることなく上書きできます
Twitter: @n_1215 |
well > Re: 特定の親カテゴリーIDに属する子カテゴリーのリストで、[カテゴリ検索]は出来ないでしょうか? @ 2014/5/1 22:24 |
---|
n1215様
初めまして、wellと申します。 この度は、私の不確定要素の多い質問に対して、 ご丁寧に、分析過程とヘルパーの作り方、使い方まで教えていただき、誠にありがとうございました。 オブジェクト指向プログラミングは、私は初心者で目で追ってなんとか理解する程度ですので n1215様がご自身で書かれたプロセスはとても勉強になりました。ありがとうございます。 引用:
結論として以上の点を、n1215様に明確に示していただけましたので、私もなんとか気持ち的に一区切り出来そうです。 contentsテーブルが検索用のインデックスの出どころなんですね。 私もこの2日ぐらいxdebugで変数を追ったりして悪足掻きしていましたが、行き来するファイルの数が尋常じゃないのでw、 コアプログラムを根本から理解するのは無理だと悟り、とりあえず当初に考えた妥協案 引用: 親カテゴリーを全部削除して、カテゴリ1の子カテゴリーリストのみで カテゴリ1の子カテゴリのみを親カテゴリとして登録して、それらのリストをセレクトボックスに表示することができました。 また検索のセレクトボックスの件から少し離れる話題ですが、付随する話として、 分類に便利な/category/フォルダはなくなりましたが、 代わりに各カテゴリページ名に_(アンダースコア)をつけて条件分岐を働かせ、 ウィジェットに、各カテゴリページ専用のリストをPHPテンプレートを使って出すこととしました。
以上のコードを修正しているうちに思い出しました。 そもそもなぜ、わざわざ親カテゴリとしてカテゴリ(/category/)を設定して、表示したいカテゴリリストを子カテゴリにしたのか? n1215様も触れられていましたが、 blogヘルパーには、[getCategoryList] カテゴリーの一覧をリストタグで取得する、という関数がありますが、 固定ページには同様なものが見つからず、 少し似た関数で、BcBaserヘルパーに、 [getPageList] ページ機能で作成したページの一覧データを取得する、という関数があり、 引数を指定しなければ全ての固定ページの一覧データを取得し、 引数にページカテゴリに割り振られたNOを指定すれば、そのページカテゴリに属するすべての固定ページの一覧データを取得してくれます。 このことから例えばトップページには、親カテゴリのNOを指定するだけですべての子カテゴリページリストを出せました。 しかし、親カテゴリとしてカテゴリ(/category/)をなくしたことで、それが出来なくなりました。 その代用として、用いたのが、上のコードの下の部分です。 引用:
配列の一部を取得して配列で返す関数 array_slice() 引数の17は要素番号、4はそこから要素4つの意味です。 ちょっと苦しいですが、一応対応させることは出来ました。 以上で、なんとか当初に希望していた動作はしてくれるだろうとほっとしましたが、 また問題が一つ見つかってしまいました。 セレクトボックスに表示されるリストが、想定していた「配列順」ではなく、 どうやら「文字のコード番号の昇順」に表示されていることです。 これは、ウィジェットに乗せたリストの順序と異なりますので困ってしまいました。 これも解決は難しそうですね。 以上より、今回は、検索のセレクトボックスのリストについて、当初の質問と合わせて2点、困難な問題がわかりましたので、 フィードバック・改善要望 の方に投稿してみたいと思っております。 n1215様、誠にありがとうございました。 ■ BaserCMS:3.0.6.1 |
n1215 > Re: 特定の親カテゴリーIDに属する子カテゴリーのリストで、[カテゴリ検索]は出来ないでしょうか? @ 2014/5/2 14:57 |
---|
well 様
ブログのコードを載せましたが、固定ページのほうだったんですね。 いろいろ勘違いしていてすみません。 下記のようにしておけば、特にアンダースコアで判別せずとも問題ないかと思います。
Twitter: @n_1215 |
well > Re: 特定の親カテゴリーIDに属する子カテゴリーのリストで、[カテゴリ検索]は出来ないでしょうか? @ 2014/5/2 20:55 |
---|
n1215様
ご返信ありがとうございます。 引用:
こちらこそ、説明が足りなかったようで失礼しました。 引用: 下記のようにしておけば、特にアンダースコアで判別せずとも問題ないかと思います。 basercmsは関数がいろいろありますので、工夫次第でいろいろな解決法がつくれますね。 else文以下のコードは、cakephpをこなす方がよく駆使される、findを使ったデータ取得ですね。 動かしてみましたが、else側が通らなかったので少し考えてみましたが、 basercmsで各カテゴリページを作ってもそのindexページは作られないからかもしれませんね。 (的外れだったらスミマセン) cakeのfindを使いこなせる方は検索プラグインも自作される方も多いんでしょうね。 n1215様、cakeも勉強させていただきまして誠にありがとうございました。 ■ BaserCMS:3.0.6.1 |
n1215 > Re: 特定の親カテゴリーIDに属する子カテゴリーのリストで、[カテゴリ検索]は出来ないでしょうか? @ 2014/5/2 22:26 |
---|
well 様
本当はbaserCMSで用意されているヘルパーを組み合わせて作れると後々のメンテナンスも楽なんですけどね。 Pageヘルパーあたりに機能が追加されると嬉しいところです。 検索に関してはネストしたカテゴリの情報をcontentsテーブルに格納する仕様になれば子カテゴリの検索にも対応できそうですが。 後方互換性を考えると難しいかもしれません。 引用: else文以下のコードは、cakephpをこなす方がよく駆使される、findを使ったデータ取得ですね。 ご推察のとおりです。各カテゴリのトップとしてindexページがあることを前提としたコードです。 カテゴリを作っただけでindexページが登録されていない場合にも対応させるには少々変更しないといけないですね。 自分もbaserCMSの仕様はまだまだ把握しきれていない部分があるので、 コアのHelperを参考にしたりModelのソースを読んだりしながら書いています。 Twitter: @n_1215 |
well > Re: 特定の親カテゴリーIDに属する子カテゴリーのリストで、[カテゴリ検索]は出来ないでしょうか? @ 2014/7/7 20:28 |
---|
自己レスです。
個人的にbaserCMSのデータベースで事故り、多くのテーブルを手動で直す作業で難儀しましたが、 おかげでbaserCMSについてまた少し知識が向上したようで、上記の一つの課題が解決しました。 1行追加しただけですが、初めてコアを弄ることもあり、備忘録として記させていただきます。 引用:
検索窓の横につくカテゴリー検索のセレクトボックスですが、idの昇順にするには、 まず、 \lib\Baser\Model\Behavior\BcContentsManagerBehavior.php を \app\Model\Behavior\BcContentsManagerBehavior.php に複写し、このファイルに以下の修正を加える。
以上でidの昇順になりました。 ■ BaserCMS:3.0.6.1 |