URLパラメータからの動的絞り込みのためのカテゴリー表示について

「まったく何も分からない・・・」そんなユーザーさんの為のフォーラムです。どんなご質問でもお気軽にどうぞ。
返信
Dospec
記事: 9
登録日時: 2017年6月07日(水) 14:46

URLパラメータからの動的絞り込みのためのカテゴリー表示について

投稿記事 by Dospec » 2017年6月21日(水) 18:32

URLパラメータからの動的な絞り込み指定について、リファレンスマニュアルよりURLパラメーターによるエントリーリストの絞り込み表示ができるのは理解できました。
そのためにFORMのget送信にて絞り込みのためのmenu項目を送信するためのセレクトボックスを作成しようとしているのですが、当然言えば当然かもしれませんが、指定したmenu項目がエントリーの数分表示されてしまいます。

例)飲食店の紹介

店名:TITLE
カテゴリー:CATEGORY

■スキーマ:tenpo.design.xsl内

コード: 全て選択

<data name="CATEGORY" type="menu" caption="ジャンル" group="True">
  <menuitem id="1">和食</menuitem>
  <menuitem id="2">中華</menuitem>
 <menuitem id="3">イタリアン</menuitem>
   <menuitem id="4">フレンチ</menuitem>
</data>
■ウェブサイトへの埋め込み:tenpolist.html

コード: 全て選択

<form action="tenpolist.html"  name="contact" id="contact" method="get" enctype="application/x-www-form-urlencoded" accept-charset="UTF-8" autocomplete="on">

	<fieldset form="contact" name="tenpowrap">
		<label form="contact" for="tenpo">ジャンルを選択:</label>
		<select id="tenpo" name="tenpo">
			<cmsd:entrylist name="tenpo" design="filter" navigation="on" rows="99">
				<cmsd:param key="CATEGORY" />
			</cmsd:entrylist>
		</select>
	</fieldset>
	<input type="submit" class="submit" value="submit" />
</form>

送信されたURL:tenpolist.html?CATEGORY=2
■デザイン定義:tenpo.list.filter.design.xsl

コード: 全て選択

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" encoding="UTF-8" omit-xml-declaration="yes" />
<xsl:template match="/entrylist">

	<option value="">select...</option>

	<xsl:for-each select="entry">

	<!-- CATEGORY パラメータを$category変数に格納 -->
	<xsl:variable name="category" select="//param[@key='CATEGORY']/@value" />

		<xsl:if test="CATEGORY'=$category">
			<option value="{CATEGORY}">
				<xsl:attribute name="selected">selected</xsl:attribute>
				<xsl:value-of select="CATEGORY/@label"" disable-output-escaping="yes" />
			</option>
		</xsl:if>
		<xsl:if test="CATEGORY'!=$category">
			<option value="{CATEGORY}">
				<xsl:value-of select="CATEGORY/@label"" disable-output-escaping="yes" />
			</option>
		</xsl:if>

	</xsl:for-each>

</xsl:template>
</xsl:stylesheet>
このように定義すると、セレクトボックス内にエントリーの数だけ表示されてしまいます。
(※エントリーが10件あった場合)

コード: 全て選択

      <select id="tenpo" name="tenpo">
			<option value="1">和食</option>
			<option value="1">和食</option>
			<option value="2">中華</option>
			<option value="1">和食</option>
			<option value="1">和食</option>
			<option value="2">中華</option>
			<option value="2">中華</option>
			<option value="1">和食</option>
			<option value="3">イタリアン</option>
			<option value="1">和食</option>
      </select>
これを下記のように、エントリー数に関係なくmenu項目の数だけのセレクトボックスをデザイン定義で作ることは可能でしょうか?

コード: 全て選択

      <select id="tenpo" name="tenpo">
			<option value="1">和食</option>
			<option value="2">中華</option>
			<option value="3">イタリアン</option>
			<option value="3">フレンチ</option>
      </select>
