summaryrefslogtreecommitdiff
path: root/lib/erubis/helpers/rails_form_helper.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/erubis/helpers/rails_form_helper.rb')
-rw-r--r--lib/erubis/helpers/rails_form_helper.rb190
1 files changed, 190 insertions, 0 deletions
diff --git a/lib/erubis/helpers/rails_form_helper.rb b/lib/erubis/helpers/rails_form_helper.rb
new file mode 100644
index 0000000..bc1520e
--- /dev/null
+++ b/lib/erubis/helpers/rails_form_helper.rb
@@ -0,0 +1,190 @@
+###
+### $Rev$
+### $Release: $
+### $Copyright$
+###
+
+
+module Erubis
+ module Helpers
+ module RailsFormHelper
+ end
+ end
+end
+
+
+module Erubis::Helpers::RailsFormHelper
+
+ def pp_template_filename(basename)
+ return "#{RAILS_ROOT}/app/views/#{controller.controller_name}/#{basename}.rhtml"
+ end
+
+ def pp_render_partial(basename)
+ basename = "_#{basename}" unless basename[0] == ?_
+ filename = pp_template_filename(basename)
+ klass = Erubis::Helpers::RailsHelper::PreprocessingEruby
+ eruby = klass.new(File.read(filename))
+ return eruby.evaluate(self)
+ end
+
+ def pp_error_on(object_name, method, &block)
+ s = ''
+ s << "<% _stag, _etag = _pp_error_tags(@#{object_name}.errors.on('#{method}'))%>"
+ s << "<%=_stag%>"
+ s << yield(object_name, method)
+ s << "<%=_etag%>"
+ return s
+ end
+
+ def _pp_error_tags(value)
+ return value ? ['<div class="fieldWithErrors">', '</div>'] : ['', '']
+ end
+
+ def _pp_remove_error_div(s)
+ s.sub!(/\A<div class="fieldWithErrors">(.*)<\/div>\z/, '\1')
+ return s
+ end
+
+ def pp_tag_helper(helper, object_name, method, options={})
+ if object_name.is_a?(ActionView::Helpers::FormHelper)
+ object_name = object_name.object_name
+ end
+ unless options.key?(:value) || options.key?('value')
+ options['value'] = _?("h @#{object_name}.#{method}")
+ end
+ $stderr.puts "*** debug: pp_tag_helper(): options=#{options.inspect}"
+ return pp_error_on(object_name, method) {
+ s = __send__(helper, object_name, method, options)
+ _pp_remove_error_div(s)
+ }
+ end
+
+ def pp_form_tag(url_for_options={}, options={}, *parameters_for_url, &block)
+ return form_tag(url_for_options, options, *parameters_for_url, &block)
+ end
+
+ #--
+ #def pp_form_for(object_name, *args, &block)
+ # return form_for(object_name, *args, &block)
+ #end
+ #++
+
+ def pp_text_field(object_name, method, options={})
+ return pp_tag_helper(:text_field, object_name, method, options)
+ end
+
+ def pp_password_field(object_name, method, options={})
+ return pp_tag_helper(:password_field, object_name, method, options)
+ end
+
+ def pp_hidden_field(object_name, method, options={})
+ return pp_tag_helper(:hidden_field, object_name, method, options)
+ end
+
+ def pp_file_field(object_name, method, options={})
+ return pp_tag_helper(:file_field, object_name, method, options)
+ end
+
+ def pp_text_area(object_name, method, options={})
+ return pp_tag_helper(:text_area, object_name, method, options)
+ end
+
+ def pp_check_box(object_name, method, options={}, checked_value="1", unchecked_value="0")
+ s = check_box(object_name, method, options, checked_value, unchecked_value)
+ s.sub!(/\schecked=\"checked\"/, '')
+ s.sub!(/type="checkbox"/, "\\&<%= _pp_check_box_checked?(@#{object_name}.#{method}, #{checked_value.inspect}) ? ' checked=\"checked\"' : '' %>")
+ return pp_error_on(object_name, method) { _pp_remove_error_div(s) }
+ end
+
+ def _pp_check_box_checked?(value, checked_value)
+ return ActionView::Helpers::InstanceTag::check_box_checked?(value, checked_value)
+ end
+
+ def pp_radio_button(object_name, method, tag_value, options={})
+ s = radio_button(object_name, method, tag_value, options)
+ s.sub!(/\schecked=\"checked\"/, '')
+ s.sub!(/type="radio"/, "\\&<%= _pp_radio_button_checked?(@#{object_name}.#{method}, #{tag_value.inspect}) ? ' checked=\"checked\"' : '' %>")
+ return pp_error_on(object_name, method) { _pp_remove_error_div(s) }
+ end
+
+ def _pp_radio_button_checked?(value, tag_value)
+ return ActionView::Helpers::InstanceTag::radio_button_checked?(value, tag_value)
+ end
+
+ def _pp_select(object, method, collection, priority_collection, options={}, html_options={})
+ return pp_error_on(object, method) do
+ s = ""
+ ## start tag
+ s << "<select id=\"#{object}_#{method}\" name=\"#{object}[#{method}]\""
+ for key, val in html_options:
+ s << " #{key}=\"#{val}\""
+ end
+ s << ">\n"
+ ## selected table
+ key = options.key?(:value) ? :value : (options.key?('value') ? 'value' : nil)
+ if key.nil? ; selected = "@#{object}.#{method}"
+ elsif (val=options[key]).nil? ; selected = nil
+ elsif val =~ /\A<%=(.*)%>\z/ ; selected = $1
+ else ; selected = val.inspect
+ end
+ s << "<% _table = {#{selected}=>' selected=\"selected\"'} %>\n" if selected
+ ## <option> tags
+ if options[:include_blank] || options['include_blank']
+ s << "<option value=\"\"></option>\n"
+ end
+ unless priority_collection.blank?
+ _pp_select_options(s, priority_collection, selected, 'delete')
+ s << "<option value=\"\">-------------</option>\n"
+ end
+ _pp_select_options(s, collection, selected, '[]')
+ ## end tag
+ s << "</select>"
+ s
+ end
+ end
+
+ def _pp_select_options(s, collection, selected, operator)
+ for item in collection
+ value, text = item.is_a?(Array) ? item : [item, item]
+ if !selected
+ t = ''
+ elsif operator == 'delete'
+ t = "<%= _table.delete(#{value.inspect}) %>"
+ else
+ t = "<%= _table[#{value.inspect}] %>"
+ end
+ s << "<option value=\"#{h value}\"#{t}>#{h text}</option>\n"
+ end
+ end
+
+ def pp_select(object, method, collection, options={}, html_options={})
+ return _pp_select(object, method, collection, nil, options, html_options)
+ end
+
+ def pp_collection_select(object, method, collection, value_method, text_method, options={}, html_options={})
+ collection2 = collection.collect { |e|
+ [e.__send__(value_method), e.__send__(text_method)]
+ }
+ return _pp_select(object, method, collection2, nil, options, html_options)
+ end
+
+ def pp_country_select(object, method, priority_countries=nil, options={}, html_options={})
+ collection = ActionView::Helpers::FormOptionsHelper::COUNTRIES
+ return _pp_select(object, method, collection, priority_countries, options, html_options)
+ end
+
+ def pp_time_zone_select(object, method, priority_zones=nil, options={}, html_options={})
+ model = options[:model] || options['model'] || TimeZone
+ collection = model.all.collect { |e| [e.name, e.to_s] }
+ return _pp_select(object, method, collection, priority_zones, options, html_options)
+ end
+
+ def pp_submit_tag(value="Save changes", options={})
+ return submit_tag(value, options)
+ end
+
+ def pp_image_submit_tag(source, options={})
+ return image_submit_tag(source, options)
+ end
+
+end