動的ページへのジャンプ機能

こんな機能をつけて欲しい、こんなマニュアル(又はサンプル)が欲しい、CMSDのサイトにこの説明が欲しい、などなど、今後のご要望についてなんなりとお寄せください。
すぐに対応できるとは限りませんが、極力検討させて頂きます。
返信
key-ko
アクティブユーザー
記事: 22
登録日時: 2005年3月31日(木) 16:39

動的ページへのジャンプ機能

投稿記事 by key-ko » 2005年5月14日(土) 07:28

Webmaster様、お世話になります。

エントリー数が増えると動的ページも増えますが、
ページ切替ナビで1Pずつ移動するのではなく、
たとえばセレクトメニューなどを使って、目当てのページ番号にジャンプすることは
できますか?

あるいは一度絞り込み表示がされてから、さらにそこからセレクトメニューで
グループ絞込みをすることはできますか?

上記のどちらかが実現できると、サイト訪問者には使いやすくなるのではと
考えています。

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

目当てのページへの直接ジャンプ

投稿記事 by webmaster » 2005年5月14日(土) 10:32

 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

key-ko
アクティブユーザー
記事: 22
登録日時: 2005年3月31日(木) 16:39

投稿記事 by key-ko » 2005年5月14日(土) 11:54

Webmaster様、ご回答ありがとうございます。
CMSDには既にそのような機能が実装されていたのですね。 :D
さっそく「現在のページについてはリンクではなく太字」パターンをやってみました。
なるほど、これならすぐにページにジャンプできますね。

ちなみに、ページ数が相当数になった場合は、複数段で表示されるのでしょうか?
Googleのように「1~10」までの数字が列挙され、その後は「次へ」が
表示されていると、ずらずらと数字ばかりが並ぶことはないと思うのですが、
いががでしょう?

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

googleのようなページ切り替え番号一覧を出力する

投稿記事 by webmaster » 2005年5月14日(土) 12:30

 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>
 数字を変えたりすると条件を変更できますので、いろいろいじってみてくださいませ。
 またご不明点、ご要望などありましたらご連絡頂ければ幸いです。
最後に編集したユーザー webmaster on 2005年6月02日(木) 12:59 [ 編集 1 回目 ]

key-ko
アクティブユーザー
記事: 22
登録日時: 2005年3月31日(木) 16:39

投稿記事 by key-ko » 2005年5月14日(土) 15:35

Webmaster様、即効でプログラムの回答をいただき、恐縮です。m(__)m
さっそく指示通りに変更しました。
現在最も多いページが次のように表示されています。

1| 2| 3| 4| 5| 6| 次のページへ>>

これで合っていますか?
もしページが15ページになったとしても、現在位置が1Pなら、
上記の表示になるわけですよね。 :roll:
現在位置が5Pなら、
1| 2| 3| 4| 5| 6|| 7|| 8|| 9|| 10|次のページへ>>
のように表示されればいいのですね。
:) ありがたく使わせていただきます。
大変にありがとうございました。

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

投稿記事 by webmaster » 2005年5月14日(土) 15:54

 webmasterです。
key-ko さんが書きました: 現在最も多いページが次のように表示されています。

1| 2| 3| 4| 5| 6| 次のページへ>>

これで合っていますか?
もしページが15ページになったとしても、現在位置が1Pなら、
上記の表示になるわけですよね。 :roll:
現在位置が5Pなら、
1| 2| 3| 4| 5| 6|| 7|| 8|| 9|| 10|次のページへ>>
のように表示されればいいのですね。
 はい、そのようになると思います。 :)
 また問題などありましたらいつでもご連絡くださいませ。

fuku
記事: 2
登録日時: 2006年5月08日(月) 21:12

投稿記事 by fuku » 2006年5月08日(月) 22:23

こちらのやり方にすると、
<cmsd:entrylist name="mydiary" design="default" rows="20" />
という風にデフォルト以外の表示件数だとズレてしまうのですが、
何か良い方法はありますか?

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

投稿記事 by webmaster » 2006年5月09日(火) 21:25

 fukuさん、こんにちは。webmasterです。

 弊社の方でも実際に試してみましたが、「ズレ」を確認することができませんでした。
 この場合の「ズレ」とは、具体的にはどのようになってしまうか教えて頂けない
でしょうか。
 お手数ですが、もしお時間等ありましたらよろしくお願い致します。

返信