リストアイテム情報の無いエントリを除外して表示した時のページ切り替えナビについて

「まったく何も分からない・・・」そんなユーザーさんの為のフォーラムです。どんなご質問でもお気軽にどうぞ。
返信
mino
アクティブユーザー
記事: 18
登録日時: 2006年12月22日(金) 19:44

リストアイテム情報の無いエントリを除外して表示した時のページ切り替えナビについて

投稿記事 by mino » 2007年10月04日(木) 11:59

導入検証中にわからなくなりましたので、ぜひ教えて下さい。

たとえばこのようなデザインファイルがあるとします。

コード: 全て選択

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

<xsl:sort select="@date" order="descending" /> 
<xsl:if test="not(voicelist='')">

<a href="entry.php{@href}"><xsl:value-of select="company01" /></a>

<xsl:for-each select="voicelist/listitem">
	<xsl:if test="photo/text()">
	<xsl:if test="photo/@width<=370">
		<a href="entry.php{@href}"><img src="{photo}" style="float: left" alt="{phototitle}" /></a>
	</xsl:if>
	<xsl:if test="photo/@width>370">
		<a href="entry.php{@href}"><img src="{photo}&w=370" style="float: left; border-style: none" alt="{phototitle}" /></a>
	</xsl:if>
	</xsl:if>
</xsl:for-each>

</xsl:if>

</xsl:for-each>
voicelist/listitem内に情報がなければ、表示しないようにしていますが、

件数が増えた場合のことを考えてページ切り替えナビを入れたところ、

コード: 全て選択

<p>
<xsl:for-each select="navi">
[ 記事数全 <xsl:value-of select="@allcount" />件 ]
<xsl:for-each select="prev">
<a href="{@href}"><<前のページへ</a>|
</xsl:for-each>
<xsl:for-each select="page">
<xsl:if test="(@id>=(../@position - 5)) and (@id<=(../@position + 5))">
<xsl:if test="../@position=@id">
<strong><xsl:value-of select="@id" /></strong>|
</xsl:if>
<xsl:if test="not(../@position=@id)">
<a href="{@href}"><xsl:value-of select="@id" /></a>|
</xsl:if>
</xsl:if>
</xsl:for-each>
<xsl:for-each select="next">
<a href="{@href}">次のページへ>></a>
</xsl:for-each>
</xsl:for-each>
</p>
voicelist/listitem内に情報がない物も表示されてしまいます。

ページ切り替えナビでも、情報がないエントリを除外することはできますか?

よろしくお願いします。

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

Re: リストアイテム情報の無いエントリを除外して表示した時のページ切り替えナビについて

投稿記事 by webmaster » 2007年10月08日(月) 13:41

お返事が大変遅くなりまして申し訳ありません。

エントリ1:voicelist有り
エントリ2:voicelistなし
エントリ3:voicelistなし
エントリ4:voicelist有り
エントリ5:voicelistなし
エントリ6:voicelistなし
エントリ7:voicelistなし

のような状況だったとして、1ページの最大表示件数を5に設定していたとすると、
提示されたデザインでは

-------------------
[1ページ目]
エントリ1のvoicelist
エントリ4のvlicelist

[2ページ目]
(何も表示されない)
-------------------

のようになるかと思います。

ここで、2ページ目のエントリが全てvoicelistなしだった場合には、ページ切替
ナビゲーションに「2ページ目」へのリンクを表示したくない、という事でよろし
かったでしょうか。

この場合、エントリ内容を表示する/しないを決定しているのはデザイン定義側で
あり、ページ切替ナビゲーションの元情報が生成された時点では、そのページに
含まれるエントリが全て表示されないかどうかという事は分からない為、ご希望の
ご用件は実現することができません。m(__)m

場合によっては、先頭5件がvoicelistなしの状態で、1ページの表示件数が5件だった
場合には、1ページ目自体が空っぽのページという事にもなる可能性があります。

これを回避する方法は現在ございません。m(__)m
根本的な原因は、絞込み条件として「完全一致条件」しか指定できず、「リスト
項目が1件以上のエントリのみ」のような指定ができないことにあります。

他の対策としては、最も単純な方法は、スキーマに「voice一覧に表示」のような
メニュー項目をつける事です。voicelistに1つ以上データを登録した場合には、
このメニュー項目を「表示する」に設定するように運用で決めます。そして、
エントリ一覧表示時に、cmsd:entrylistにgroup要素を追加し、「表示する」の
エントリのみを表示するようにすれば、問題は解決します。ただ、やはりどうしても、
運用は面倒になるかと思います。

もう一つの方法は、JavaScriptを使う方法です。
あまりにも大量の件数が登録される場合には速度的に不向きですが、100件程度の
分量を10件ずつ10ページに分けるような分量であれば、この方法が使えます。
手順としては、まず、1ページの最大表示件数(rows)を99999などの最大値に設定
します。これで全件が1ページ目に出力されますので、後は、JavaScriptを使って
10件ずつ別タブで表示するという方法が使えるかと思います。ただこの方法は
JavaScriptに精通している必要があり、かなり高度かと思います。

以上、直接の回答を提示できず申し訳ありませんが、よろしくお願い致します。

mino
アクティブユーザー
記事: 18
登録日時: 2006年12月22日(金) 19:44

関連する内容で質問があります。

投稿記事 by mino » 2007年10月09日(火) 06:00

丁寧なご回答ありがとうございます。
やはり難しいですね・・・。

関連する内容で、

ページナビを無くして、たとえば、5日以内の更新日上位10件表示というのは可能でしょうか?

デザインファイルにこれを入れ、

コード: 全て選択

<xsl:if test="@daysago<5">
表示はこのようにしています。
<cmsd:entrylist name="contents" design="voice" rows="9999">
</cmsd:entrylist>
そうすると、コンテンツ管理画面で各エントリの「リスト編集」→「編集を保存」を行っただけでは、なぜか表示されません。

表示させる場合、都度エントリ更新日時の「現在日時を自動設定」にチェックして、「編集を保存」としなければならないのでしょうか?

よろしくお願いします。

返信