讓will_paginate的分頁支持ajax
關于will_paginate插件,請看這個帖子: http://mmm.javaeye.com/blog/116931。
??#-----------------------------------------
??#?will_paginate插件的ajax分頁
??#-----------------------------------------
??@@pagination_options?=?{?:class?=>?'pagination',
????????:prev_label???=>?'上一頁',
????????:next_label???=>?'下一頁',
????????:inner_window?=>?4,?#?links?around?the?current?page
????????:outer_window?=>?1,?#?links?around?beginning?and?end
????????:separator????=>?'?',?#?single?space?is?friendly?to?spiders?and?non-graphic?browsers
????????:param_name???=>?:page,
????????#add?by?chengang
????????:update?=>nil,?#ajax所要更新的html元素的id
????????:url_suffix?=>?''??#url的后綴,主要是為了補全REST所需要的url
????????#add?end
????????}
??mattr_reader?:pagination_options
??def?will_paginate_remote(entries?=?@entries,?options?=?{})
????total_pages?=?entries.page_count
????if?total_pages?>?1
??????options?=?options.symbolize_keys.reverse_merge(pagination_options)
??????page,?param?=?entries.current_page,?options.delete(:param_name)
??????
??????inner_window,?outer_window?=?options.delete(:inner_window).to_i,?options.delete(:outer_window).to_i
??????#add?by?chengang
??????update?=??options.delete(:update)
??????suffix?=??options.delete(:url_suffix)
??????url?=?request.env['PATH_INFO']?
??????url?+=?suffix?if?suffix
??????#add?end
??????min?=?page?-?inner_window
??????max?=?page?+?inner_window
??????if?max?>?total_pages?then?min?-=?max?-?total_pages
??????elsif?min?<?1??then?max?+=?1?-?min
??????end
??????
??????current???=?min..max
??????beginning?=?1..(1?+?outer_window)
??????tail??????=?(total_pages?-?outer_window)..total_pages
??????visible???=?[beginning,?current,?tail].map(&:to_a).flatten.sort.uniq
??????links,?prev?=?[],?0
??????visible.each?do?|n|
????????next?if?n?<?1
????????break?if?n?>?total_pages
????????unless?n?-?prev?>?1
??????????prev?=?n
??????????#change?by?chengang
??????????text?=?(n==page???n?:?"[#{n}]")
??????????links?<<?page_link_remote_or_span((n?!=?page???n?:?nil),?'current',?text,?param,?update,?url)
????????else
??????????prev?=?n?-?1
??????????links?<<?'
'
??????????redo
????????end
??????end
??????
??????#change?by?chengang
??????links.unshift?page_link_remote_or_span(entries.previous_page,?'disabled',?options.delete(:prev_label),?param,?update,?url)
??????links.push????page_link_remote_or_span(entries.next_page,?????'disabled',?options.delete(:next_label),?param,?update,?url)
??????#change?end
??????content_tag?:div,?links.join(options.delete(:separator)),?options
????end
??end
??
protected
??def?page_link_remote_or_span(page,?span_class,?text,?param,?update,?url)
????unless?page
??????content_tag?:span,?text,?:class?=>?span_class
????else
??????link_to_remote?text,?:update?=>?update,?:url?=>?"#{url}?#{param.to_sym}=#{page}",?:method=>:get
????end
??end
在view中的使用如下所示:
文/陳剛 (www.chengang.com.cn)
但一直搜不到它支持ajax分面的方法 ,于是我參考它分頁方法的源代碼(位于:vendor/plugins/will_paginate/lib/will_paginate/view_helpers.rb),稍微改寫,變成了一個支持ajax的分頁方法。以下代碼復制到application_helper里即可。??#-----------------------------------------
??#?will_paginate插件的ajax分頁
??#-----------------------------------------
??@@pagination_options?=?{?:class?=>?'pagination',
????????:prev_label???=>?'上一頁',
????????:next_label???=>?'下一頁',
????????:inner_window?=>?4,?#?links?around?the?current?page
????????:outer_window?=>?1,?#?links?around?beginning?and?end
????????:separator????=>?'?',?#?single?space?is?friendly?to?spiders?and?non-graphic?browsers
????????:param_name???=>?:page,
????????#add?by?chengang
????????:update?=>nil,?#ajax所要更新的html元素的id
????????:url_suffix?=>?''??#url的后綴,主要是為了補全REST所需要的url
????????#add?end
????????}
??mattr_reader?:pagination_options
??def?will_paginate_remote(entries?=?@entries,?options?=?{})
????total_pages?=?entries.page_count
????if?total_pages?>?1
??????options?=?options.symbolize_keys.reverse_merge(pagination_options)
??????page,?param?=?entries.current_page,?options.delete(:param_name)
??????
??????inner_window,?outer_window?=?options.delete(:inner_window).to_i,?options.delete(:outer_window).to_i
??????#add?by?chengang
??????update?=??options.delete(:update)
??????suffix?=??options.delete(:url_suffix)
??????url?=?request.env['PATH_INFO']?
??????url?+=?suffix?if?suffix
??????#add?end
??????min?=?page?-?inner_window
??????max?=?page?+?inner_window
??????if?max?>?total_pages?then?min?-=?max?-?total_pages
??????elsif?min?<?1??then?max?+=?1?-?min
??????end
??????
??????current???=?min..max
??????beginning?=?1..(1?+?outer_window)
??????tail??????=?(total_pages?-?outer_window)..total_pages
??????visible???=?[beginning,?current,?tail].map(&:to_a).flatten.sort.uniq
??????links,?prev?=?[],?0
??????visible.each?do?|n|
????????next?if?n?<?1
????????break?if?n?>?total_pages
????????unless?n?-?prev?>?1
??????????prev?=?n
??????????#change?by?chengang
??????????text?=?(n==page???n?:?"[#{n}]")
??????????links?<<?page_link_remote_or_span((n?!=?page???n?:?nil),?'current',?text,?param,?update,?url)
????????else
??????????prev?=?n?-?1
??????????links?<<?'

??????????redo
????????end
??????end
??????
??????#change?by?chengang
??????links.unshift?page_link_remote_or_span(entries.previous_page,?'disabled',?options.delete(:prev_label),?param,?update,?url)
??????links.push????page_link_remote_or_span(entries.next_page,?????'disabled',?options.delete(:next_label),?param,?update,?url)
??????#change?end
??????content_tag?:div,?links.join(options.delete(:separator)),?options
????end
??end
??
protected
??def?page_link_remote_or_span(page,?span_class,?text,?param,?update,?url)
????unless?page
??????content_tag?:span,?text,?:class?=>?span_class
????else
??????link_to_remote?text,?:update?=>?update,?:url?=>?"#{url}?#{param.to_sym}=#{page}",?:method=>:get
????end
??end
在view中的使用如下所示:
??????????<%=will_paginate_remote?@topics,?:update?=>?'topicList',?:url_suffix?=>?url_suffix%>
posted on 2007-09-02 15:42 陳剛 閱讀(4585) 評論(14) 編輯 收藏 所屬分類: Rails&Ruby