ページ 1 / 1
動的ページへのジャンプ機能
Posted: 2005年5月14日(土) 07:28
by key-ko
Webmaster様、お世話になります。
エントリー数が増えると動的ページも増えますが、
ページ切替ナビで1Pずつ移動するのではなく、
たとえばセレクトメニューなどを使って、目当てのページ番号にジャンプすることは
できますか?
あるいは一度絞り込み表示がされてから、さらにそこからセレクトメニューで
グループ絞込みをすることはできますか?
上記のどちらかが実現できると、サイト訪問者には使いやすくなるのではと
考えています。
目当てのページへの直接ジャンプ
Posted: 2005年5月14日(土) 10:32
by webmaster
webmasterです。key-koさん、いつもありがとうございます。
目当てのページへの直接ジャンプ機能は、以下のようにして実現可能です。
通常、ページ切り替えナビゲーションのデザイン定義では以下のような感じに
なっていると思います。
コード: 全て選択
<xsl:for-each select="navi">
<xsl:for-each select="prev">
<a href="{@href}"><<前のページへ</a>|
</xsl:for-each>
<xsl:for-each select="next">
<a href="{@href}">次のページへ>></a>
</xsl:for-each>
</xsl:for-each>
実は、CMSDから出力されるnavi要素の中には、上記のprev要素とnext要素
以外にも「page」という要素がページ数分出力されています。
よって、デザイン定義を次のように書けば、ページ数分、各ページへの直接リンクが
表示されます。
コード: 全て選択
<xsl:for-each select="navi">
<xsl:for-each select="prev">
<a href="{@href}"><<前のページへ</a>|
</xsl:for-each>
<xsl:for-each select="page">
<a href="{@href}"><xsl:value-of select="@id" /></a>|
</xsl:for-each>
<xsl:for-each select="next">
<a href="{@href}">次のページへ>></a>
</xsl:for-each>
</xsl:for-each>
現在のページについてはリンクしないという場合は、次のようなifを追加します。
(現在のページについてはリンクではなく太字にします)
コード: 全て選択
<xsl:for-each select="navi">
<xsl:for-each select="prev">
<a href="{@href}"><<前のページへ</a>|
</xsl:for-each>
<xsl:for-each select="page">
<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:for-each>
<xsl:for-each select="next">
<a href="{@href}">次のページへ>></a>
</xsl:for-each>
</xsl:for-each>
この辺、まだマニュアルには記載されていない機能ですので、ぜひお試し頂いて
ご要望など挙げて頂けると助かります。m(_ _)m
Posted: 2005年5月14日(土) 11:54
by key-ko
Webmaster様、ご回答ありがとうございます。
CMSDには既にそのような機能が実装されていたのですね。
さっそく「現在のページについてはリンクではなく太字」パターンをやってみました。
なるほど、これならすぐにページにジャンプできますね。
ちなみに、ページ数が相当数になった場合は、複数段で表示されるのでしょうか?
Googleのように「1~10」までの数字が列挙され、その後は「次へ」が
表示されていると、ずらずらと数字ばかりが並ぶことはないと思うのですが、
いががでしょう?
googleのようなページ切り替え番号一覧を出力する
Posted: 2005年5月14日(土) 12:30
by webmaster
webmasterです。
確かにこのやり方ですと、ページ数がたくさんになると、折り返しが生じてしまい
ますね・・・。
googleという良い例を教えて頂いたので、同じ処理をXSLTで実現してみました。
ただ、googleの場合は現在のページから前後10ページずつリンクを表示して
いますが、ちょっと多い気がするのでこの例では前後5ページ分を出しています。
page要素部分のデザイン定義を以下のようにしてみてください。
コード: 全て選択
<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:if test="(@id>=(../@position - 5)) and (@id<=(../@position + 5))">
で囲ってあります。
このif文はリンク先のページ番号(@id)と、現在のページ番号(../@position)を
比較して、「ページ番号 ≧ 現在のページ番号 - 5」且つ(and)、「ページ番号 ≦ 現在のページ番号 + 5」
ならば表示するようにしています。
表現を変えると、
現在のページ番号 - 5 ≦ ページ番号 ≦ 現在のページ番号 + 5
という感じです。
現在のページ番号が10ならば、10-5=5ページ目から、10+5=15ページ目まで
のページ切り替えリンクが表示されます。
ナビ表示部分のXSLT全体は次のようになります。
コード: 全て選択
<xsl:for-each select="navi">
<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>
数字を変えたりすると条件を変更できますので、いろいろいじってみてくださいませ。
またご不明点、ご要望などありましたらご連絡頂ければ幸いです。
Posted: 2005年5月14日(土) 15:35
by key-ko
Webmaster様、即効でプログラムの回答をいただき、恐縮です。m(__)m
さっそく指示通りに変更しました。
現在最も多いページが次のように表示されています。
1| 2| 3| 4| 5| 6| 次のページへ>>
これで合っていますか?
もしページが15ページになったとしても、現在位置が1Pなら、
上記の表示になるわけですよね。
現在位置が5Pなら、
1| 2| 3| 4|
5| 6|| 7|| 8|| 9|| 10|次のページへ>>
のように表示されればいいのですね。
ありがたく使わせていただきます。
大変にありがとうございました。
Posted: 2005年5月14日(土) 15:54
by webmaster
webmasterです。
key-ko さんが書きました:
現在最も多いページが次のように表示されています。
1| 2| 3| 4| 5| 6| 次のページへ>>
これで合っていますか?
もしページが15ページになったとしても、現在位置が1Pなら、
上記の表示になるわけですよね。
現在位置が5Pなら、
1| 2| 3| 4|
5| 6|| 7|| 8|| 9|| 10|次のページへ>>
のように表示されればいいのですね。
はい、そのようになると思います。
また問題などありましたらいつでもご連絡くださいませ。
Posted: 2006年5月08日(月) 22:23
by fuku
こちらのやり方にすると、
<cmsd:entrylist name="mydiary" design="default" rows="20" />
という風にデフォルト以外の表示件数だとズレてしまうのですが、
何か良い方法はありますか?
Posted: 2006年5月09日(火) 21:25
by webmaster
fukuさん、こんにちは。webmasterです。
弊社の方でも実際に試してみましたが、「ズレ」を確認することができませんでした。
この場合の「ズレ」とは、具体的にはどのようになってしまうか教えて頂けない
でしょうか。
お手数ですが、もしお時間等ありましたらよろしくお願い致します。