実際に表示されているエントリ数を数えるには

「まったく何も分からない・・・」そんなユーザーさんの為のフォーラムです。どんなご質問でもお気軽にどうぞ。
返信
ifeel
パワーユーザー
記事: 32
登録日時: 2006年9月28日(木) 19:40

実際に表示されているエントリ数を数えるには

投稿記事 by ifeel » 2007年9月19日(水) 21:57

いつもお世話になっております。

件名の通り、実際に表示されているエントリ数を数える方法がわからず
行き詰まっています。

一つのスキーマで、ニュースとPDF一覧の両方に書き出しをさせている状態で
各エントリには「期」と「一覧に表示」が設定してあります。
少し複雑な絞り込みをさせているので説明がわかりずらいと思いますが

スキーマの設定は「期」は以下のような感じで、「7」などの数字を入れるようになっています。

コード: 全て選択

<data name="ki" type="int" group="True" />
「一覧に表示」は以下の様にmenuになっています。

コード: 全て選択

<data name="hyouji" type="menu" caption="表示" group="True">
   <menuitem id="1">する</menuitem>
   <menuitem id="2">しない</menuitem>
</data>
そして最新のエントリと同じ期でhyoujiが1(つまり表示する)ならそのエントリをPDF一覧に表示させている状態です。

PDF一覧要のxsl

コード: 全て選択

<xsl:variable name="konki" select="/entrylist/entry[position() = 1]/ki" />

<xsl:for-each select="entry">
<xsl:if test="hyouji='1' and ki=$konki">

 −中略 (表示させる内容)− 

</xsl:if>
</xsl:for-each>

ここまでは、フォーラムに載っている技を使ってなんとか動くようになったのですが

最新の期が例として7期だとして、7期でニュースにのみ表示させたい(hyoujiが2)
エントリがあった場合、PDF一覧の方の表示が0件になってしまいます。

そこで、その場合は「登録されていません」などのメッセージを出したいのですが
0件であることを調べるための条件式が思いつきませんでした。

上記の方法だと表示をさせるかさせないか、はfor-each内でチェックするから良いのですが、0件の時のメッセージをfor-eachの中に入れるとエントリの数だけメッセージが出てきました。
また、rowsを1にすれば良いのかなと思ったのですが、それだとメッセージが表示される条件でもメッセージが出てきませんでした。

色々な方法を試したのですが、countに複数の条件を入れることもできず
(ki=$konkiでhyouji=1のエントリの数を数えさせたかったのですが)
どうにもうまくいきません。

そこで、色々な条件をentlylistで絞り込むより
実際に表示されている件数を調べることができないか、と思ったのですが
そんなことは可能でしょうか?
もしくは、他に何か良い方法はありますでしょうか?

無理そうれであれば、最終手段としては

コード: 全て選択

<cmsd:entrylist name="news01" design="library" rows="9999">
	<cmsd:group key="ki" value="7" />
</cmsd:entrylist>
として、期で先に絞り込んでおく方法は上手く動作しているのでこちらにしようと思っています。
ただ、これだと、毎年value値を書き換えないといけないのでミスの原因になるためできるだけ動的に処理したいです。

毎回ややこしい質問ばかりで申し訳ありません。

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

Re: 実際に表示されているエントリ数を数えるには

投稿記事 by webmaster » 2007年9月20日(木) 19:22

 ifeelさん、ご質問ありがとうございます。
 とても分かり易い説明で助かります。

 この場合、/entrylist/navi/@allcount という場所に、全件数が格納されて
います。

コード: 全て選択

<xsl:value-of select="/entrylist/navi/@allcount" />
 でそれを表示することができます。
 条件分岐をさせたい時には、

コード: 全て選択

<xsl:if test="/entrylist/navi/@allcount=0">
0件です。
</xsl:if>
 のような記述を、<xsl:for-each select="entry"> のループの外側に
置いて下さい。

 単純に、画面上に表示されているエントリの件数を知りたい場合には、

コード: 全て選択

<xsl:value-of select="count(entry)" />
 でも可能です。
 ただ、この方法だとページ切替ナビゲーションを使った場合に、全件数ではなく
今画面に表示されている件数が出てしまう為、意図した通りにならない場合が
あります。その点だけご留意下さい。
最後に編集したユーザー webmaster on 2008年2月26日(火) 11:07 [ 編集 1 回目 ]

love4
アクティブユーザー
記事: 16
登録日時: 2006年3月29日(水) 17:26

訂正

投稿記事 by love4 » 2008年2月26日(火) 10:57

上のvalue のつづりが違ってます。

コード: 全て選択

<xsl:vaule-of select="count(entry)" />
ではなく

コード: 全て選択

<xsl:value-of  select="count(entry)" />
ですね。

私がコピーしてエラーになったので記載しておきます。

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

Re: 訂正

投稿記事 by webmaster » 2008年2月26日(火) 11:07

 love4さん、こういうことだったのですね…余計なお手間を取らせて
しまい、申し訳ありませんでした。m(__;)m

 元投稿の方も修正しておきました。m(__)m

返信