pages_controller.rb 7.7 KB
module Kanjai
  class PagesController < SiteController

    include Admin::PagesHelper

    after_filter :skip_set_cookies_header


    def show
      #expires_in 10.minutes, :public => true
      if @page_data
        if @page_data.page.private_flag == true
          if class_exists?('UserSession')
            unless UserSession.current_user
              render :template => 'kanjai/shared/401', status: 401, layout: false and return
            end
          end
        end
        #look - exist template or not for page
        if  @page_data.page.page_template
          use_cache = true
          if class_exists?('UserSession')
            if UserSession.current_user
              use_cache = false
            end
          end


          if current_admin_user || @page_data.page.private_flag == true || use_cache == false
            layer = @page_data.page.page_template.get_html_content
            content_for_render = setTemplateContent(@page_data.page.page_template, layer, @page_data)

            @pdf_content = content_for_render
            respond_to do |format|
              format.html{render :text => content_for_render}
              format.pdf{
                options = {
                  pdf: "file_name",
                  print_media_type: true,
                  orientation: params[:orientation],
                  page_size: params[:page_size] || 'A4'
                }

                if params['header_content']
                  options[:header] ||= {}
                  options[:header][:content] = params['header_content']
                end

                if params['footer_content']
                  options[:footer] ||= {}
                  options[:footer][:content] = params['footer_content']
                end

                render options
              }
            end

            #render :text => content_for_render and return
          else
            #if stale?(@page_data, public: false)
            if stale?(last_modified: @page_data.last_modified, etag: @page_data.etag_cache_key)
              layer = @page_data.page.page_template.get_html_content
              content_for_render = setTemplateContent(@page_data.page.page_template, layer, @page_data)
              render :text => content_for_render and return
            end
          end
          #render :html => content_for_render.html_safe
        else
          page_content = get_html_by_json_client(@page_data)
          render :html => page_content.html_safe and return
        end


      else
        render :template => 'kanjai/shared/404', status: 404, layout: false and return
      end
    end



    private

    def class_exists?(class_name)
      klass = Module.const_get(class_name)
      return klass.is_a?(Class)
    rescue NameError
      return false
    end


    def setTemplateContent(page_template, layer, page_data)

      unless current_admin_user
        layer.gsub!('<meta name="csrf-param" content="###CSRF_PARAM###"/>', '')
        layer.gsub!('<meta name="csrf-token" content="###CSRF_TOKEN###"/>', '')
      end

      layer.scan(/(<element name="([\w\W]+?)" type="([\w\W]+?)"><\/element>)/).each do |item|
        content = item[0]
        name = item[1]
        type = item[2]
        code = name.parameterize



        template_part = page_template.template_parts.find_by_code(code)

        if template_part
          html = TemplateGenerator::subpart_generate(page_template, template_part.part_type, template_part.elements)
          layer.gsub!(content, html)
        end



      end

      (0..1).each do |index|
        layer.scan(/(<element name="([\w\W]+?)"><\/element>)/).each do |item|
          content = item[0]
          name = item[1]
          code = name.parameterize

          template_part = page_template.template_parts.find_by_code(code)

          if template_part
            html = TemplateGenerator::subpart_generate(page_template, template_part.part_type, template_part.elements)
            layer.gsub!(content, html)
          end
        end
      end

      #try find in static elements
      page_template.page_content_markers.where(lang: I18n.locale).each do |marker|
        layer.gsub!(marker.marker, marker.text_value.to_s)
      end

      markers = PageTemplate.get_marker(layer)

      markers.each do |marker|
        case marker
          when '###CONTENT###'
            page_content = get_html_by_json_client(page_data)
            layer.gsub!(marker, page_content)
          when '###META_TITLE###'
            layer.gsub!(marker, page_data.meta_title.to_s)
          when '###META_DESCRIPTION###'
            layer.gsub!(marker, page_data.meta_description.to_s)
          when '###META_KEYWORDS###'
            layer.gsub!(marker, page_data.meta_keywords.to_s)
          when '###BODY_CONTENT_EDIT_CLASS_NAME###'
            body_class_name = ''
            body_class_name = 'editable-content' if current_admin_user
            layer.gsub!(marker, body_class_name)
          when '###VARIABLE_FOR_EDIT_CONTENT###'
            content = ''
            if current_admin_user
              content = show_frontend_editor_admin_page_url(@page_data.page)
            end
            layer.gsub!(marker, content)
          when '###CSRF_PARAM###'
            if current_admin_user || (class_exists?('UserSession') && UserSession.current_user)
              layer.gsub!(marker, Rack::Utils.escape_html(request_forgery_protection_token))
            end
          when '###CSRF_TOKEN###'
            if current_admin_user || (class_exists?('UserSession') && UserSession.current_user)
              layer.gsub!(marker, Rack::Utils.escape_html(form_authenticity_token))
            end
          when '###DOMAIN_NAME###'
            layer.gsub!(marker, $scheme + ADMIN_CONFIG['domain_name'])
          when '###INCLUDE_JS_FILE###'
            js_array = []
            if params[:format].to_s == 'pdf'
              css_path = "#{$scheme}#{ADMIN_CONFIG['domain_name']}#{ActionController::Base.helpers.asset_path('kanjai/pdf.css')}"
              layer.gsub!(marker, '<link rel="stylesheet" href="'+ css_path +'">')
            else  
              if current_admin_user
                js_array << "<script src='#{$scheme}#{ADMIN_CONFIG['domain_name']}#{ActionController::Base.helpers.asset_path('kanjai/frontend.js')}'></script>"
                css_path = "#{$scheme}#{ADMIN_CONFIG['domain_name']}#{ActionController::Base.helpers.asset_path('kanjai/frontend.css')}"
                js_array << "<script type='text/javascript'>$('<link>', {rel: 'stylesheet',type: 'text/css',href: '#{css_path}'}).appendTo('head');</script>"
              else
                js_array << "<script src='#{$scheme}#{ADMIN_CONFIG['domain_name']}#{ActionController::Base.helpers.asset_path('kanjai/frontend_not_login.js')}'></script>"
              end
              js_array << "<script src='#{$scheme}#{ADMIN_CONFIG['domain_name']}#{ActionController::Base.helpers.asset_path('kanjai/frontend_extend.js')}'></script>"
              css_path = "#{$scheme}#{ADMIN_CONFIG['domain_name']}#{ActionController::Base.helpers.asset_path('kanjai/frontend_extend.css')}"
              js_array << "<script type='text/javascript'>$('<link>', {rel: 'stylesheet',type: 'text/css',href: '#{css_path}'}).appendTo('head');</script>"
              layer.gsub!(marker, js_array.join(''))
            end
            
          else
            #if PageMarker.public_instance_methods.include?("process_#{marker.gsub('###', '')}".to_sym)
            #  page_marker = PageMarker.new
            #  content = page_marker.method("process_#{marker.gsub('###', '')}").call(page_data)
            #  layer.gsub!(marker, content)
            #end

        end
      end

      return layer

    end

    def skip_set_cookies_header
      unless current_admin_user
        request.session_options = {}
      end
    end




  end
end