Module: CamaleonCms::CustomFieldsRead

Extended by:
ActiveSupport::Concern
Included in:
PostDefault, TermTaxonomy, User
Defined in:
app/models/concerns/camaleon_cms/custom_fields_read.rb

Overview

Camaleon CMS is a content management system

Copyright (C) 2015 by Owen Peredo Diaz
Email: [email protected]
This program is free software: you can redistribute it and/or modify   it under the terms of the GNU Affero General Public License as  published by the Free Software Foundation, either version 3 of the  License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,  but WITHOUT ANY WARRANTY; without even the implied warranty of  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the  GNU Affero General Public License (GPLv3) for more details.

Instance Method Summary collapse

Instance Method Details

#add_custom_field_group(values, kind = "Post") ⇒ Object Also known as: add_field_group

Model supported: PostType, Category, Post, Posttag, Widget, Plugin, Theme, User and Custom models pre configured Note 1: If you need add fields for all post's or all categories, then you need to add the fields into the

post_type.add_custom_field_group(values, kind = "Post")
post_type.add_custom_field_group(values, kind = "Category")

Note 2: If you need add fields for only the Post_type, you have to use options or metas return: CustomFieldGroup object kind: argument only for PostType model: (Post | Category | PostTag), default => Post. If kind = “” this will add group for all post_types


139
140
141
142
143
144
145
146
# File 'app/models/concerns/camaleon_cms/custom_fields_read.rb', line 139

def add_custom_field_group(values, kind = "Post")
  values = values.with_indifferent_access
  group = get_field_groups(kind).where(slug: values[:slug]).first
  unless group.present?
    group = get_field_groups(kind).create(values)
  end
  group
end

#add_custom_field_to_default_group(item, options, kind = "Post") ⇒ Object Also known as: add_field

Add custom fields for a default group: This will create a new group with slug=_default if it doesn't exist yet more details in add_manual_field(item, options) from custom field groups kind: argument only for PostType model: (Post | Category | PostTag), default => Post


153
154
155
156
157
# File 'app/models/concerns/camaleon_cms/custom_fields_read.rb', line 153

def add_custom_field_to_default_group(item, options, kind = "Post")
  g = get_field_groups(kind).where(slug: "_default").first
  g = add_custom_field_group({name: "Default Field Group", slug: "_default"}, kind) unless g.present?
  f = g.add_manual_field(item, options)
end

#get_field!(_key, _default = nil) ⇒ Object

the same as the_field() but if the value is not present, this will return default value


80
81
82
83
84
# File 'app/models/concerns/camaleon_cms/custom_fields_read.rb', line 80

def get_field!(_key, _default = nil)
  v = _default
  v = get_field_values(_key).first rescue _default
  v.present? ? v : _default
end

#get_field_groups(args = {}) ⇒ Object

args: (String) => is a value for kind attribute


26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'app/models/concerns/camaleon_cms/custom_fields_read.rb', line 26

def get_field_groups(args = {})
  args = args.is_a?(String) ?  {kind: args, include_parent: false } : {kind: "post", include_parent: false }.merge(args)
  class_name = self.class.to_s.gsub("Decorator","").gsub("CamaleonCms::","")
  case class_name
    when 'Category','Post','PostTag'
      if args[:include_parent]
         self.post_type.site.custom_field_groups.where("(objectid = ? AND object_class = ?) OR (objectid = ? AND object_class = ?)", self.id || -1, class_name, self.post_type.id, "PostType_#{class_name}")
      else
        self.post_type.site.custom_field_groups.where(objectid: self.id || -1, object_class: class_name)
      end
    when 'Widget::Main'
      self.site.custom_field_groups.where(object_class: class_name, objectid:  self.id)
    when 'Theme'
      self.site.custom_field_groups.where(object_class: class_name, objectid:  self.id)
    when 'Site'
      self.custom_field_groups.where(object_class: class_name)
    when 'NavMenuItem'
      # self.main_menu.custom_field_groups //verify this problem
      puts "get_field_groups - NavMenuItem: **************#{self.inspect}***** #{self.main_menu.inspect}"
      CamaleonCms::NavMenu.find(self.main_menu.id).get_field_groups
    when 'PostType'
      if args[:kind] == "all"
        self.site.custom_field_groups.where(object_class: ["PostType_Post", "PostType_Post", "PostType_PostTag", "PostType"], objectid:  self.id )
      elsif args[:kind] == "post_type"
        self.site.custom_field_groups.where(object_class: class_name)
      else
        self.site.custom_field_groups.where(object_class: "PostType_#{args[:kind]}", objectid:  self.id )
      end
    else # 'Plugin' or other class
      self.site.custom_field_groups.where(object_class: class_name, objectid:  self.id) if defined?(self.site)
  end
end

#get_field_object(slug) ⇒ Object

return field object for current model


192
193
194
# File 'app/models/concerns/camaleon_cms/custom_fields_read.rb', line 192

