カテゴリ別の一覧ページで記事がある時とない時の表示について

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

カテゴリ別の一覧ページで記事がある時とない時の表示について

投稿記事 by hacmoy » 2016年8月05日(金) 09:19

お世話になっております。
CMSデザイナーをお客様のWEBサイトの更新に使用している者です。

記事を登録する時に、カテゴリ(お店)にチェックを入れて登録し、カテゴリごとに一覧ページを表示させています。
そこに、記事の無いカテゴリには、「記事がありません」のようなテキストを表示させたいのですが、私自身がXMLに詳しく無く方法が分かりません。

現在、下記のようなソースコードを使用しています。
エントリ一覧用デザインは、登録した画像とテキストがスライダーで流れるデザインになっています。

コード: 全て選択

----------スキーマファイル----------
<data name="categ" type="menu" caption="実施店舗" group="True">
		<menuitem id="shop-a">A店</menuitem>
		<menuitem id="shop-b">B店</menuitem>
		<menuitem id="shop-c">C店</menuitem>
		<menuitem id="shop-d">D店</menuitem>
</data>

コード: 全て選択

----------エントリ一覧用デザイン----------
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
	<xsl:output method="html" encoding="EUC-JP" omit-xml-declaration="yes" />
	<xsl:template match="/entrylist">

	<div>
	<xsl:for-each select="entry">
	<xsl:if test="categ = 'shop-b"><!--B店のエントリ内容を表示する-->
		<div class="ui-tabs-panel"><xsl:attribute name="id">fragment-<xsl:number value="position()" format="1"/></xsl:attribute>
		<xsl:choose>
			<xsl:when test="url/text()">
				<a href="{url}"><img src="/{topimg}" alt="{title}" class="hvr" /></a>
			</xsl:when>
			<xsl:otherwise>
				<a href="/event/index-campaign-web.php{@href}"><img src="/{topimg}" alt="{title}" class="hvr" /></a>
			</xsl:otherwise>
		</xsl:choose>
		</div>
		</xsl:if>
		</xsl:for-each>
	</xsl:if>
	</xsl:template>
</xsl:stylesheet>

コード: 全て選択

-------呼び出しコード--------
<cmsd:entrylist name="campaign-nomal" design="shop-b" rows="8" tagremoving="on" />
上記のエントリ一覧用デザインのコードは、B店にエントリーがあった時の表示になりますが、B店に登録記事がない時「記事がありません」のようなテキストを表示させたい場合の記述方法をご教示いただけますととても助かります。

お手数おかけいたしますが、何卒よろしくお願いいたします。

webmaster
Site Admin
記事: 1447
登録日時: 2004年12月10日(金) 10:09

Re: カテゴリ別の一覧ページで記事がある時とない時の表示について

投稿記事 by webmaster » 2016年8月09日(火) 18:00

hacmoyさん、ご質問ありがとうございます。回答が遅くなりまして申し訳ありません。

以下の条件であると仮定して回答させて頂きます。m(_ _)m

【条件】スキーマのcategメニュー項目の内容に応じて、「異なるページ」に「異なるデザイン」でページ出力したい。具体的には、A店はshop-a.phpに表示し、B店はshop-b.phpに表示し…というようにページを分ける必要がある。phpページもデザイン定義ファイルも、A店用、B店用、C店用…のように個別に作成して管理したい。

---------------------
以下、上記の条件の前提でデザイン定義ファイルのサンプルを作成致しました。実際に全く同じデータでテストしたわけではないので、もし間違いがあったら申し訳ありません。
サンプルはB店用のものとなっております。

コード: 全て選択

<?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">
		
		<!-- B店に関する出力 -->
		<xsl:if test="count(entry[categ='shop-b']) = 0">B店の情報は現在ありません。<br /></xsl:if><!-- 0件の場合 -->
		<xsl:if test="count(entry[categ='shop-b']) > 0"><!-- 0件より多い場合 -->
			<div>
			<xsl:for-each select="entry[categ='shop-b']"><!-- B店のエントリを全て出力する -->
				<div class="ui-tabs-panel"><xsl:attribute name="id">fragment-<xsl:number value="position()" format="1"/></xsl:attribute>
				<xsl:choose>
					 <xsl:when test="url/text()">
							<a href="{url}"><img src="/{topimg}" alt="{title}" class="hvr" /></a>
					 </xsl:when>
					 <xsl:otherwise>
							<a href="/event/index-campaign-web.php{@href}"><img src="/{topimg}" alt="{title}" class="hvr" /></a>
					 </xsl:otherwise>
				</xsl:choose>
				</div>
			</xsl:for-each>
			</div>
		</xsl:if>

</xsl:stylesheet>
-------------

以上です。基本的な処理の流れとしては、for-eachのselect内の[]の中で、エントリを絞り込む為の条件を指定しています。このようなやり方はマニュアルでは説明しておらず、XSLに慣れた方向けの方法ですが、使い方としてそれほど難しくはないので、ぜひご活用下さい。

