aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config/environment.rb5
-rw-r--r--lib/willpaginate_extension.rb54
-rw-r--r--lib/willpaginate_hack.rb14
3 files changed, 58 insertions, 15 deletions
diff --git a/config/environment.rb b/config/environment.rb
index d15ee9a0e..17ded987e 100644
--- a/config/environment.rb
+++ b/config/environment.rb
@@ -131,6 +131,9 @@ I18n.locale = default_locale
I18n.available_locales = available_locales.map {|locale_name| locale_name.to_sym}
I18n.default_locale = default_locale
+# Customise will_paginate URL generation
+WillPaginate::ViewHelpers.pagination_options[:renderer] = 'WillPaginateExtension::LinkRenderer'
+
# Load monkey patches and other things from lib/
require 'ruby19.rb'
require 'tmail_extensions.rb'
@@ -139,7 +142,7 @@ require 'timezone_fixes.rb'
require 'use_spans_for_errors.rb'
require 'make_html_4_compliant.rb'
require 'activerecord_errors_extensions.rb'
-require 'willpaginate_hack.rb'
+require 'willpaginate_extension.rb'
require 'sendmail_return_path.rb'
require 'tnef.rb'
require 'i18n_fixes.rb'
diff --git a/lib/willpaginate_extension.rb b/lib/willpaginate_extension.rb
new file mode 100644
index 000000000..98ca8d763
--- /dev/null
+++ b/lib/willpaginate_extension.rb
@@ -0,0 +1,54 @@
+# this extension is loaded in environment.rb
+module WillPaginateExtension
+ class LinkRenderer < WillPaginate::LinkRenderer
+ def page_link(page, text, attributes = {})
+ # Hack for admin pages, when proxied via https on mySociety servers, they
+ # need a relative URL.
+ url = url_for(page)
+ if url.match(/^\/admin.*(\?.*)/)
+ url = $1
+ end
+ @template.link_to text, url, attributes
+ end
+
+ # Returns URL params for +page_link_or_span+, taking the current GET params
+ # and <tt>:params</tt> option into account.
+ def url_for(page)
+ page_one = page == 1
+ unless @url_string and !page_one
+ # the following line makes pagination work on our specially munged search page
+ @url_params = @template.request.symbolized_path_parameters
+ # page links should preserve GET parameters
+ stringified_merge @url_params, @template.params if @template.request.get?
+ stringified_merge @url_params, @options[:params] if @options[:params]
+ @request_method=:get, @symbolized_path_parameters={:locale=>"en", :action=>"search", :combined=>["school", "all"], :controller=>"general"}
+ if complex = param_name.index(/[^\w-]/)
+ page_param = parse_query_parameters("#{param_name}=#{page}")
+
+ stringified_merge @url_params, page_param
+ else
+ @url_params[param_name] = page_one ? 1 : 2
+ end
+ url = @template.url_for(@url_params)
+ return url if page_one
+
+ if complex
+ @url_string = url.sub(%r!((?:\?|&amp;)#{CGI.escape param_name}=)#{page}!, "\\1\0")
+ return url
+ else
+ @url_string = url
+ @url_params[param_name] = 3
+ @template.url_for(@url_params).split(//).each_with_index do |char, i|
+ if char == '3' and url[i, 1] == '2'
+ @url_string[i] = "\0"
+ break
+ end
+ end
+ end
+ end
+ # finally!
+ @url_string.sub "\0", page.to_s
+ end
+
+ end
+end
diff --git a/lib/willpaginate_hack.rb b/lib/willpaginate_hack.rb
deleted file mode 100644
index 084329e82..000000000
--- a/lib/willpaginate_hack.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# Monkeypatch! Hack for admin pages, when proxied via https on mySociety servers, they
-# need a relative URL.
-module WillPaginate
- class LinkRenderer
- def page_link(page, text, attributes = {})
- url = url_for(page)
- if url.match(/^\/admin.*(\?.*)/)
- url = $1
- end
- @template.link_to text, url, attributes
- end
- end
-end
-