def get_field_object(slug)
  CamaleonCms::CustomField.where(parent_id: get_field_groups.pluck(:id), slug: slug).first || CamaleonCms::CustomField.where(slug: slug, parent_id: get_field_groups({include_parent: true})).first
end

#get_field_value(_key, _default = nil) ⇒ Object Also known as: get_field

get custom field value _key: custom field key if value is not present, then return default return default only if the field was not registered


72
73
74
75
76
# File 'app/models/concerns/camaleon_cms/custom_fields_read.rb', line 72

def get_field_value(_key, _default = nil)
  v = _default
  v = get_field_values(_key).first rescue _default
  v.present? ? v : _default
end

#get_field_values(_key) ⇒ Object Also known as: get_fields

get custom field values _key: custom field key


88
89
90
# File 'app/models/concerns/camaleon_cms/custom_fields_read.rb', line 88

def get_field_values(_key)
  self.field_values.where(custom_field_slug: _key).pluck(:value)
end

#get_field_values_hashObject

return all values value3, key2: [value1, value2], key3: value4


101
102
103
104
105
106
107
108
109
# File 'app/models/concerns/camaleon_cms/custom_fields_read.rb', line 101

def get_field_values_hash
  fields = {}
  self.field_values.to_a.uniq.each do |field_value|
    custom_field = field_value.custom_fields
    values = custom_field.values.where(objectid: self.id).pluck(:value)
    fields[field_value.custom_field_slug] = custom_field.options[:multiple].to_s.to_bool ? values : values.first
  end
  fields.to_sym
end

#get_fields_object(f = true) ⇒ Object

return all custom fields for current element {options: {, values: [], name: '', …} } deprecated f attribute


114
115
116
117
118
119
120
121
122
123
124
# File 'app/models/concerns/camaleon_cms/custom_fields_read.rb', line 114

def get_fields_object(f=true)
  fields = {}
  self.field_values.to_a.uniq.each do |field_value|
    custom_field = field_value.custom_fields
    # if custom_field.options[:show_frontend].to_s.to_bool
    values = custom_field.values.where(objectid: self.id).pluck(:value)
    fields[field_value.custom_field_slug] = custom_field.attributes.merge(options: custom_field.options, values: custom_field.options[:multiple].to_s.to_bool ? values : values.first)
    # end
  end
  fields.to_sym
end

#get_user_field_groups(site) ⇒ Object

get custom field groups for current user return collections CustomFieldGroup site: site object


62
63
64
65
# File 'app/models/concerns/camaleon_cms/custom_fields_read.rb', line 62

def get_user_field_groups(site)
  class_name = self.class.to_s.gsub("Decorator","")
  site.custom_field_groups.where(object_class: class_name)
end

#save_field_value(key, value, order = 0, clear = true) ⇒ Object

clear and register values for this custom field key: slug of the custom field value: array of values for multiple values support value: string value


200
201
202
203
204
205
206
207
208
209
210
211
# File 'app/models/concerns/camaleon_cms/custom_fields_read.rb', line 200

def save_field_value(key, value, order = 0, clear = true)
  field = get_field_object(key)
  return unless field.present?
  self.field_values.where({custom_field_slug: key}).destroy_all if clear
  if value.is_a?(Array)
    value.each do |val|
      self.field_values.create!({custom_field_id: field.id, custom_field_slug: key, value: fix_meta_value(val), term_order: order})
    end
  else
    self.field_values.create!({custom_field_id: field.id, custom_field_slug: key, value: fix_meta_value(value), term_order: order})
  end
end

#set_field_values(datas = {}) ⇒ Object

only custom field plugin (protected) example: id: custom_field_id { :key : 123, values: ['uno','dos'] :key2 : 455, values: ['uno','dos'] :key3 : 4555, values: ['uno','dos'] }


168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
# File 'app/models/concerns/camaleon_cms/custom_fields_read.rb', line 168

def set_field_values(datas = {})
  ids_old = self.field_values.pluck(:id)
  ids_saved = []
  if datas.present?
    datas.each do |key, values|
      if values[:values].present?
        order_value = 0
        values[:values].each do |value|
          item = self.field_values.where({custom_field_id: values[:id], custom_field_slug: key, value: fix_meta_value(value)}).first_or_create!()
          if defined?(item.id)
            item.update_column('term_order', order_value)
            ids_saved << item.id
            order_value += 1
          end
        end
      end
    end
  end

  ids_deletes = ids_old - ids_saved
  self.field_values.where(id: ids_deletes).destroy_all if ids_deletes.present?
end

#update_field_value(_key, value = nil) ⇒ Object

————- new function update field value ————-


94
95
96
# File 'app/models/concerns/camaleon_cms/custom_fields_read.rb', line 94

def update_field_value(_key, value = nil)
  self.field_values.where(custom_field_slug: _key).first.update_column('value', value) rescue nil
end