Class: Rich::Cms::Content::Item

Inherits:
Object
  • Object
show all
Defined in:
lib/rich/cms/content/item.rb

Instance Method Summary collapse

Constructor Details

#initialize(*args) ⇒ Item

Returns a new instance of Item.



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/rich/cms/content/item.rb', line 7

def initialize(*args)
  if args.size == 1 && args.first.is_a?(Hash)
    hash  = args.first
  elsif args.size == 2
    array = args
  else
    raise ArgumentError, "Invalid arguments #{args.inspect} passed for #{self.class.name}"
  end

  if hash && (selector = hash.stringify_keys["__selector__"])
    @group  = Engine.editable_content[selector]
    @object = @group.fetch hash, false

    attributes, params = hash.partition{|k, v| @object.attribute_names.include? k.to_s}

    @object.attributes = Hash[*attributes.flatten]
    @params            = HashWithIndifferentAccess[*params.flatten]

  elsif array && array.first.is_a?(Group) && array.last.is_a?(::ActiveRecord::Base)
    @group, @object = *array
  end
end

Instance Method Details

#saveObject



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/rich/cms/content/item.rb', line 30

def save
  @object.save

  if @object.respond_to? :to_rich_cms_response
    hash = @object.to_rich_cms_response @params
  else
    keys = @group.keys << @group.value.to_s
    hash = @object.attributes.reject{|k, v| !keys.include?(k.to_s)}
  end

  selector   = @group.selector
  identifier = @group.identifiers.inject({}){|h, k| h[k] = @object.send(k); h}

  hash.merge({:__selector__ => selector, :__identifier__ => identifier})
end

#to_tag(options = {}) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/rich/cms/content/item.rb', line 46

def to_tag(options = {})
  attrs   = []
  default = @group.identifiers.size == 1 ? @object.send(@group.identifiers.first) : @object.attributes.values_at(*@group.identifiers).inspect
  value   = @object.send(@group.value)

  unless Auth.
    default = "< #{default} >"
    keys    = @group.keys << @group.value.to_s
    data    = @object.attributes.reject{|k, v| !keys.include?(k.to_s)}

    data[:editable_input_type] = options[:as] if %w(string text html).include? options[:as].to_s.downcase

    if class_name = @group.selector.match(/^\.\w+$/)
      (options[:html] ||= {}).store :class, [class_name.to_s.gsub(/^\./, ""), options[:html].try(:fetch, :class, nil)].compact.join(" ")
    end

    attrs << data          .collect{|k, v| "data-#{k}=\"#{::ERB::Util.html_escape v}\""}.join(" ")
  end

  attrs << options[:html].collect{|k, v|      "#{k}=\"#{::ERB::Util.html_escape v}\""}.join(" ") if options[:html]

  tag = options[:tag] || @group.tag || (%w(text html).include?(options[:as].to_s.downcase) ? :div : :span)

  if options[:tag] == :none
    "#{value.blank? ? default : value}"
  else
    # Make default for editable
    tag = :span if tag == :none
    "<#{tag} #{attrs.join(" ")}>#{value.blank? ? default : value}</#{tag}>".html_safe
  end
end