module BitrixOnRails::IblockElementPropS

Public Instance Methods

acts_as_iblock_element_prop_s(iblock_id, iblock_element_class) click to toggle source
# File lib/bitrix_on_rails/iblock_element_prop_s.rb, line 36
def acts_as_iblock_element_prop_s(iblock_id, iblock_element_class)
  extend ClassMethods
  include InstanceMethods

  @m_prop_class = "IblockElementPropM#{iblock_id}"
  @m_props = {}
  @s_props = {}

  Iblock.get_properties(iblock_id).select { |k,e|
    if e.multiple == 'Y'
      @m_props[e.code] = {:id => e.id, :type => e.property_type, :user_type => e.user_type}
    else
      @s_props[e.code] = {:id => e.id, :type => e.property_type, :user_type => e.user_type}
    end
  }

  set_table_name "b_iblock_element_prop_s#{iblock_id}"

  belongs_to :iblock_element, :class_name => iblock_element_class.name

  @s_props.each { |code, property|
    define_method(code) do
      value = send "property_#{property[:id]}"
      unserialize value, property[:type], property[:user_type]
    end

    define_method("#{code}=") do |val|
      send "property_#{property[:id]}=", serialize(val, property[:type], property[:user_type])
    end

    define_method "find_by_#{code}" do |val|
      send "find_by_property#{property[:id]}", serialize(val, property[:type], property[:user_type])
    end
  }

  @m_props.each { |code, property|
    define_method(code) do
      instance_variable_get("@m_prop_#{property[:id]}".to_sym) ||
      instance_variable_set("@m_prop_#{property[:id]}".to_sym, MPropValuesWrapper.new(self.iblock_element_id, property[:id], m_prop_class))
    end
  }

  before_save do
    self.class.m_props.each { |code, p|
      values = send(code).values
      self.send("property_#{p[:id]}=", ::PHP.serialize_encoded({'VALUE' => values, 'DESCRIPTION' => Array.new(values.size, nil)}))
    }
  end
end