# pass the layout=false for not rendering the layouts and also can specify the methods to in the backend controller. # data-layout-content="arrayname" in layouts can be used to render data in the array class PagesController < ApplicationController before_action :get_key layout :get_layout include PagesHelper before_filter :check_frontend_open, :only => [:home,:show] def index @pages = Page.all # render json: @pages end def edit_view @manifest = @key @dataApi = "edit" # @qq = render_to_string(:partial => @p, :layout => false) view = get_view if File.exists?(view) render view end end def home @manifest = @key @dataApi = nil page = Page.first impressionist(page) OrbitHelper.set_params params OrbitHelper.set_site_locale locale render :html => render_final_page("home#{$mobile}",page,true).html_safe end def show path = request.path.split('/') if path.size <= 2 or path.last.eql?("mobile") redirect_to root_path else if path.last.include? '-' params[:page_id] = path[-2] params[:slug] = path[-1] uid = path[-1].split("-").last uid = uid.split("?").first params[:uid] = uid params[:target_action] = params[:method] || "show" else params[:page_id] = path[-1] params[:slug] = nil params[:uid] = nil params[:target_action] = params[:method] || "index" end page = Page.find_by_param(params[:page_id]) if !page.nil? if page.enabled_for.include? I18n.locale.to_s module_app = page.module.downcase.pluralize params[:target_controller] = "#{module_app}" params[:url] = page.url @manifest = @key @dataApi = nil OrbitHelper.set_params params OrbitHelper.set_site_locale locale OrbitHelper.set_this_module_app module_app.singularize OrbitHelper.set_page_categories page.categories || [] OrbitHelper.set_page_data_count page.data_count if params[:layout].kind_of?(String) layout = to_bool(params[:layout]) else layout = true end impressionist(page) render :html => render_final_page("#{module_app}/#{params[:target_action]}",page,layout).html_safe else render :file => "#{Rails.root}/public/404.html", :layout => false, :status => :not_found end else render :file => "#{Rails.root}/public/404.html", :layout => false, :status => :not_found end end end def update_item_position @page = Page.find(params[:id]) new_parent_page = Page.find(params[:parent_id]) old_parent_page_id = @page.parent_page_id @page.parent_page_id = new_parent_page.id if new_parent_page.id != old_parent_page_id url = (new_parent_page.url == "/" ? "" : new_parent_page.url) @page.url = url + "/#{@page.page_id}" end @page.save params["children_ids"].each_with_index do |child,i| page = Page.find(child) page.number = i page.save end if new_parent_page.id != old_parent_page_id old_parent_page = Page.find(old_parent_page_id) old_parent_page.child_page.each_with_index do |page,i| page.number = i page.save end end render :json => {"success"=>true}.to_json end def preview render render_final_page end def destroy page = Page.find(params[:id]) page.destroy respond_to do |format| format.js end end def get_categories module_app = ModuleApp.find_by_key(params[:module]); @categories = module_app.categories.collect do |cat| { "title" => cat.title, "id" => cat.id.to_s } end render :json => {"categories" => @categories}.to_json end def new @page = Page.new @pages = Page.where(:page_id.ne => "" , :page_id.exists => true) @modules = ModuleApp.all.frontend_enabled end def edit @page = Page.find(params[:id]) @pages = Page.where(:page_id.ne => "" , :page_id.exists => true) @modules = ModuleApp.all.frontend_enabled module_app = ModuleApp.find_by_key(@page.module) rescue nil @categories = module_app.categories rescue [] end def update @page = Page.find(params[:id]) @page.update_attributes(page_update_params) @page.save respond_to do |format| format.js end end def create params['page']['page_id'] = params['page']['page_id'].gsub('-','_') @page = Page.new(page_params) @page.save! respond_to do |format| format.js end end private def render_final_page(original_view=get_view,page,layout) if layout parts = page.page_parts rescue [] @part_partials = {} if $mobile.blank? parts.each do |part| subparts = part.sub_parts partials = [] subparts.each do |subpart| if subpart.kind == "module_widget" OrbitHelper.set_widget_data_count subpart.data_count OrbitHelper.set_widget_categories subpart.categories OrbitHelper.set_widget_module_app subpart.module OrbitHelper.set_widget_item_url subpart custom_value = subpart.custom_string_field || subpart.custom_array_field rescue nil if !custom_value.nil? OrbitHelper.set_widget_custom_value custom_value end partials << render_widget_for_frontend(subpart.module,subpart.widget_method,subpart.widget_type) elsif subpart.kind == "text" partials << subpart.content end end @part_partials["data-pp='#{part.part_id}'"] = partials end end @file = nil @layout_html = nil if original_view == "home#{$mobile}" @file = File.join('../templates', "#{@key}", "/home#{$mobile}/index.html.erb") else @file = File.join('../templates', "#{@key}", "/home#{$mobile}/page.html.erb") end @layout_html = render_to_string(@file) doc = Nokogiri::HTML(@layout_html, nil, "UTF-8") @part_partials.each do |key, partial| html_string = "" partial.each do |p| html_string = html_string + p end pp = doc.css("*[#{key}]") pp = pp[0] pp.inner_html = html_string end if original_view != "home#{$mobile}" viewarea = doc.css("*[data-content='true']")[0] viewarea.inner_html = render_to_string(original_view) end link = doc.css("link")[0] link.attributes["href"].value = current_site.favicon.url.nil? ? "/assets/favicon.ico" : current_site.favicon.url doc.to_html else render_to_string(original_view) end end def get_widget_path(widget) file = File.join('../templates', "#{@key}", "modules/#{widget}") end def get_view page = Page.find(params[:id]) rescue Page.root if page == Page.root @view = File.join(Rails.root, 'app', 'templates', "#{@key}", 'home#{$mobile}/index.html.erb') else module_name = page.module.downcase.singularize @view = File.join(Rails.root, 'app', 'templates', "#{@key}", "modules#{$mobile}/#{module_name}/index.html.erb") end end def page_params page = Page.find(params[:page][:parent_page]) page.url = page.url == "/" ? "" : page.url @url = page.url + "/#{params[:page][:page_id]}" p = params.require(:page).permit(:number, :page_id, :module, :parent_page, :data_count, enabled_for_sitemap: [], enabled_for: [], menu_enabled_for: [], categories: [], name_translations: [:en, :zh_tw]) p["url"] = @url p end def page_update_params p = params.require(:page).permit(:number, :page_id, :module, :parent_page, :data_count, enabled_for_sitemap: [], enabled_for: [],menu_enabled_for: [], categories: [], name_translations: [:en, :zh_tw]) p["enabled_for"] = p["enabled_for"] || [] p["menu_enabled_for"] = p["menu_enabled_for"] || [] p end def get_layout if request[:action] == "edit_view" page = Page.find(params[:id]) if page.page_id == "" || page.page_id == nil false else File.join("../../templates", "#{@key}", "/#{@home}#{$mobile}/page.html.erb") end # elsif request[:action] == "show" || request[:action] == "moduleShow" # File.join("../../templates", "themes", "#{@key}", '/home/page.html.erb') else false end end def to_bool(str) return true if str == "true" return false if str == "false" end def check_frontend_open if !current_site.frontend_open && current_user.blank? redirect_to '/admin/dashboards' end end end