最後に編集したユーザー Dospec on 2017年6月22日(木) 17:09 [ 編集 1 回目 ]

Dospec
記事: 9
登録日時: 2017年6月07日(水) 14:46

Re: URLパラメータからの動的絞り込みのためのカテゴリー表示について

投稿記事 by Dospec » 2017年6月22日(木) 16:48

自己解決いたしましたのでご報告いたします。
フォーラムの下記の記事を参考にいたしました。
2006年の投稿でかなり古いのでこれで合っているのか?もっとスマートなやり方があるのかはわかりませんが・・・

「カテゴリ毎の件数を出力する/メニュー項目選択肢をデザイン定義に読み込む」
http://cms.al-design.jp/phpbb/viewtopic.php?t=546

以下、修正後の記述です。

■スキーマ:tenpo.design.xsl内

コード: 全て選択

<data name="CATEGORY" type="menu" caption="ジャンル" group="True">
	<menuitem id="100">※選択してください。</menuitem>
	<menuitem id="1">和食</menuitem>
	<menuitem id="2">中華</menuitem>
	<menuitem id="3">イタリアン</menuitem>
	<menuitem id="4">フレンチ</menuitem>
</data>
■デザイン定義:tenpo.list.filterX.design.xsl

コード: 全て選択

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" encoding="UTF-8" omit-xml-declaration="yes" />

	<!-- CATEGORYパラメータを$category変数に格納 -->
	<xsl:variable name="category" select="//param[@key='CATEGORY']/@value" />

   <!-- スキーマファイルからmenu項目のジャンル(CATEGORY)を読み込み、$preflist という変数に格納する -->
   <xsl:variable name="preflist" select="document('tenpo.schema.xml')/schema/data[@name='CATEGORY']/menuitem" />

<xsl:template match="/entrylist">

   <!-- エントリのCATEGORY項目のみを$entryprefsに格納 -->
   <xsl:variable name="entryprefs" select="entry/CATEGORY" />

	<!-- セレクトボックスの未選択時の初期値 -->
	<option value="">select...</option>

	<xsl:for-each select="$preflist">

	<!-- メニュー項目の最初の「※選択してください。」項目を非表示 -->
	<xsl:if test="not(position()=1)">

		<!-- CATEGORYパラメータと@idが一致する時、option項目に「selected」属性を付与 -->
		<xsl:if test="@id=$category">
			<option value="{@id}">
				<xsl:attribute name="selected">selected</xsl:attribute>
				<xsl:value-of select="../../CATEGORY/@label" disable-output-escaping="yes" />
				<xsl:variable name="prefid" select="@id" />
				<xsl:value-of select="text()" />
			<!-- 念のためメニュー項目一行目の「※選択してください。」で保存されたエントリーの件数を非表示 -->
			<xsl:if test="not($prefid='100')">
				(<xsl:value-of select="count($entryprefs[text()=$prefid])" />)
			</xsl:if>
			</option>
		</xsl:if>
		<xsl:if test="@id!=$category">
			<option value="{@id}">
				<xsl:value-of select="../../CATEGORY/@label" disable-output-escaping="yes" />
				<xsl:variable name="prefid" select="@id" />
				<xsl:value-of select="text()" />
			<xsl:if test="not($prefid='100')">
				(<xsl:value-of select="count($entryprefs[text()=$prefid])" />)
			</xsl:if>
			</option>
		</xsl:if>
	</xsl:if>

	</xsl:for-each>

</xsl:template>

</xsl:stylesheet>
■ウェブサイトへの埋め込み:tenpolist.html

コード: 全て選択

<form action="tenpolist.html"  name="contact" id="contact" method="get" enctype="application/x-www-form-urlencoded" accept-charset="UTF-8" autocomplete="on">

   <fieldset form="contact" name="tenpowrap">
      <label form="contact" for="tenpo">ジャンルを選択:</label>
      <select id="tenpo" name="tenpo">
         <cmsd:entrylist name="tenpo" design="filterX" navigation="on" rows="99">
            <cmsd:param key="CATEGORY" />
         </cmsd:entrylist>
      </select>
   </fieldset>
   <input type="submit" class="submit" value="submit" />
