sidebar.rb
上传用户:netsea168
上传日期:2022-07-22
资源大小:4652k
文件大小:6k
源码类别:

Ajax

开发平台:

Others

  1. class Sidebar < ActiveRecord::Base
  2.   serialize :config
  3.   class Field
  4.     attr_accessor :key
  5.     attr_accessor :options
  6.     attr_accessor :default
  7.     include ApplicationHelper
  8.     include ActionView::Helpers::TagHelper
  9.     include ActionView::Helpers::FormTagHelper
  10.     include ActionView::Helpers::FormOptionsHelper
  11.     def initialize(key, default, options = { })
  12.       @key, @default, @options = key.to_s, default, options
  13.     end
  14.     def label
  15.       options[:label] || key.humanize.gsub(/url/i, 'URL')
  16.     end
  17.     def label_html(sidebar)
  18.       content_tag('label', label)
  19.     end
  20.     def input_html(sidebar)
  21.       text_field_tag(input_name(sidebar), sidebar.config[key], { :class => 'small large'})
  22.     end
  23.     def line_html(sidebar)
  24.       content_tag(:p, label_html(sidebar) +  "<br />" + input_html(sidebar), :class => 'input_text_title')
  25.     end
  26.     def input_name(sidebar)
  27.       "configure[#{sidebar.id}][#{key}]"
  28.     end
  29.     def canonicalize(value)
  30.       value
  31.     end
  32.     class SelectField < self
  33.       def input_html(sidebar)
  34.         select_tag(input_name(sidebar),
  35.                    options_for_select(options[:choices], sidebar.config[key]),
  36.                    options)
  37.       end
  38.     end
  39.     class TextAreaField < self
  40.       def input_html(sidebar)
  41.         html_options = { "rows" => "10", "class" => "large small" }.update(options.stringify_keys)
  42.         text_area_tag(input_name(sidebar), sidebar.config[key], html_options)
  43.       end
  44.     end
  45.     class RadioField < self
  46.       def input_html(sidebar)
  47.         options[:choices].collect do |choice|
  48.           value = value_for(choice)
  49.           radio_button_tag(input_name(sidebar), value,
  50.                            value == sidebar.config[key], options) +
  51.             content_tag('label', label_for(choice))
  52.         end.join("<br />")
  53.       end
  54.       def label_for(choice)
  55.         choice.is_a?(Array) ? choice.last : choice.to_s.humanize
  56.       end
  57.       def value_for(choice)
  58.         choice.is_a?(Array) ? choice.first : choice
  59.       end
  60.     end
  61.     class CheckBoxField < self
  62.       def input_html(sidebar)
  63.         hidden_field_tag(input_name(sidebar),0)+
  64.         check_box_tag(input_name(sidebar), 1, sidebar.config[key], options)
  65.       end
  66.       def line_html(sidebar)
  67.         input_html(sidebar) + ' ' + label_html(sidebar) + '<br >'
  68.       end
  69.       def canonicalize(value)
  70.         case value
  71.         when "0"
  72.           false
  73.         else
  74.           true
  75.         end
  76.       end
  77.     end
  78.     def self.build(key, default, options)
  79.       field = class_for(options).new(key, default, options)
  80.     end
  81.     def self.class_for(options)
  82.       case options[:input_type]
  83.       when :text_area
  84.         TextAreaField
  85.       when :textarea
  86.         TextAreaField
  87.       when :radio
  88.         RadioField
  89.       when :checkbox
  90.         CheckBoxField
  91.       when :select
  92.         SelectField
  93.       else
  94.         if options[:choices]
  95.           SelectField
  96.         else
  97.           self
  98.         end
  99.       end
  100.     end
  101.   end
  102.   class << self
  103.     attr_accessor :view_root
  104.     def find_all_visible
  105.       find :all, :conditions => 'active_position is not null', :order => 'active_position'
  106.     end
  107.     def find_all_staged
  108.       find :all, :conditions => 'staged_position is not null', :order => 'staged_position'
  109.     end
  110.     def purge
  111.       delete_all('active_position is null and staged_position is null')
  112.     end
  113.     def setting(key, default=nil, options = { })
  114.       return if instance_methods.include?(key.to_s)
  115.       fields << Field.build(key.to_s, default, options)
  116.       fieldmap.update(key.to_s => fields.last)
  117.       self.send(:define_method, key) do
  118.         self.config[key.to_s]
  119.       end
  120.       self.send(:define_method, "#{key}=") do |newval|
  121.         self.config[key.to_s] = newval
  122.       end
  123.     end
  124.     def fieldmap
  125.       @fieldmap ||= {}
  126.     end
  127.     def fields
  128.       @fields ||= []
  129.     end
  130.     def fields=(newval)
  131.       @fields = newval
  132.     end
  133.     def description(desc = nil)
  134.       if desc
  135.         @description = desc
  136.       else
  137.         @description
  138.       end
  139.     end
  140.     def lifetime(timeout = nil)
  141.       if timeout
  142.         @lifetime = timeout
  143.       else
  144.         @lifetime
  145.       end
  146.     end
  147.     def short_name
  148.       self.to_s.underscore.split(%r{_}).first
  149.     end
  150.     def display_name(new_dn = nil)
  151.       @display_name = new_dn if new_dn
  152.       @display_name || short_name.humanize
  153.     end
  154.     def available_sidebars
  155.       Sidebar.subclasses.sort_by { |klass| klass.to_s }
  156.     end
  157.   end
  158.   def blog
  159.     Blog.default
  160.   end
  161.   def initialize(*args)
  162.     if block_given?
  163.       super(*args) { |instance| yield instance }
  164.     else
  165.       super(*args)
  166.     end
  167.     self.class.fields.each do |field|
  168.       unless config.has_key?(field.key)
  169.         config[field.key] = field.default
  170.       end
  171.     end
  172.   end
  173.   def publish
  174.     self.active_position=self.staged_position
  175.   end
  176.   def config
  177.     self[:config] ||= { }
  178.   end
  179.   def sidebar_controller
  180.     @sidebar_controller ||= SidebarController.available_sidebars.find { |s| s.short_name == self.controller }
  181.   end
  182.   def html_id
  183.     short_name + '-' + id.to_s
  184.   end
  185.   def parse_request(contents, params)
  186.   end
  187.   def fields
  188.     self.class.fields
  189.   end
  190.   def fieldmap(field = nil)
  191.     if field
  192.       self.class.fieldmap[field.to_s]
  193.     else
  194.       self.class.fieldmap
  195.     end
  196.   end
  197.   def description
  198.     self.class.description
  199.   end
  200.   def short_name
  201.     self.class.short_name
  202.   end
  203.   def display_name
  204.     self.class.display_name
  205.   end
  206.   def content_partial
  207.     "/sidebars/#{short_name}/content"
  208.   end
  209.   def to_locals_hash
  210.     fields.inject({ :sidebar => self }) do |hash, field|
  211.       hash.merge(field.key => config[field.key])
  212.     end
  213.   end
  214.   def lifetime
  215.     self.class.lifetime
  216.   end
  217.   def view_root
  218.     self.class.view_root
  219.   end
  220. end