ただ、CMS Designerとしては、このようなケースでは「グループ絞り込み機能」を用いてもっとシンプルに対応して頂けるよう想定しております。
グループ絞り込み機能を使うと、A店用、B店用に個別のphpページやデザイン定義を作なくても、1つのphpページ、1つのデザイン定義で全ての店舗に対応する事ができます。具体的には、shop.phpというphpページを作り、A店用にはshop.php?categ=shop-a、B店用にはshop.php?categ=shop-b、といったURLでアクセスすれば、それぞれの店舗用の情報が出力されるようにすることが可能です(その為の準備が必要です)。

そのような方法にご興味がある場合には、リファレンスマニュアルの「6.3.5 絞込みの指定(固定)」と「6.3.6 URL パラメータからの動的な絞込みの指定」をご覧ください。

もしマニュアルを読んでも良く分からない、でもグループ絞り込み機能を使いたい、という場合には、大変お手数ですが、再度ご連絡頂ければ、サンプルのデザイン定義ファイルやphpページファイルを提示させて頂きます。

webmaster
Site Admin
記事: 1447
登録日時: 2004年12月10日(金) 10:09

Re: カテゴリ別の一覧ページで記事がある時とない時の表示について

投稿記事 by webmaster » 2016年8月09日(火) 18:20

webmasterです。

追記なのですが、埋め込みタグの方が、投稿頂いた内容を拝見すると、

コード: 全て選択

-------呼び出しコード--------
<cmsd:entrylist name="campaign-nomal" design="shop-b" rows="8" tagremoving="on" />
となっており、tagremovingがonに指定されていますが、こうしますと、管理画面からtext項目に対して入力された際の改行タグなど全てのタグ情報が削除されて出力されてしまいます。そういう意図でよろしければ大丈夫なのですが、もしそういう意図ではない場合は、tagremoving="off"とするか、またはtagremoving属性自体を削除してしまってください。

title項目をalt属性の中に埋め込む関係上、万が一にもtitle項目の中に余計なタグを挿入されてしまうと(titleがtextではなくtextarea項目で、自由なタグ入力が可能なように設定されている場合は起こりえます)、サイト攻撃の脆弱性になりかねないというご判断でこうされているのであれば、非常に賢明なご判断だと思います。

念の為、追記とさせて頂きました。関係ないようでしたらそのままスルーして頂ければ幸いです。m(_ _)m

webmaster
Site Admin
記事: 1447
登録日時: 2004年12月10日(金) 10:09

Re: カテゴリ別の一覧ページで記事がある時とない時の表示について

投稿記事 by webmaster » 2016年8月10日(水) 10:35

webmasterです。もし、店舗ごとに別のデザインやphpページを作りたくない場合には、以下の方法で制作してください。
頂いたサンプルに従ってサンプルコードを作ってみましたが、未テストですので、記述ミスなどもしありましたら申し訳ありません。

●埋め込みタグ(categをグループ絞り込みキーとして指定) ※「6.3.6 URL パラメータからの動的な絞込みの指定」を参照

コード: 全て選択

<cmsd:entrylist name="campaign-nomal" design="default" rows="8" tagremoving="on">
	<cmsd:group key="categ" />
</cmsd:entrylist>
●ページへアクセスする際のURL

コード: 全て選択

http://xxx.xxx.xxx/shop_page.php?categ=shop-a
http://xxx.xxx.xxx/shop_page.php?categ=shop-b
 :
●スキーマには、既に「categ」項目に対してgroup="True"の指定がされているようですので、現状のままで大丈夫です。

●共通デザイン定義(一覧用):xxxxxx.list.default.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="html" encoding="EUC-JP" omit-xml-declaration="yes" />
	 <xsl:template match="/entrylist">

		<!-- URLパラメータで指定された店舗の店舗名を取得して表示する -->
		<h4>店舗名:
			<xsl:call-template name="output-category">
				<xsl:with-param name="itemname" select="categ" />
			</xsl:call-template>
		</h4>
		
		<!-- 全てのエントリを出力する(既にURLパラメータで絞り込まれている) -->
		<div>
			<xsl:if test="count(entry) = 0">この店舗のエントリは現在登録されていません。</xsl:if>
			<xsl:for-each select="entry">
				<div class="ui-tabs-panel"><xsl:attribute name="id">fragment-<xsl:number value="position()" format="1"/></xsl:attribute>
					<xsl:choose>
						<xsl:when test="url/text()">
							<a href="{url}"><img src="/{topimg}" alt="{title}" class="hvr" /></a>
						</xsl:when>
						<xsl:otherwise>
							<a href="/event/index-campaign-web.php{@href}"><img src="/{topimg}" alt="{title}" class="hvr" /></a>
						</xsl:otherwise>
					</xsl:choose>
				</div>
			</xsl:for-each>
		</div>
		
	</xsl:template>
	
	<!-- グループ絞り込みで現在絞り込まれているキーに対応するメニュー見出しを表示する汎用テンプレート -->
	<xsl:template name="output-category">
		<xsl:param name="itemname" /><!-- 絞り込み項目名。例)"colortype" -->
		
		<xsl:for-each select="//group[@key=$itemname]">
			<xsl:variable name="groupkey" select="@value" />
			<xsl:value-of select="//menuinfo[@name=$itemname]/menuitem[@id=$groupkey]" />
		</xsl:for-each>	
		
	</xsl:template>	
	
</xsl:stylesheet>

返信