pages_controller.rb 7.44 KB
module Kanjai
  class Admin::PagesController < AdminController

    before_filter :get_page_list, :only => [:new, :create]
    before_filter :get_page_list_without_current, :only => [:edit, :update]

    def  new
      @page = Page.new
    end

    def create

      @page = Page.new(permitted_params[:page])

      if @page.save

        if @page.default_private_page
          Page.where('id != ?', @page.id).each  do |item|
            item.update_column(:default_private_page, false)
          end
        end

        if @page.root_page
          Page.where('id != ?', @page.id).each  do |item|
            item.update_column(:root_page, false)
          end
        end

        page_data = @page.page_data.new(
            lang: PageLang.default,
            title: @page.title
        )
        page_data.save(:validate => false)

        redirect_to edit_admin_page_url(@page, lang: PageLang.default)
      else
        render :action => :new
      end


    end

    def edit
      @page = Page.find(params[:id])
      @page_data = @page.page_data.find_by_lang(params[:lang])
      if @page_data.nil?
        @page_data = @page.page_data.new(
                                                lang: params[:lang]
                                            )
        @page_data.save(validate:false)
      end
    end

    def update
      @page = Page.find(params[:id])
      if @page.update(permitted_params[:page])

        if @page.default_private_page
          Page.where('id != ?', @page.id).each  do |item|
            item.update_column(:default_private_page, false)
          end
        end


        if @page.root_page
          Page.where('id != ?', @page.id).each  do |item|
            item.update_column(:root_page, false)
          end
        end

        redirect_to :action => :index
      else
        render :action => :edit, lang: params[:lang]
      end

    end

    def destroy
      @page = Page.find(params[:id])
      @page.destroy
      render :json => {:status => 'ok'}
    end


    def show_editor
      @page = Page.find(params[:id])
      @page_data = @page.page_data.find_by_lang(params[:lang])
      @structure_id = params[:structure_id]
      @obj = @page_data.page_contents.find_by_structure_id(@structure_id)
      if @obj.nil?
        @obj = PageContent.create({:page => @page, :page_datum => @page_data, :structure_id => @structure_id})
      end

      @type_contents = []

      @type_contents << [I18n.t('admin.content_types.rte_editor'), 'rte_editor']
      @type_contents << [I18n.t('admin.content_types.plugin'), 'plugin']
      if page_template = @page_data.page.page_template
        @type_contents += page_template.template_parts.where("part_type in ('content')").collect{|p| [p.name, p.code] }
      end


      @type_content = @obj.type_content

      @obj.build_markers(@obj.type_content)

      render :layout => false
    end

    def update_editor
      @page = Page.find(params[:id])
      @page_data = @page.page_data.find_by_lang(params[:lang])
      @structure_id = params[:structure_id]
      @obj = @page_data.page_contents.find_by_structure_id(@structure_id)

      if @obj.nil?
        @obj = PageContent.create({:page => @page, :page_datum => @page_data, :structure_id => @structure_id})
      end

      @obj.update(permitted_params[:page_content])

      render :json => {:status => 'ok', :structure_id => @structure_id, :html => @obj.get_content}
    end

    def gallery
      @page = Page.find(params[:id])
    end

    def meta
      @page = Page.find(params[:id])
      @page_data = @page.page_data.find_by_lang(params[:lang])
    end

    def meta_update
      @page = Page.find(params[:id])
      @page_data = @page.page_data.find_by_lang(params[:lang])

      if @page_data.update(permitted_params[:page_datum])
        redirect_to :action => :index
      else
        render :action => :meta, lang: params[:lang]
      end

    end


    def get_gallery
      @page = Page.find(params[:id])

      @collection = @page.images

      render :layout => false
    end

    def sort
      @page = Page.find(params[:id])

      case params[:direction]
        when 'up'
          @page.move_higher
        when 'down'
          @page.move_lower
      end

      redirect_to :action => :index

    end

    def structure
      @page = Page.find(params[:id])
      @page_data = @page.page_data.find_by_lang(params[:lang])
      if @page_data.nil?
        @page_data = @page.page_data.new(
            lang: params[:lang]
        )
        @page_data.save(validate:false)
      end

      @page_data.template_content ||= []
    end

    def save_structure
      @page = Page.find(params[:id])
      @page_data = @page.page_data.find_by_lang(params[:lang])
      content = JSON.parse(params[:content])


      if @page_data.update_attribute(:template_content, content)
        render :json => {:status => 'ok'}
      else
        render :json => {:status => 'error'}
      end

    end

    def delete_content
      @page = Page.find(params[:id])
      @page_data = @page.page_data.find_by_lang(params[:lang])
      if params[:structure_id]
        obj = @page_data.page_contents.find_by_structure_id(params[:structure_id])
        obj.destroy if obj
      end

      if params[:structure_ids]
        params[:structure_ids].each do |structure_id|
          obj = @page_data.page_contents.find_by_structure_id(structure_id)
          obj.destroy if obj
        end
      end

      render :nothing => true
    end

    def show_frontend_editor
      @page = Page.find(params[:id])
      @page_data = @page.page_data.find(params[:page_data_id])
      @structure_id = params[:structure_id]
      @obj = @page_data.page_contents.find_by_structure_id(@structure_id)
      if @obj.nil?
        @obj = PageContent.new
      end

      @type_content = @obj.type_content

      @obj.build_markers(@obj.type_content)


      render :layout => false
    end

    def update_frontend_editor
      @page = Page.find(params[:id])
      @page_data = @page.page_data.find(params[:page_data_id])
      @structure_id = params[:structure_id]
      @obj = @page_data.page_contents.find_by_structure_id(@structure_id)

      if @obj.nil?
        @obj = PageContent.create({:page => @page, :page_datum => @page_data, :structure_id => @structure_id})
      end

      @obj.update(permitted_params[:page_content])



      render :json => {:status => 'ok', :structure_id => @structure_id, :html => @obj.get_content_frontend}
    end

    private

    def permitted_params
      params.permit(:page => [:parent_id, :page_template_id, :title, :private_flag, :default_private_page, :root_page,
                    :page_data_attributes => [:id, :title, :url, :meta_title, :meta_description, :meta_keywords]],
                    :page_content => [:type_content, :text_html, :controller_name, :action_name,
                      page_content_markers_attributes: [:id, :page_content_id, :marker, :text_value, :attachment_file_name]
                    ],
                    :page_datum => [:id, :title, :url, :meta_title, :meta_description, :meta_keywords]
                  )
    end

    def get_page_list
      @pages = []
      Page.walk_tree do |page, level|
        @pages << {title: page.lang_attributes(PageLang.default, :title), level: level, id: page.id}
      end
    end

    def get_page_list_without_current
      @pages = []
      object = Page.find(params[:id])
      Page.where('id <> ?', object.id).walk_tree do |page, level|
        @pages << {title: page.lang_attributes(PageLang.default, :title), level: level, id: page.id}
      end
    end


  end
end