page.rb 4.94 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 full_url(scheme, lang = nil)
      "#{scheme}#{domain.title}#{menu_url(scheme, lang)}"
    end


    def menu_url(scheme, lang = nil)

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

      url = self.lang_attributes(lang, :url)

      if url.present?
        return self.generate_url(scheme, url, lang)
      else
        url = self.lang_attributes(ADMIN_CONFIG['default_lang'], :url)
        if url.present?
          return self.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
      elsif url[0] == '/'
        url  == '/' ? "/#{lang}" : "/#{lang}#{url}"
      else
        current_page = self
        segments = []
        loop do
          current_page_url = current_page.lang_attributes(lang, :url)
          segments << current_page_url.gsub(/^\//, '').gsub(/\/$/, '') if current_page_url.to_s.present?
          break if current_page_url.to_s.present? && current_page_url[0] == '/'
          break if current_page.parent.nil?
          current_page = current_page.parent
        end

        url = segments.reverse.join('/')
        url = "/#{url}" unless url[0] == '/'
        "/#{lang}#{url}"
      end
    end

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

      if /(http|https):\/\//.match url
        url
      else
        if /\//.match url
          if url  == '/'
            '/' +  lang
          else
            '/' +  lang + url
          end
        else
          '/' +  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 added_to_sitemap?(lang)
      url = self.lang_attributes(lang, :url)
      count_contents = page_data.joins(:page_contents).where(lang: lang)

      url != ":param" && count_contents.any?
    end

    def plugin_sitemap_pages
      lang = I18n.locale.to_s

      page_url = full_url('https://', lang)

      [].tap do |n|
        page_data.where(lang: lang).each do |item|
          item.page_contents.each do |page_content|
            if page_content.type_content == 'plugin'
              controller = page_content.controller_name.constantize.new
              response = controller.send 'generate_sitemap'
              if response
                response.each do |plugin_page|
                  if plugin_page[:segment].present?
                    n << "#{page_url}/#{plugin_page[:segment]}"
                  end
                end
              end
            end
          end
        end
      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

    def self.pages_for_choose(domain)
      [].tap do |n|
        domain.pages.walk_tree do |page, level|
          n << {title: page.lang_attributes(PageLang.default(domain), :title), level: level, id: page.id}
        end
      end
    end

  end
end