module BitrixOnRails

Public Class Methods

configure() { |config| ... } click to toggle source
# File lib/bitrix_on_rails.rb, line 6
def self.configure
  return unless ::ActiveRecord::Base.connection.tables.include? 'b_iblock'

  config = Configuration.new
  yield config

  config.infoblocks.each { |infoblock|
    BitrixOnRails.define_iblock_class(infoblock[:iblock_id], infoblock[:options])
  }
end
define_iblock_class(iblock_id, options = {}) click to toggle source
# File lib/bitrix_on_rails/iblock_element.rb, line 10
def self.define_iblock_class(iblock_id, options = {})
  iblock_version = Iblock.find(iblock_id).version

  iblock_element_class = send("create_iblock_v#{iblock_version}_class", iblock_id, options[:extended_class], options[:extended_by])

  unless options[:extended_class]
    # Определяем имя класса, который нужно создать, а также namespace, в котором
    # его нужно создать.
    if class_name = options[:class_name]
      a = class_name.split('::')

      class_name = a.last

      namespace = a[0..-2].join('::')
      namespace = namespace.empty? ? Object : Object.const_get(namespace)
    else
      class_name = "IblockElement#{iblock_id}"
      namespace  = Object
    end

    namespace.const_set(class_name, iblock_element_class)
  end

  # Порядок вызова важен, так как только в этот момент у iblock_element_class появляется имя, которое
  # используется в IblockElementPropS.
  create_prop_classes(iblock_id, iblock_element_class) if iblock_version == 2

  iblock_element_class
end
infoblocks() click to toggle source
# File lib/bitrix_on_rails/iblock_element.rb, line 6
def self.infoblocks
  @@infoblocks
end

Protected Class Methods

create_iblock_class(iblock_id, extended_class = nil, extended_by = nil, &blk) click to toggle source
# File lib/bitrix_on_rails/iblock_element.rb, line 70
def self.create_iblock_class(iblock_id, extended_class = nil, extended_by = nil, &blk)
  iblock_element_class = extended_class || Class.new(::IblockElement) {}

  iblock_element_class.instance_eval do
    @iblock_id = iblock_id
    @iblock_properties = Iblock.get_properties(iblock_id).inject({}){ |a,e| a[e[1].code] = {:id => e[1].id, :multiple => e[1].multiple == 'Y'}; a}

    instance_eval(&blk)

    default_scope where(:iblock_id => iblock_id)
  end

  iblock_element_class.extend Object.const_get(extended_by) if extended_by

  @@infoblocks[iblock_id] = iblock_element_class

  iblock_element_class
end
create_iblock_v1_class(iblock_id, extended_class = nil, extended_by = nil) click to toggle source
# File lib/bitrix_on_rails/iblock_element.rb, line 42
def self.create_iblock_v1_class(iblock_id, extended_class = nil, extended_by = nil)
  create_iblock_class(iblock_id, extended_class, extended_by) do
    has_many :prop_values, :class_name => 'IblockElementProperty', :foreign_key => 'iblock_element_id'

    @iblock_properties.each { |m, property|
      define_method m do
        prop_values.where(:iblock_property_id => property[:id]).first.try(:value)
      end

      define_method "#{m}=" do |value|
        prop_values.create(:iblock_property_id => property[:id], :value => value)
      end
    }
  end
end
create_iblock_v2_class(iblock_id, extended_class = nil, extended_by = nil) click to toggle source
# File lib/bitrix_on_rails/iblock_element.rb, line 58
def self.create_iblock_v2_class(iblock_id, extended_class = nil, extended_by = nil)
  create_iblock_class(iblock_id, extended_class, extended_by) do
    has_one :property_set, :class_name => "IblockElementPropS#{iblock_id}", :foreign_key => 'iblock_element_id', :autosave => true
    has_many :m_props, :class_name => "IblockElementPropM#{iblock_id}", :foreign_key => 'iblock_element_id', :readonly => true

    @iblock_properties.each { |m, property|
      delegate m, :to => :property_set
      delegate "#{m}=", :to => :property_set unless property[:multiple]
    }
  end
end
create_prop_classes(iblock_id, iblock_element_class) click to toggle source
# File lib/bitrix_on_rails/iblock_element.rb, line 89
def self.create_prop_classes(iblock_id, iblock_element_class)
  const_name = "IblockElementPropS#{iblock_id}"
  unless Object.const_defined? const_name
    c = Class.new(::ActiveRecord::Base) do
      extend BitrixOnRails::IblockElementPropS

      class << self
        # Имя класса, хранящего значения для множественных свойств
        @m_prop_class = nil

        # Список множественных свойств
        @m_props = nil

        # Список одиночных свойств
        @s_props = nil

        def m_prop_class
          Object.const_get(@m_prop_class)
        end

        def m_props
          @m_props
        end

        def s_props
          @s_props
        end
      end

      acts_as_iblock_element_prop_s(iblock_id, iblock_element_class)
    end
    Object.const_set const_name, c
  end

  const_name = "IblockElementPropM#{iblock_id}"
  unless Object.const_defined? const_name
    c = Class.new(::ActiveRecord::Base) do
      extend BitrixOnRails::IblockElementPropM
      acts_as_iblock_element_prop_m(iblock_id)
    end
    Object.const_set "IblockElementPropM#{iblock_id}", c
  end

  # Вставляем связи с i_block_element_prop_* на уровень IblockElement. Это может быть полезно
  # в том случае, если пользователь получил объект класса IblockElement, а не создаваемого.
  # Использование этих связей полностью в компетенции пользователя объекта.
  IblockElement.instance_eval do
    has_one  "iblock_element_prop_s#{iblock_id}".to_sym
    has_many "iblock_element_prop_m#{iblock_id}".to_sym
  end
end
m_prop_class() click to toggle source
# File lib/bitrix_on_rails/iblock_element.rb, line 105
def m_prop_class
  Object.const_get(@m_prop_class)
end
m_props() click to toggle source
# File lib/bitrix_on_rails/iblock_element.rb, line 109
def m_props
  @m_props
end
s_props() click to toggle source
# File lib/bitrix_on_rails/iblock_element.rb, line 113
def s_props
  @s_props
end