</form>

送信されたURL:tenpolist.html?CATEGORY=2
■セレクトボックスの表示結果

コード: 全て選択

<select id="tenpo" name="tenpo">
	<option value="1">和食(6)</option>
	<option value="2">中華(3)</option>
	<option value="3">イタリアン(1)</option>
	<option value="4">フレンチ(0)</option>
</select>
以上で望み通りの、エントリー数に関係なく、重複しているカテゴリーをまとめたカテゴリー一覧のセレクトボックスが作れました!
しかもなんと!当初予定してなかった件数まで表示できるようになりました!
最後に編集したユーザー Dospec on 2017年6月22日(木) 17:07 [ 編集 1 回目 ]

Dospec
記事: 9
登録日時: 2017年6月07日(水) 14:46

Re: URLパラメータからの動的絞り込みのためのカテゴリー表示について

投稿記事 by Dospec » 2017年6月22日(木) 17:06

カテゴリーが0件の項目をセレクトボックスに表示しても仕方ないので、0件のカテゴリーは非表示になるように修正しました。

■デザイン定義:tenpo.list.filterX.design.xsl

コード: 全て選択

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" encoding="UTF-8" omit-xml-declaration="yes" />

   <!-- CATEGORYパラメータを$category変数に格納 -->
   <xsl:variable name="category" select="//param[@key='CATEGORY']/@value" />

   <!-- スキーマファイルからmenu項目のジャンル(CATEGORY)を読み込み、$preflist という変数に格納する -->
   <xsl:variable name="preflist" select="document('tenpo.schema.xml')/schema/data[@name='CATEGORY']/menuitem" />

<xsl:template match="/entrylist">

   <!-- エントリのCATEGORY項目のみを$entryprefsに格納 -->
   <xsl:variable name="entryprefs" select="entry/CATEGORY" />

   <!-- セレクトボックスの未選択時の初期値 -->
   <option value="">select...</option>

   <xsl:for-each select="$preflist">

		<xsl:variable name="prefid" select="@id" />

   <!-- メニュー項目の最初の「※選択してください。」項目を非表示 -->
   <xsl:if test="not(position()=1)">
	<!-- 件数が「0」件の項目を非表示 -->
	<xsl:if test="not(count($entryprefs[text()=$prefid])=0)">
      <!-- CATEGORYパラメータと@idが一致する時、option項目に「selected」属性を付与 -->
      <xsl:if test="@id=$category">
         <option value="{@id}">
            <xsl:attribute name="selected">selected</xsl:attribute>
            <xsl:value-of select="../../CATEGORY/@label" disable-output-escaping="yes" />
            <xsl:value-of select="text()" />
         <!-- 念のためメニュー項目一行目の「※選択してください。」で保存されたエントリーの件数を非表示 -->
         <xsl:if test="not($prefid='100')">
            (<xsl:value-of select="count($entryprefs[text()=$prefid])" />)
         </xsl:if>
         </option>
      </xsl:if>
      <xsl:if test="@id!=$category">
         <option value="{@id}">
            <xsl:value-of select="../../CATEGORY/@label" disable-output-escaping="yes" />
            <xsl:value-of select="text()" />
         <xsl:if test="not($prefid='100')">
            (<xsl:value-of select="count($entryprefs[text()=$prefid])" />)
         </xsl:if>
         </option>
      </xsl:if>
	</xsl:if>
   </xsl:if>

   </xsl:for-each>

</xsl:template>

</xsl:stylesheet>
■セレクトボックスの表示結果

コード: 全て選択

<select id="tenpo" name="tenpo">
	<option value="1">和食(6)</option>
	<option value="2">中華(3)</option>
	<option value="3">イタリアン(1)</option>
</select>

返信