page.rb 3.04 KB
require 'acts_as_list'
require 'acts_as_tree'

module Kanjai
  class Page < ActiveRecord::Base

    extend ActsAsTree::TreeWalker

    include ActiveRecord::Acts::Tree
    include ActiveRecord::Acts::List

    belongs_to :domain

    acts_as_tree order: 'position', scope: :domain_id
    acts_as_list :scope => :parent_id

    belongs_to :page_template

    has_many :images, as: :object
    has_many :page_data, dependent: :destroy
    accepts_nested_attributes_for :page_data

    validates :title, presence: true, :if => lambda { |o| o.new_record? }

    #serialize :template_content, Array

    attr_accessor :title

    enum status: {
      active: 0,
      block: 1
    }    


    def menu_url(scheme, lang = nil)

      lang = I18n.locale.to_s if lang.nil?

      url = self.lang_attributes(lang, :url)

      if url.present?
        return generate_url(scheme, url, lang)
      else
        url = self.lang_attributes(ADMIN_CONFIG['default_lang'], :url)
        if url.present?
          return generate_url(scheme, url, ADMIN_CONFIG['default_lang'])
        else
          ''
        end
      end
    end

    def generate_url(scheme, url, lang)
      lang = I18n.locale.to_s if lang.nil?

      if /(http|https):\/\//.match url
        url
      else
        if /\//.match url
          if url  == '/'
            scheme + ADMIN_CONFIG['domain_name'] + '/' +  lang
          else
            scheme + ADMIN_CONFIG['domain_name'] + '/' +  lang + url
          end
        else
          scheme + ADMIN_CONFIG['domain_name'] + '/' +  lang + '/' + url
        end
      end
    end

    def lang_attributes(lang_code, attributes)
      data = self.page_data.find_by_lang(lang_code)
      if data
        data[attributes]
      else
        ''
      end
    end

    def clone
      Page.transaction do
        new_page = self.dup
        new_page.save(validate: false)
        self.page_data.each do |item|
          new_item = item.dup
          new_item.page = new_page
          new_item.title = "Copy #{item.title}"
          new_item.save(validate: false)
          item.page_contents.each do |page_content|
            new_page_content = page_content.dup
            new_page_content.page = new_page
            new_page_content.page_datum = new_item
            new_page_content.save(validate: false)
            page_content.page_content_markers.each do |page_content_marker|
              new_page_content_marker = page_content_marker.dup
              new_page_content_marker.page_content = new_page_content
              new_page_content_marker.save(validate: false)
            end
          end
        end
        new_page.insert_at(self.position + 1)
      end
    end

    def self.default_public_page_url(scheme)
      page = Page.where(private_flag: false, root_page: true).first
      if page
        return page.menu_url(scheme)
      end
      return '/'
    end

    def self.default_private_page_url(scheme)
      page = Page.where(private_flag: true, default_private_page: true).first
      if page
        return page.menu_url(scheme)
      end
      return '/'
    end

  end
end