/vendor/plugins/facebooker/lib/facebooker/rails/facebook_form_builder.rb
Ruby | 141 lines | 113 code | 25 blank | 3 comment | 3 complexity | 22e0c5f8ae10ad83e0258c9f08646594 MD5 | raw file
- module Facebooker
- module Rails
- class FacebookFormBuilder < ActionView::Helpers::FormBuilder
-
-
- second_param = %w(password_field file_field check_box date_select datetime_select time_select)
- third_param = %w(radio_button country_select select time_zone_select)
- fifth_param = %w(collection_select)
-
- def self.create_with_offset(name,offset)
- define_method name do |field,*args|
- options = args[offset] || {}
- build_shell(field,options.with_indifferent_access) do
- super
- end
- end
- end
- second_param.each do |name|
- create_with_offset(name,0)
- end
- third_param.each do |name|
- create_with_offset(name,1)
- end
- fifth_param.each do |name|
- create_with_offset(name,3)
- end
-
- def build_shell(field,options)
- @template.content_tag "fb:editor-custom", :label=>label_for(field,options) do
- yield
- end
- end
-
- def label_for(field,options)
- options[:label] || field.to_s.humanize
- end
-
- def text(string,options={})
- @template.content_tag "fb:editor-custom",string, :label=>label_for("",options)
- end
-
-
- def text_field(method, options = {})
- options = options.with_indifferent_access
- options[:label] ||= label_for(method,options)
- add_default_name_and_id(options,method)
- options["value"] ||= value_before_type_cast(object,method)
- @template.content_tag("fb:editor-text","",options)
- end
-
-
- def text_area(method, options = {})
- options[:label] ||= label_for(method,options)
- add_default_name_and_id(options,method)
- @template.content_tag("fb:editor-textarea",value_before_type_cast(object,method),options)
- end
-
- #
- # Build a text input area that uses typeahed
- # options are like collection_select
- def collection_typeahead(method,collection,value_method,text_method,options={})
- build_shell(method,options) do
- collection_typeahead_internal(method,collection,value_method,text_method,options)
- end
- end
-
- def collection_typeahead_internal(method,collection,value_method,text_method,options={})
- option_values = collection.map do |item|
- value=item.send(value_method)
- text=item.send(text_method)
- @template.content_tag "fb:typeahead-option",text,:value=>value
- end.join
- add_default_name_and_id(options,method)
- options["value"] ||= value_before_type_cast(object,method)
- @template.content_tag("fb:typeahead-input",option_values,options)
- end
-
- def value_before_type_cast(object,method)
- unless object.nil?
- method_name = method.to_s
- object.respond_to?(method_name + "_before_type_cast") ?
- object.send(method_name + "_before_type_cast") :
- object.send(method_name)
- end
- end
-
- def multi_friend_input(options={})
- build_shell(:friends,options) do
- @template.content_tag("fb:multi-friend-input","",options)
- end
- end
- def buttons(*names)
- buttons=names.map do |name|
- create_button(name)
- end.join
-
- @template.content_tag "fb:editor-buttonset",buttons
- end
-
- def create_button(name)
- @template.content_tag("fb:editor-button","",:value=>name,:name=>"commit")
- end
-
- def add_default_name_and_id(options, method)
- @method_name = method
- if options.has_key?("index")
- options["name"] ||= tag_name_with_index(options["index"])
- options["id"] ||= tag_id_with_index(options["index"])
- options.delete("index")
- else
- options["name"] ||= tag_name + (options.has_key?('multiple') ? '[]' : '')
- options["id"] ||= "#{sanitized_object_name}_#{sanitized_method_name}"
- end
- end
- private
- def tag_name
- "#{@object_name.to_s}[#{sanitized_method_name}]"
- end
- def tag_name_with_index(index)
- "#{@object_name.to_s}[#{index}][#{sanitized_method_name}]"
- end
- def tag_id_with_index(index)
- "#{sanitized_object_name}_#{index}_#{sanitized_method_name}"
- end
- def sanitized_object_name
- @object_name.to_s.gsub(/\]\[|[^-a-zA-Z0-9:.]/, "_").sub(/_$/, "")
- end
- def sanitized_method_name
- @method_name.to_s.sub(/\?$/,"")
- end
- end
- end
- end