# frozen_string_literal: true module Alchemy module PagesHelper include Alchemy::BaseHelper include Alchemy::ElementsHelper # Renders links to language root pages of all published languages. # # @option options linkname [String] ('name') # Renders name/code of language, or I18n translation for code. # # @option options show_title [Boolean] (true) # Renders title attributes for the links. # # @option options spacer [String] ('') # Renders the passed spacer string. You can also overwrite the spacer partial: "alchemy/language_links/_spacer". # # @option options reverse [Boolean] (false) # Reverses the ordering of the links. # def language_links(options = {}) options = { linkname: "name", show_title: true, spacer: "", reverse: false }.merge(options) languages = Language.on_current_site.published.with_root_page.order("name #{options[:reverse] ? "DESC" : "ASC"}") return nil if languages.count < 2 render( partial: "alchemy/language_links/language", collection: languages, spacer_template: "alchemy/language_links/spacer", locals: {languages: languages, options: options} ) end # Renders the layout for current page. # # Page layout files belongs in +/app/views/alchemy/page_layouts/+ # # Falls back to +/app/views/alchemy/page_layouts/standard+ if the page_layout partial is not found. # def render_page_layout render @page, page: @page rescue ActionView::MissingTemplate warning("PageLayout: '#{@page.page_layout}' not found. Rendering standard page_layout.") render "alchemy/page_layouts/standard", page: @page end # Renders a partial for current site # # Place a rails partial into +app/views/alchemy/site_layouts+ # # and name it like your site name. # # == Example: # # <%= render_site_layout %> # # renders +app/views/alchemy/site_layouts/_default_site.html.erb+ for the site named "Default Site". # def render_site_layout(&block) render current_alchemy_site, &block rescue ActionView::MissingTemplate => error error_or_warning(error, "Site layout for #{current_alchemy_site.try(:name)} not found. Please run `rails g alchemy:site_layouts`") end # Renders a menu partial # # Menu partials are placed in the `app/views/alchemy/menus` folder # Use the `rails g alchemy:menus` generator to create the partials # # @param [String] - Type of the menu # @param [Hash] - A set of options available in your menu partials def render_menu(menu_type, options = {}) root_node = Alchemy::Node.roots.find_by( menu_type: menu_type, language: Alchemy::Current.language ) if root_node.nil? warning("Menu with type #{menu_type} not found!") return end render("alchemy/menus/#{menu_type}/wrapper", menu: root_node, options: options) rescue ActionView::MissingTemplate => error error_or_warning(error, "Menu partial for #{menu_type} not found. Please run `rails g alchemy:menus`") end # Returns page links in a breadcrumb beginning from root to current page. # # === Options: # # separator: %(>) # Maybe you don't want this separator. Pass another one. # page: @page # Pass a different Page instead of the default (@page). # without: nil # Pass Page object or array of Pages that must not be displayed. # restricted_only: false # Pass boolean for displaying restricted pages only. # reverse: false # Pass boolean for displaying breadcrumb in reversed reversed. # def render_breadcrumb(options = {}) options = { separator: ">", page: @page, restricted_only: false, reverse: false, link_active_page: false }.merge(options) pages = options[:page] .self_and_ancestors.contentpages .published if options.delete(:restricted_only) pages = pages.restricted end if options.delete(:reverse) pages = pages.reorder("lft DESC") end if options[:without].present? without = options.delete(:without) pages = pages.where.not(id: without.try(:collect, &:id) || without.id) end render "alchemy/breadcrumb/wrapper", pages: pages, options: options end # Returns current page title # # === Options: # # prefix: "" # Prefix # separator: "" # Separating prefix and title # def page_title(options = {}) return "" if @page.title.blank? options = { prefix: "", suffix: "", separator: "" }.update(options) title_parts = [options[:prefix]] title_parts << if response.status == 200 @page.title else response.status end title_parts << options[:suffix] title_parts.reject(&:blank?).join(options[:separator]).html_safe end def meta_description @page.meta_description.presence || Language.current_root_page.try(:meta_description) end def meta_keywords @page.meta_keywords.presence || Language.current_root_page.try(:meta_keywords) end def meta_robots "#{@page.robot_index? ? "" : "no"}index, #{@page.robot_follow? ? "" : "no"}follow" end private def error_or_warning(error, message) if Rails.application.config.consider_all_requests_local? raise error, message else Rails.logger.error message "" end end end end