diff --git a/app/assets/javascripts/locomotive/models/page.js.coffee b/app/assets/javascripts/locomotive/models/page.js.coffee index 4ff2cde1..352b440c 100644 --- a/app/assets/javascripts/locomotive/models/page.js.coffee +++ b/app/assets/javascripts/locomotive/models/page.js.coffee @@ -16,12 +16,9 @@ class Locomotive.Models.Page extends Backbone.Model toJSON: -> _.tap super, (hash) => - _.each ['content_type_id_text', 'edit_url', 'parent_id_text', 'response_type_text'], (key) => delete hash[key] + _.each ['edit_url', 'parent_id_text', 'response_type_text'], (key) => delete hash[key] delete hash['editable_elements'] hash.editable_elements = @get('editable_elements').toJSONForSave() if @get('editable_elements')? && @get('editable_elements').length > 0 - delete hash['target_klass_name'] - hash.target_klass_name = @get('target_klass_name') if @get('templatized') == true - class Locomotive.Models.PagesCollection extends Backbone.Collection \ No newline at end of file diff --git a/app/assets/javascripts/locomotive/views/pages/_form_view.js.coffee b/app/assets/javascripts/locomotive/views/pages/_form_view.js.coffee index 3531ef1d..bb453373 100644 --- a/app/assets/javascripts/locomotive/views/pages/_form_view.js.coffee +++ b/app/assets/javascripts/locomotive/views/pages/_form_view.js.coffee @@ -41,7 +41,7 @@ class Locomotive.Views.Pages.FormView extends Locomotive.Views.Shared.FormView @enable_response_type_select() # enable check boxes - @enable_templatized_checkbox() + @enable_wildcard_checkbox() @enable_redirect_checkbox() @@ -112,11 +112,6 @@ class Locomotive.Views.Pages.FormView extends Locomotive.Views.Shared.FormView data: { parent_id: @$('#page_parent_id').val(), slug: @$('#page_slug').val() } success: (data) => @$('#page_slug_input .inline-hints').html(data.url).effect('highlight') - if data.templatized_parent - @$('li#page_slug_input').show() - @$('li#page_templatized_input, li#page_target_klass_name_input').hide() - else - @$('li#page_templatized_input, li#page_target_klass_name_input').show() enable_response_type_select: -> @$('li#page_response_type_input').change (event) => @@ -126,19 +121,13 @@ class Locomotive.Views.Pages.FormView extends Locomotive.Views.Shared.FormView @model.set redirect: false @$('li#page_redirect_input, li#page_redirect_url_input').hide() - enable_templatized_checkbox: -> - @_enable_checkbox 'templatized', - features: ['slug', 'redirect', 'listed'] - on_callback: => - @$('li#page_target_klass_name_input').show() - off_callback: => - @$('li#page_target_klass_name_input').hide() - - @$('li#page_templatized_input').hide() if @model.get('templatized_from_parent') == true + enable_wildcard_checkbox: -> + @_enable_checkbox 'wildcard', + features: ['redirect', 'listed'] enable_redirect_checkbox: -> @_enable_checkbox 'redirect', - features: ['templatized', 'cache_strategy'] + features: ['wildcard', 'cache_strategy'] on_callback: => @$('li#page_redirect_url_input').show() off_callback: => diff --git a/app/assets/stylesheets/locomotive/backoffice/application.css.scss b/app/assets/stylesheets/locomotive/backoffice/application.css.scss index d449f550..df7cebf8 100644 --- a/app/assets/stylesheets/locomotive/backoffice/application.css.scss +++ b/app/assets/stylesheets/locomotive/backoffice/application.css.scss @@ -289,7 +289,7 @@ ul.list { cursor: move; } - &.templatized > .inner > a { + &.wildcard > .inner > a { padding-right: 24px; background: transparent image-url("locomotive/list/icons/template.png") no-repeat right 2px; } diff --git a/app/controllers/locomotive/pages_controller.rb b/app/controllers/locomotive/pages_controller.rb index d607b609..7ee5ec34 100644 --- a/app/controllers/locomotive/pages_controller.rb +++ b/app/controllers/locomotive/pages_controller.rb @@ -53,10 +53,10 @@ module Locomotive end def get_path - page = current_site.pages.build(:parent => current_site.pages.find(params[:parent_id]), :slug => params[:slug].permalink).tap do |p| + page = current_site.pages.build(:parent => current_site.pages.find(params[:parent_id]), :slug => params[:slug].permalink, :wildcard => params[:wildcard]).tap do |p| p.valid?; p.send(:build_fullpath) end - render :json => { :url => public_page_url(page), :slug => page.slug, :templatized_parent => page.templatized_from_parent? } + render :json => { :url => public_page_url(page), :slug => page.slug } end end diff --git a/app/helpers/locomotive/pages_helper.rb b/app/helpers/locomotive/pages_helper.rb index c9f7b63a..91e05821 100644 --- a/app/helpers/locomotive/pages_helper.rb +++ b/app/helpers/locomotive/pages_helper.rb @@ -2,7 +2,7 @@ module Locomotive module PagesHelper def css_for_page(page) - %w(index not_found templatized redirect).inject([]) do |memo, state| + %w(index not_found wildcard redirect).inject([]) do |memo, state| memo << state.dasherize if page.send(:"#{state}?") memo end.join(' ') @@ -32,13 +32,6 @@ module Locomotive list end - def options_for_target_klass_name - base_models = current_site.content_types.map do |type| - [type.name.humanize, type.klass_with_custom_fields(:entries)] - end - base_models + Locomotive.config.models_for_templatization.map { |name| [name.underscore.humanize, name] } - end - def options_for_page_cache_strategy [ [t('.cache_strategy.none'), 'none'], diff --git a/app/models/locomotive/extensions/page/fullpath.rb b/app/models/locomotive/extensions/page/fullpath.rb index 03061f59..7537c93d 100644 --- a/app/models/locomotive/extensions/page/fullpath.rb +++ b/app/models/locomotive/extensions/page/fullpath.rb @@ -20,11 +20,13 @@ module Locomotive # before_rearrange :foo #propagate_fullpath_changes # after_save :propagate_fullpath_changes + # after_save { |p| puts "[after_save] #{p.fullpath} / #{p.wildcards.inspect} / #{p.wildcard?}" } + ## scopes ## # scope :fullpath, lambda { |fullpath| { :where => { :fullpath => fullpath } } } # used ? ## virtual attributes ## - attr_accessor :wildcards_map + attr_accessor :wildcards_hash end @@ -60,6 +62,47 @@ module Locomotive end.join('/') end + # It returns the fullpath with wildcard segments replaced by the values + # specified in the first argument. + # + # @param [ Hash ] values The map assigning to a wildcard name its value + # @return [ String ] The compiled fullpath + # + def compiled_fullpath(values) + return self.fullpath unless self.has_wildcards? + + index = 0 + + self.fullpath.split('/').map do |segment| + if segment == '*' + "#{values[self.wildcards[index]]}".tap { index += 1 } + else + segment + end + end.join('/') + end + + # It builds the map associating the name of a wildcard + # with its value within the path. + # The map is also stored in the wildcards_hash attribute + # of the page. + # + # @param [ String ] path the path from the HTTP request + # @return [ Hash ] The map + # + def match_wildcards(path) + self.wildcards_hash, wildcard_index, segments = {}, 0, self.fullpath.split('/') + + path.split('/').each_with_index do |segment, index| + if segments[index] == '*' + self.wildcards_hash[self.wildcards[wildcard_index].underscore] = segment + wildcard_index += 1 + end + end + + self.wildcards_hash + end + protected # def set_children_autosave @@ -71,17 +114,16 @@ module Locomotive return true if self.parent.nil? if self.parent.has_wildcards? - puts "[get_wildcards_from_parent] #{self.slug} - #{self.parent.wildcards.inspect}" - self.wildcards = self.parent.wildcards - elsif !self.wildcard? - self.wildcards = nil + # puts "[get_wildcards_from_parent] #{self.slug} - #{self.parent.wildcards.inspect}" + self.wildcards = self.parent.wildcards.clone + else + # puts "[get_wildcards_from_parent] #{self.slug} - reset wildcards" + self.wildcards = [] end - - true end def add_slug_to_wildcards - puts "[add_slug_to_wildcards] #{self.slug} / #{self.wildcard?}" + # puts "[add_slug_to_wildcards] #{self.slug} / #{self.wildcard?}" (self.wildcards ||= []) << self.slug if self.wildcard? end @@ -89,56 +131,56 @@ module Locomotive if self.index? || self.not_found? self.fullpath = self.slug else - slugs = self.ancestors_and_self.map { |page| page.wildcard? ? '*' : page.slug } - slugs.shift unless slugs.size == 1 - self.fullpath = File.join slugs.compact + segments = (self.parent.fullpath.try(:split, '/') || [nil]) + [self.wildcard? ? '*' : self.slug] + segments.shift if segments.first == 'index' + self.fullpath = File.join segments.compact end end - def must_propagate_fullpath_changes? - self.wildcard_changed? || self.slug_changed? - end - - def propagate_fullpath_changes - return true unless must_propagate_fullpath_changes? - - parent_identities = { self._id => self } - - Rails.logger.debug "[propagate_fullpath_changes] BEGIN page #{self.slug} #{self.fullpath} / #{self.wildcards.inspect} / #{self._parent.try(:has_wildcards?).inspect}" - puts "[propagate_fullpath_changes] BEGIN page #{self.slug} #{self.fullpath} / #{self.wildcards.inspect} / #{self._parent.try(:has_wildcards?).inspect}" - - self.descendants.order_by([[:depth, :asc]]).each do |page| - _parent = parent_identities[page.parent_id] - _fullpath = {} - _wildcards = nil - - puts "[propagate_fullpath_changes] #{page.fullpath} / #{page.wildcards.inspect} / #{page._parent.try(:has_wildcards?).inspect}" - - if _parent.has_wildcards? - _wildcards = _parent.wildcards + (page.wildcard? ? [page.slug] : []) - end - - self.site.locales.each do |locale| - base_fullpath = _parent.fullpath_translations[locale] - slug = page.wildcard? ? '*' : page.slug_translations[locale] - - next if base_fullpath.blank? - - _fullpath[locale] = File.join(base_fullpath, slug) - end - - selector = { 'id' => page._id } - operations = { - '$set' => { - 'wildcards' => _wildcards, - 'fullpath' => _fullpath - } - } - self.collection.update selector, operations - - parent_identities[page._id] = page - end - end + # def must_propagate_fullpath_changes? + # self.wildcard_changed? || self.slug_changed? + # end + # + # def propagate_fullpath_changes + # return true unless must_propagate_fullpath_changes? + # + # parent_identities = { self._id => self } + # + # Rails.logger.debug "[propagate_fullpath_changes] BEGIN page #{self.slug} #{self.fullpath} / #{self.wildcards.inspect} / #{self._parent.try(:has_wildcards?).inspect}" + # puts "[propagate_fullpath_changes] BEGIN page #{self.slug} #{self.fullpath} / #{self.wildcards.inspect} / #{self._parent.try(:has_wildcards?).inspect}" + # + # self.descendants.order_by([[:depth, :asc]]).each do |page| + # _parent = parent_identities[page.parent_id] + # _fullpath = {} + # _wildcards = nil + # + # puts "[propagate_fullpath_changes] #{page.fullpath} / #{page.wildcards.inspect} / #{page._parent.try(:has_wildcards?).inspect}" + # + # if _parent.has_wildcards? + # _wildcards = _parent.wildcards + (page.wildcard? ? [page.slug] : []) + # end + # + # self.site.locales.each do |locale| + # base_fullpath = _parent.fullpath_translations[locale] + # slug = page.wildcard? ? '*' : page.slug_translations[locale] + # + # next if base_fullpath.blank? + # + # _fullpath[locale] = File.join(base_fullpath, slug) + # end + # + # selector = { 'id' => page._id } + # operations = { + # '$set' => { + # 'wildcards' => _wildcards, + # 'fullpath' => _fullpath + # } + # } + # self.collection.update selector, operations + # + # parent_identities[page._id] = page + # end + # end end end diff --git a/app/models/locomotive/extensions/page/render.rb b/app/models/locomotive/extensions/page/render.rb index 5f5aabd4..a5036757 100644 --- a/app/models/locomotive/extensions/page/render.rb +++ b/app/models/locomotive/extensions/page/render.rb @@ -11,11 +11,10 @@ module Locomotive module ClassMethods - # Given both a site and a path, this method tries - # to get the matching page. - # If the page is templatized, the related content entry is - # associated to the page (page.content_entry stores the entry). - # If no page is found, then it returns the 404 one instead. + # Given both a site and a path, this method retrieves + # the matching page if it exists. + # If the found page owns wildcards in its fullpath, then + # assigns the value for each wildcard and store the result within the page. # # @param [ Site ] site The site where to find the page # @param [ String ] path The fullpath got from the request @@ -33,17 +32,7 @@ module Locomotive if !_page.published? && !logged_in next else - if _page.templatized? - %r(^#{_page.fullpath.gsub('content_type_template', '([^\/]+)')}$) =~ path - - permalink = $1 - - _page.content_entry = _page.fetch_target_entry(permalink) - - if _page.content_entry.nil? || (!_page.content_entry.visible? && !logged_in) # content instance not found or not visible - next - end - end + _page.match_wildcards(path) end page = _page diff --git a/app/models/locomotive/extensions/page/wildcards.rb b/app/models/locomotive/extensions/page/wildcards.rb deleted file mode 100644 index e88bbf76..00000000 --- a/app/models/locomotive/extensions/page/wildcards.rb +++ /dev/null @@ -1,213 +0,0 @@ -# module Locomotive -# module Extensions -# module Page -# module Templatized -# -# extend ActiveSupport::Concern -# -# included do -# -# ## fields ## -# field :wildcards, :type => Array -# field :with_wildcards, :type => Boolean, :default => false -# field :fullpath_with_wildcards, :default => false, :localize => true -# -# ## callbacks ## -# before_validation :get_wildcards_from_parent -# before_validation :add_slug_to_wildcards -# before_save :build_fullpath_with_wildcards -# after_save :propagate_wildcards -# -# ## scopes ## -# -# ## virtual attributes ## -# attr_accessor :wildcards_map -# -# end -# -# protected -# -# def get_wildcards_from_parent -# return if self.parent.nil? -# -# if self.parent.with_wildcards? -# self.wildcards = self.parent.wildcards -# self.with_wildcards = true -# elsif !self.with_wildcards? -# self.wildcards = [] -# self.with_wildcards = false -# end -# end -# -# def add_slug_to_wildcards -# (self.wildcards ||= []) << self.slug if self.will_wildcards? -# end -# -# def build_fullpath_with_wildcards -# if self.index? || self.not_found? -# self.fullpath_with_wildcards = self.slug -# else -# slugs = self.ancestors_and_self.map { |page| page.with_wildcards? ? '*' : page.slug } -# slugs.shift unless slugs.size == 1 -# self.fullpath_with_wildcards = File.join slugs.compact -# end -# end -# -# def propagate_wildcards -# return unless self.with_wildcards_changed? || (self.with_wildcards? && self.slug_changed?) -# -# parent_identities = { self._id => self } -# -# self.descendants.order_by([[:depth, :asc]]).each do |page| -# _parent = parent_identities[page._id] -# _wildcards = _parent.wildcards + (page.wildcards? ? [page.slug] : []) -# _fullpath_with_wildcards = File.join(_parent.fullpath_with_wildcards, page.wildcards? ? '*' : page.slug) -# -# # TODO: fullpath_with_wildcards is localized !!!! -# -# selector = { 'id' => page._id } -# operations = { -# '$set' => { -# 'wildcards' => _wildcards, -# 'with_wildcards' => true, -# 'fullpath_with_wildcards' => _fullpath_with_wildcards -# } -# } -# self.collection.update selector, operations -# -# parent_identities[page._id] = page -# end -# end -# -# end -# end -# end -# end -# -# -# -# # field :templatized_from_parent, :type => Boolean, :default => false -# # field :target_klass_name -# # -# # ## validations ## -# # validates_presence_of :target_klass_name, :if => :templatized? -# # validate :ensure_target_klass_name_security -# # -# # ## callbacks ## -# # before_validation :get_templatized_from_parent -# # before_validation :set_slug_if_templatized -# # before_validation :ensure_target_klass_name_security -# # after_save :propagate_templatized -# # -# # ## scopes ## -# # scope :templatized, :where => { :templatized => true } -# # -# # ## virtual attributes ## -# # attr_accessor :content_entry -# # end -# # -# # # Returns the class specified by the target_klass_name property -# # # -# # # @example -# # # -# # # page.target_klass_name = 'Locomotive::Entry12345' -# # # page.target_klass = Locomotive::Entry12345 -# # # -# # # @return [ Class ] The target class -# # # -# # def target_klass -# # target_klass_name.constantize -# # end -# # -# # # Gives the name which can be used in a liquid template in order -# # # to reference an entry. It uses the slug property if the target klass -# # # is a Locomotive content type or the class name itself for the other classes. -# # # -# # # @example -# # # -# # # page.target_klass_name = 'Locomotive::Entry12345' # related to the content type Articles -# # # page.target_entry_name = 'article' -# # # -# # # page.target_klass_name = 'OurProduct' -# # # page.target_entry_name = 'our_product' -# # # -# # # @return [ String ] The name in lowercase and underscored -# # # -# # def target_entry_name -# # if self.target_klass_name =~ /^Locomotive::Entry([a-z0-9]+)$/ -# # @content_type ||= self.site.content_types.find($1) -# # @content_type.slug.singularize -# # else -# # self.target_klass_name.underscore -# # end -# # end -# # -# # # Finds the entry both specified by the target klass and identified by the permalink -# # # -# # # @param [ String ] permalink The permalink of the entry -# # # -# # # @return [ Object ] The document -# # # -# # def fetch_target_entry(permalink) -# # target_klass.find_by_permalink(permalink) -# # end -# # -# # protected -# # -# # def get_templatized_from_parent -# # return if self.parent.nil? -# # -# # if self.parent.templatized? -# # self.templatized = self.templatized_from_parent = true -# # self.target_klass_name = self.parent.target_klass_name -# # elsif !self.templatized? -# # self.templatized = self.templatized_from_parent = false -# # self.target_klass_name = nil -# # end -# # end -# # -# # def set_slug_if_templatized -# # self.slug = 'content_type_template' if self.templatized? && !self.templatized_from_parent? -# # end -# # -# # # Makes sure the target_klass is owned by the site OR -# # # if it belongs to the models allowed by the application -# # # thanks to the models_for_templatization option. -# # # -# # def ensure_target_klass_name_security -# # return if !self.templatized? || self.target_klass_name.blank? -# # -# # if self.target_klass_name =~ /^Locomotive::Entry([a-z0-9]+)$/ -# # content_type = Locomotive::ContentType.find($1) -# # -# # if content_type.site_id != self.site_id -# # self.errors.add :target_klass_name, :security -# # end -# # elsif !Locomotive.config.models_for_templatization.include?(self.target_klass_name) -# # self.errors.add :target_klass_name, :security -# # end -# # end -# # -# # # Sets the templatized, templatized_from_parent properties of -# # # the children of the current page ONLY IF the templatized -# # # attribute got changed. -# # # -# # def propagate_templatized -# # return unless self.templatized_changed? -# # -# # selector = { 'parent_ids' => { '$in' => [self._id] } } -# # operations = { -# # '$set' => { -# # 'templatized' => self.templatized, -# # 'templatized_from_parent' => self.templatized, -# # 'target_klass_name' => self.target_klass_name -# # } -# # } -# # -# # self.collection.update selector, operations, :multi => true -# # end -# # -# # end -# # end -# # end -# # end diff --git a/app/presenters/locomotive/page_presenter.rb b/app/presenters/locomotive/page_presenter.rb index c41fbba4..f6b9f14a 100644 --- a/app/presenters/locomotive/page_presenter.rb +++ b/app/presenters/locomotive/page_presenter.rb @@ -1,7 +1,7 @@ module Locomotive class PagePresenter < BasePresenter - delegate :title, :slug, :fullpath, :handle, :raw_template, :published, :listed, :templatized, :templatized_from_parent, :redirect, :redirect_url, :template_changed, :cache_strategy, :response_type, :to => :source + delegate :title, :slug, :fullpath, :handle, :raw_template, :published, :listed, :wildcard, :wildcards, :redirect, :redirect_url, :template_changed, :cache_strategy, :response_type, :to => :source def escaped_raw_template h(self.source.raw_template) @@ -12,7 +12,7 @@ module Locomotive end def included_methods - super + %w(title slug fullpath handle raw_template published listed templatized templatized_from_parent redirect redirect_url cache_strategy response_type template_changed editable_elements localized_fullpaths) + super + %w(title slug fullpath handle raw_template published listed wildcard wildcards redirect redirect_url cache_strategy response_type template_changed editable_elements localized_fullpaths) end def localized_fullpaths diff --git a/app/views/locomotive/pages/_form.html.haml b/app/views/locomotive/pages/_form.html.haml index 9e5290aa..003abee6 100644 --- a/app/views/locomotive/pages/_form.html.haml +++ b/app/views/locomotive/pages/_form.html.haml @@ -16,7 +16,7 @@ - if not @page.index? and not @page.not_found? = f.input :parent_id, :as => :select, :collection => parent_pages_options, :include_blank => false - = f.input :slug, :required => false, :hint => @page.slug.blank? ? t('.empty_slug') : public_page_url(@page), :input_html => { :'data-url' => get_path_pages_url, :disabled => @page.index? || @page.not_found? }, :wrapper_html => { :style => "#{'display: none' if @page.templatized? && !@page.templatized_from_parent?};", :class => 'em-inline-hints' } + = f.input :slug, :required => false, :hint => @page.slug.blank? ? t('.empty_slug') : public_page_url(@page), :input_html => { :'data-url' => get_path_pages_url, :disabled => @page.index? || @page.not_found? }, :class => 'em-inline-hints' } = f.inputs :name => :seo, :class => "inputs foldable #{'folded' if inputs_folded?(@page)}" do @@ -34,15 +34,13 @@ = f.input :response_type, :as => :select, :collection => options_for_page_response_type, :include_blank => false - = f.input :templatized, :as => :'Locomotive::Toggle', :style => "#{'display: none' if @page.redirect? || @page.templatized_from_parent?}" - - = f.input :target_klass_name, :as => :select, :collection => options_for_target_klass_name, :include_blank => false, :wrapper_html => { :style => "#{'display: none' unless @page.templatized? && !@page.templatized_from_parent?}" } + = f.input :wildcard, :as => :'Locomotive::Toggle', :style => "#{'display: none' if @page.redirect?}" = f.input :published, :as => :'Locomotive::Toggle' = f.input :listed, :as => :'Locomotive::Toggle' - = f.input :redirect, :as => :'Locomotive::Toggle', :wrapper_html => { :style => "#{'display: none' if @page.templatized? || !@page.default_response_type?}" } + = f.input :redirect, :as => :'Locomotive::Toggle', :wrapper_html => { :style => "#{'display: none' if !@page.default_response_type?}" } = f.input :cache_strategy, :as => :select, :collection => options_for_page_cache_strategy, :include_blank => false, :wrapper_html => { :style => "#{'display: none' if @page.redirect?}" } diff --git a/app/views/locomotive/pages/_page.html.haml b/app/views/locomotive/pages/_page.html.haml index f82219c3..6b8c28e4 100644 --- a/app/views/locomotive/pages/_page.html.haml +++ b/app/views/locomotive/pages/_page.html.haml @@ -3,7 +3,7 @@ %li{ :id => "item-#{page.id}", :class => "page #{css_for_page(page)}" } - - children = can?(:manage, page) ? page.children : page.children.find_all { |p| !p.templatized? } + - children = page.children - with_children = !children.empty? diff --git a/app/views/locomotive/public/sitemaps/show.xml.builder b/app/views/locomotive/public/sitemaps/show.xml.builder index 03eaecc1..3180bd0d 100644 --- a/app/views/locomotive/public/sitemaps/show.xml.builder +++ b/app/views/locomotive/public/sitemaps/show.xml.builder @@ -8,14 +8,8 @@ xml.urlset "xmlns" => "http://www.sitemaps.org/schemas/sitemap/0.9" do @pages.each do |page| if not page.index_or_not_found? - if page.templatized? - page.content_type.entries.visible.each do |c| - xml.url do - xml.loc page_url(page, { :content => c, :host => true }) - xml.lastmod c.updated_at.to_date.to_s('%Y-%m-%d') - xml.priority 0.9 - end - end + if page.wildcard? + # FIXME (Didier L.) unable for now to generate all the pages else xml.url do xml.loc page_url(page, { :host => true }) diff --git a/config/locales/default.de.yml b/config/locales/default.de.yml index 8a1c5ce0..9b2da728 100644 --- a/config/locales/default.de.yml +++ b/config/locales/default.de.yml @@ -57,7 +57,7 @@ de: title: Titel parent: Parent slug: Slug - templatized: Templatized + wildcard: Wildcard published: Veröffentlicht listed: Im Menü redirect: Umleitung diff --git a/config/locales/default.es.yml b/config/locales/default.es.yml index 794ec7a0..be35d56e 100644 --- a/config/locales/default.es.yml +++ b/config/locales/default.es.yml @@ -58,7 +58,7 @@ es: parent_id: Padre slug: Enlace listed: Menu - templatized: Templatizada + wildcard: Wildcard published: Publicada redirect: Redirección redirect_url: Url de redirección diff --git a/config/locales/default.fr.yml b/config/locales/default.fr.yml index 45d043ae..3272f3d8 100644 --- a/config/locales/default.fr.yml +++ b/config/locales/default.fr.yml @@ -58,7 +58,7 @@ fr: parent_id: Dossier parent slug: Raccourci listed: Menu - templatized: Templatisée + wildcard: Wildcard published: Publiée redirect: Redirection redirect_url: Url de redirection diff --git a/config/locales/default.it.yml b/config/locales/default.it.yml index 15e80d8a..65114a51 100644 --- a/config/locales/default.it.yml +++ b/config/locales/default.it.yml @@ -64,7 +64,7 @@ it: parent_id: Pagina superiore slug: Slug listed: In menù - templatized: Templatized + wildcard: Wildcard published: Pubblicata redirect: Redirezione redirect_url: Url di redirezione diff --git a/config/locales/default.no.yml b/config/locales/default.no.yml index 9e79f919..adb472e7 100644 --- a/config/locales/default.no.yml +++ b/config/locales/default.no.yml @@ -221,7 +221,7 @@ parent: Tilhører parent_id: Tilhører slug: Slug - templatized: Templatized + wildcard: Wildcard published: Publisert listed: I meny redirect: Videresending diff --git a/config/locales/default.pt-BR.yml b/config/locales/default.pt-BR.yml index 9a49a255..9efeed81 100644 --- a/config/locales/default.pt-BR.yml +++ b/config/locales/default.pt-BR.yml @@ -60,7 +60,7 @@ pt-BR: title: Título parent: Pai slug: Slug - templatized: Template + wildcard: Wildcard published: Publicado cache_strategy: Cache content_type: diff --git a/config/locales/default.ru.yml b/config/locales/default.ru.yml index 58fc5f8b..96e9d99a 100644 --- a/config/locales/default.ru.yml +++ b/config/locales/default.ru.yml @@ -1,4 +1,4 @@ -ru: +ru: errors: messages: @@ -37,7 +37,7 @@ ru: title: Имя parent: Родитель slug: Ссылка - templatized: Шаблонизирована + wildcard: Wildcard published: Опубликована listed: Меню redirect: Перенаправлена @@ -91,7 +91,7 @@ ru: default: "%d.%m.%Y" short: "%d %b" long: "%d %B %Y" - + # Названия дней недели -- контекстные и отдельностоящие day_names: [воскресенье, понедельник, вторник, среда, четверг, пятница, суббота] standalone_day_names: [Воскресенье, Понедельник, Вторник, Среда, Четверг, Пятница, Суббота] @@ -99,19 +99,19 @@ ru: # Названия месяцев -- сокращенные и полные, плюс отдельностоящие. # Не забудьте nil в начале массиве (~) - # + # # # Don't forget the nil at the beginning; there's no such thing as a 0th month month_names: [~, января, февраля, марта, апреля, мая, июня, июля, августа, сентября, октября, ноября, декабря] standalone_month_names: [~, Январь, Февраль, Март, Апрель, Май, Июнь, Июль, Август, Сентябрь, Октябрь, Ноябрь, Декабрь] abbr_month_names: [~, янв., февр., марта, апр., мая, июня, июля, авг., сент., окт., нояб., дек.] standalone_abbr_month_names: [~, янв., февр., март, апр., май, июнь, июль, авг., сент., окт., нояб., дек.] - + # Порядок компонентов даты для хелперов # # # Used in date_select and datime_select. - order: + order: - :day - :month - :year @@ -122,7 +122,7 @@ ru: default: "%a, %d %b %Y, %H:%M:%S %z" short: "%d %b, %H:%M" long: "%d %B %Y, %H:%M" - + # am/pm решено перевести как "утра/вечера" :) am: "утра" pm: "вечера" @@ -140,7 +140,7 @@ ru: delimiter: " " # Number of decimals, behind the separator (the number 1 with a precision of 2 gives: 1.00) precision: 3 - + # Used in number_to_currency() currency: format: @@ -154,14 +154,14 @@ ru: separator: "." delimiter: " " precision: 2 - + # Used in number_to_percentage() percentage: format: # These three are to override number.format and are optional - # separator: + # separator: delimiter: "" - + # Used in number_to_precision() precision: format: @@ -169,18 +169,18 @@ ru: # separator: delimiter: "" # precision: - + # Used in number_to_human_size() human: format: # These three are to override number.format and are optional - # separator: + # separator: delimiter: "" precision: 1 - + # Rails 2.2 # storage_units: [байт, КБ, МБ, ГБ, ТБ] - + # Rails 2.3 storage_units: # Storage units output formatting. @@ -274,7 +274,7 @@ ru: # Rails 2.2 sentence_connector: "и" skip_last_comma: true - + # Rails 2.3 words_connector: ", " two_words_connector: " и " diff --git a/config/locales/formtastic.de.yml b/config/locales/formtastic.de.yml index da04a141..9d9d9a48 100644 --- a/config/locales/formtastic.de.yml +++ b/config/locales/formtastic.de.yml @@ -55,9 +55,7 @@ de: page: published: "Nur authentifizierte Accounts können nicht publizierte Seiten ansehen." cache_strategy: "Cache die Seiten, um eine bessere Geschwindigkeit zu erzielen. Die 'Einfach' Option ist ein guter Kompromiss." - templatized: "Nutze diese Seite als Vorlage für einen Baustein, den du erstellt hast." listed: "Regele, ob die Seite in den generierten Menüs angezeigt werden soll." - content_type_id: "Der Baustein für den diese Seite als Vorlage dienen soll." seo_title: "Wähle einen Titel für den 'title' Tag im Seiten Header. Lass es leer, wenn der Seitentitel verwendet werden soll." meta_keywords: "Meta-Schlagworte, die im HEAD-Bereich der Webseite genutzt werden. Die einzelnen Wörter werden durch eine Leertaste getrennt. Diese werden für die Suchmaschinen benötigt." meta_description: "Meta-Beschreibung, die im HEAD-Bereich der Webseite genutzt wird. Diese wird für die Suchmaschinen benötigt." diff --git a/config/locales/formtastic.en.yml b/config/locales/formtastic.en.yml index c76da942..5787b384 100644 --- a/config/locales/formtastic.en.yml +++ b/config/locales/formtastic.en.yml @@ -57,9 +57,8 @@ en: handle: "Unique identifier to retrieve this page within an external controller instance" published: "Only authenticated accounts can view unpublished pages." cache_strategy: "Cache the page for better performance. The 'Simple' choice is a good compromise." - templatized: "Use the page as a template for a model you defined." + wildcard: "Make the page have a wildcard segment in its path. Then the slug will be used as the name of the wildcard in the template" listed: "Control whether to show the page from generated menus." - target_klass_name: "The type of content this page will be a template for." seo_title: "Define a page title which should be used as the value for the title tag in the head section. Leave it empty if you want to use the default value from the site settings." meta_keywords: "Overrides the site's meta keywords used within the head tag of the page. They are separated by a comma." meta_description: "Overrides the site's meta description used within the head tag of the page." @@ -84,7 +83,7 @@ en: source: "The current file is available here %{url}" content_entry: _slug: "Property used to generate the url of a page working as a template for this content type (ex: \"template_page/{{ your_object._permalink }})\"." - seo_title: "The value you fill in will replace the SEO title of the templatized page related to your model." + seo_title: "The value you fill in can be used to replace the SEO title in any pages." meta_keywords: "Overrides the site's meta keywords used within the head tag of the page. They are separated by a comma." meta_description: "Overrides the site's meta description used within the head tag of the page." import: diff --git a/config/locales/formtastic.es.yml b/config/locales/formtastic.es.yml index e3b8b0f9..0dad69a4 100644 --- a/config/locales/formtastic.es.yml +++ b/config/locales/formtastic.es.yml @@ -49,9 +49,7 @@ es: page: published: "Las páginas no publicadas son únicamente visibles tras iniciar sesión." cache_strategy: "Utilizar una caché de página para un mejor rendimiento. La opción 'Simple' es un buen compromiso." - templatized: "Usar la página como plantilla de un modelo." listed: "Controla si la página se enseña o no en los menús." - content_type_id: "El modelo del cual será una plantilla esta página." meta_keywords: "Reescribir las palabras clave SEO utilizadas en la cabecera de la página. Deben estar separadas por comas." meta_description: "Reescribir la metadescripción que se utiliza en la cabecera de la página." snippet: diff --git a/config/locales/formtastic.fr.yml b/config/locales/formtastic.fr.yml index 2a872895..6f28b1ea 100644 --- a/config/locales/formtastic.fr.yml +++ b/config/locales/formtastic.fr.yml @@ -53,9 +53,8 @@ fr: page: published: "Seuls les administrateurs authentifiés peuvent voir une page non publiée." cache_strategy: "Cache la page pour de meilleure performance. L'option 'Simple' est le meilleur compromis." - templatized: "Utilise la page comme un template pour un modèle défini." + wildcard: "Détermine si la page aura la dernière partie de son URL dynamique. Si oui, le slug sera utilisé comme nom du segment dans le template." listed: "Controle si la page doit être visible depuis les menus automatiquement générés." - target_klass_name: "Le type du contenu pour lequel cette page est un template." seo_title: "Définit un titre de page à mettre dans la balise TITLE de la page. Laissez le blanc pour utiliser la valeur par défaut (voir configuration du site)." meta_keywords: "Redéfinit les mots-clés du site. Utilisés à l'intérieur de la balise HEAD. Ils sont séparés par une virgule." meta_description: "Redéfinit la description du site. Utilisée à l'intérieur de la balise HEAD." diff --git a/config/locales/formtastic.it.yml b/config/locales/formtastic.it.yml index bc408ce9..5ca1a774 100644 --- a/config/locales/formtastic.it.yml +++ b/config/locales/formtastic.it.yml @@ -55,9 +55,7 @@ it: page: published: "Solo gli account autenticati possono visualizzare le pagine non pubblicate." cache_strategy: "Attiva il cache della pagina per miglirare le prestazioni. L'opzione 'Semplice' è un buon compromesso." - templatized: "Utilizzare la pagina come template per un modello che hai definito." listed: "Determina se la pagina deve essere mostrata nei menù generati." - content_type_id: "Il tipo di contenuto di cui questa pagina sarà il template." seo_title: "Definisce il titolo della pagina inserito nel tag title della sezione head. Lascia vuoto se vuoi che venga utilizzato il titolo definito per il sito." meta_keywords: "Sovrascrive per questa pagina le meta keywords definite per il sito all'interno del tag head della pagina. Sono separate da virgola." meta_description: "Sovrascrive per questa pagina la meta description definita per il sito." diff --git a/config/locales/formtastic.nl.yml b/config/locales/formtastic.nl.yml index 071773b2..d7cee1d0 100644 --- a/config/locales/formtastic.nl.yml +++ b/config/locales/formtastic.nl.yml @@ -49,9 +49,7 @@ nl: page: published: "Alleen geauthenticeerde accounts kunnen niet gepubliceerde pagina's zien." cache_strategy: "Cache de pagina voor betere prestaties. De 'Simpele' keus is een goed compromis." - templatized: "Gebruik de pagina als template voor een door u gedefinieerd model." listed: "Controleer of de pagina getoond wordt van de gegenereerde menu's." - content_type_id: "Het type inhoud waar deze pagina als template voor dient" meta_keywords: "Overschrijft de meta keywords van de website in de head tag van deze pagina. Gescheiden door een komma" meta_description: "Overschrijft de meta description van de website in de head tag van deze pagina." snippet: diff --git a/config/locales/formtastic.no.yml b/config/locales/formtastic.no.yml index c6daeba9..7f223c13 100644 --- a/config/locales/formtastic.no.yml +++ b/config/locales/formtastic.no.yml @@ -55,9 +55,7 @@ page: published: "Kun autoriserte kontoer kan se ikke-publiserte sider" cache_strategy: "Buffre siden for å bedre ytelsen. \"Enkel\" er et bra kompromiss." - templatized: "Bruk denne siden som mal for en modell." listed: "Styr om siden skal vises i de genererte menyene." - content_type_id: "Innholdstypen denne siden skal være mal for." seo_title: "Definer en egen tittel for siden. Denne blir benyttet av nettleseren. Hvis denne står tom blir standardverdien fra sideinnstillingene benyttet." meta_keywords: "Overstyr søkemotor-metadata for denne siden. Separer med komma." meta_description: "Overstyr søkemotorbeskrivelsen for denne siden." diff --git a/config/locales/formtastic.pt-BR.yml b/config/locales/formtastic.pt-BR.yml index d96c0841..843cb0de 100644 --- a/config/locales/formtastic.pt-BR.yml +++ b/config/locales/formtastic.pt-BR.yml @@ -46,7 +46,6 @@ pt-BR: page: published: "Apenas contas autenticadas podem ver páginas não publicadas." cache_strategy: 'Faça o Cache da página para obter melhor desempenho. A escolha do "Simples" é um bom compromisso' - templatized: "Utilize a página como template para o modelo definido." snippet: slug: "Você precisa saber a ordem para inserir fragmentos dentro da página." site: diff --git a/config/locales/formtastic.ru.yml b/config/locales/formtastic.ru.yml index 42ce678c..f86f606f 100644 --- a/config/locales/formtastic.ru.yml +++ b/config/locales/formtastic.ru.yml @@ -55,9 +55,7 @@ ru: page: published: "Только аутентифицированным пользователям разрешается просматривать неопубликованные страницы." cache_strategy: "Кэшировать страницу для лучшей производительности. Вариант 'Простое' является хорошим компромиссом." - templatized: "Используйте страницу в качестве шаблона для определенной вами модели." listed: "Контролируйте возможность показа страницы из сгенерированных меню." - content_type_id: "Тип содержимого, для которого эта страница будет выступать в качестве шаблона." seo_title: "Определите заголовок страницы, который будет использоваться как значение тэга title в секции head. Оставьте пустым, если вы хотите использовать значение по умолчанию из настроек сайта." meta_keywords: "Переопределяет meta keywords сайта, используемые внутри тэга head страницы. Они разделены запятыми." meta_description: "Переопределяет meta description сайта, используемые внутри тэга head страницы." diff --git a/lib/generators/locomotive/install/templates/locomotive.rb b/lib/generators/locomotive/install/templates/locomotive.rb index e5c4db19..605780aa 100644 --- a/lib/generators/locomotive/install/templates/locomotive.rb +++ b/lib/generators/locomotive/install/templates/locomotive.rb @@ -45,9 +45,6 @@ Locomotive.configure do |config| # follow the Dependency Injection pattern # config.context_assign_extensions = {} - # add extra classes other than the defined content types among a site which will potentially used by the templatized pages. - # config.models_for_templatization = %w(Product) - # Rack-cache settings, mainly used for the inline resizing image module. Default options: # config.rack_cache = { # :verbose => true, diff --git a/lib/locomotive/liquid/drops/page.rb b/lib/locomotive/liquid/drops/page.rb index 98e91b21..66f6dcfd 100644 --- a/lib/locomotive/liquid/drops/page.rb +++ b/lib/locomotive/liquid/drops/page.rb @@ -3,14 +3,18 @@ module Locomotive module Drops class Page < Base - delegate :seo_title, :meta_keywords, :meta_description, :to => '_source' + delegate :title, :seo_title, :meta_keywords, :meta_description, :to => '_source' def title - self._source.templatized? ? @context['entry']._label : self._source.title + # TODO + # self._source.templatized? ? @context['entry']._label : self._source.title + self._source.title end def slug - self._source.templatized? ? self._source.content_type.slug.singularize : self._source.slug + # TODO + # self._source.templatized? ? self._source.content_type.slug.singularize : self._source.slug + self._source.slug end def parent diff --git a/lib/locomotive/liquid/tags/locale_switcher.rb b/lib/locomotive/liquid/tags/locale_switcher.rb index 286190f1..4c9fa3e3 100644 --- a/lib/locomotive/liquid/tags/locale_switcher.rb +++ b/lib/locomotive/liquid/tags/locale_switcher.rb @@ -42,11 +42,14 @@ module Locomotive output += @site.locales.collect do |locale| ::Mongoid::Fields::I18n.with_locale(locale) do - fullpath = @site.localized_page_fullpath(@page, locale) + # fullpath = @site.localized_page_fullpath(@page, locale) - if @page.templatized? - fullpath.gsub!('content_type_template', context['entry']._permalink) - end + # if @page.templatized? + # fullpath.gsub!('content_type_template', context['entry']._permalink) + # end + + # TODO: TO BE TESTED + fullpath = @page.compiled_fullpath(@page.wildcards_hash) %(#{link_label(locale)}) end diff --git a/lib/locomotive/liquid/tags/nav.rb b/lib/locomotive/liquid/tags/nav.rb index 7dd2fbbe..f0562a6a 100644 --- a/lib/locomotive/liquid/tags/nav.rb +++ b/lib/locomotive/liquid/tags/nav.rb @@ -134,7 +134,7 @@ module Locomotive # Determines whether or not a page should be a part of the menu def include_page?(page) - if !page.listed? || page.templatized? || !page.published? + if !page.listed? || page.has_wildcards? || !page.published? false elsif @options[:exclude] (page.fullpath =~ @options[:exclude]).nil? diff --git a/lib/locomotive/mongoid/patches.rb b/lib/locomotive/mongoid/patches.rb index dfc23976..fcf943cd 100644 --- a/lib/locomotive/mongoid/patches.rb +++ b/lib/locomotive/mongoid/patches.rb @@ -12,28 +12,6 @@ module Mongoid#:nodoc: end end - # module Relations #:nodoc: - # module AutoSave - # module ClassMethods #:nodoc: - # def autosave(metadata) - # if metadata.autosave? - # set_callback :save, :after do |document| - # relation = document.send(metadata.name) - # - # return true if document.try(:"autosave_for_#{metadata.name}?") == false # FIXME (Didier L.) add more control on the document side - # - # if relation - # (relation.do_or_do_not(:in_memory) || Array.wrap(relation)).each do |doc| - # doc.save - # end - # end - # end - # end - # end - # end - # end - # end - module Fields #:nodoc: module Internal #:nodoc: class RawArray < Mongoid::Fields::Internal::Array diff --git a/lib/locomotive/render.rb b/lib/locomotive/render.rb index c6ad7d9f..564820d3 100644 --- a/lib/locomotive/render.rb +++ b/lib/locomotive/render.rb @@ -62,10 +62,7 @@ module Locomotive assigns.merge!(flash.to_hash.stringify_keys) # data from public submissions - if @page.templatized? # add instance from content type - assigns['entry'] = @page.content_entry - assigns[@page.target_entry_name] = @page.content_entry # just here to help to write readable liquid code - end + assigns.merge!(@page.wildcards_hash.stringify_keys) if @page.has_wildcards? registers = { :controller => self, diff --git a/spec/dummy/config/initializers/locomotive.rb b/spec/dummy/config/initializers/locomotive.rb index 27e8a03a..329796cd 100644 --- a/spec/dummy/config/initializers/locomotive.rb +++ b/spec/dummy/config/initializers/locomotive.rb @@ -56,9 +56,6 @@ Locomotive.configure do |config| # follow the Dependency Injection pattern # config.context_assign_extensions = {} - # add extra classes other than the defined content types among a site which will potentially used by the templatized pages. - config.models_for_templatization = %w(Foo) - # Rack-cache settings, mainly used for the inline resizing image module. Default options: # config.rack_cache = { # :verbose => true, diff --git a/spec/lib/locomotive/liquid/drops/page_spec.rb b/spec/lib/locomotive/liquid/drops/page_spec.rb index c9d6f103..df2a5972 100644 --- a/spec/lib/locomotive/liquid/drops/page_spec.rb +++ b/spec/lib/locomotive/liquid/drops/page_spec.rb @@ -71,13 +71,14 @@ describe Locomotive::Liquid::Drops::Page do render_template('{{ home.title }}').should == 'Home page' end - it 'renders the content instance highlighted field instead for a templatized page' do - templatized = FactoryGirl.build(:page, :title => 'Lorem ipsum template', :templatized => true) - - entry = Locomotive::Liquid::Drops::ContentEntry.new(mock('entry', :_label => 'Locomotive rocks !')) - - render_template('{{ page.title }}', 'page' => templatized, 'entry' => entry).should == 'Locomotive rocks !' - end + # TODO + # it 'renders the content instance highlighted field instead for a templatized page' do + # templatized = FactoryGirl.build(:page, :title => 'Lorem ipsum template', :templatized => true) + # + # entry = Locomotive::Liquid::Drops::ContentEntry.new(mock('entry', :_label => 'Locomotive rocks !')) + # + # render_template('{{ page.title }}', 'page' => templatized, 'entry' => entry).should == 'Locomotive rocks !' + # end end diff --git a/spec/lib/locomotive/liquid/tags/nav_spec.rb b/spec/lib/locomotive/liquid/tags/nav_spec.rb index 1e334457..1cc76db3 100644 --- a/spec/lib/locomotive/liquid/tags/nav_spec.rb +++ b/spec/lib/locomotive/liquid/tags/nav_spec.rb @@ -15,7 +15,7 @@ describe Locomotive::Liquid::Tags::Nav do Locomotive::Page.new(:title => 'Child #2.1', :fullpath => 'child_2/sub_child_1', :slug => 'sub_child_1', :published => true), Locomotive::Page.new(:title => 'Child #2.2', :fullpath => 'child_2/sub_child_2', :slug => 'sub_child_2', :published => true), Locomotive::Page.new(:title => 'Unpublished #2.2', :fullpath => 'child_2/sub_child_unpublishd_2', :slug => 'sub_child_unpublished_2', :published => false), - Locomotive::Page.new(:title => 'Templatized #2.3', :fullpath => 'child_2/sub_child_template_3', :slug => 'sub_child_template_3', :published => true, :templatized => true), + Locomotive::Page.new(:title => 'Templatized #2.3', :fullpath => 'child_2/sub_child_template_3', :slug => 'sub_child_template_3', :published => true, :wildcard => true), Locomotive::Page.new(:title => 'Unlisted #2.4', :fullpath => 'child_2/sub_child_unlisted_4', :slug => 'sub_child_unlisted_4', :published => true, :listed => false) ] @home.children.last.stubs(:children_with_minimal_attributes).returns(other_children) @@ -55,7 +55,7 @@ describe Locomotive::Liquid::Tags::Nav do output.should match /<\/a><\/li><\/ul><\/li><\/ul>/ end - it 'does not render templatized pages' do + it 'does not render pages with wildcards' do output = render_nav('site', {}, 'depth: 2') output.should_not match /sub-child-template-3/ diff --git a/spec/lib/locomotive/render_spec.rb b/spec/lib/locomotive/render_spec.rb index 47665725..ec835071 100644 --- a/spec/lib/locomotive/render_spec.rb +++ b/spec/lib/locomotive/render_spec.rb @@ -128,37 +128,22 @@ describe 'Locomotive rendering system' do end - context 'templatized page' do + context 'wildcards page' do before(:each) do - @content_type = FactoryGirl.build(:content_type, :site => nil) - @content_entry = @content_type.entries.build(:_visible => true) - @page.templatized = true - @page.stubs(:fetch_target_entry).returns(@content_entry) - @page.stubs(:fullpath).returns('/projects/content_type_template') + @page.attributes = { 'wildcards' => %w(permalink), 'fullpath' => 'projects/*', 'wildcard' => true } @controller.request.fullpath = '/projects/edeneo.html' - @controller.current_site.pages.expects(:where).with(:depth => 2, :fullpath.in => %w{projects/edeneo projects/content_type_template content_type_template/edeneo}).returns([@page]) + @controller.current_site.pages.expects(:where).with(:depth => 2, :fullpath.in => %w{projects/edeneo projects/* */edeneo */*}).returns([@page]) end - it 'sets the content_entry variable' do + it 'finds the page' do page = @controller.send(:locomotive_page) page.should_not be_nil - page.content_entry.should == @content_entry end - it 'returns the 404 page if the instance does not exist' do - @page.stubs(:fetch_target_entry).returns(nil) - (klass = Locomotive::Page).expects(:published).returns([true]) - @controller.current_site.pages.expects(:not_found).returns(klass) - @controller.send(:locomotive_page).should be_true - end - - it 'returns the 404 page if the instance is not visible' do - @content_entry._visible = false - @page.stubs(:fetch_target_entry).returns(@content_entry) - (klass = Locomotive::Page).expects(:published).returns([true]) - @controller.current_site.pages.expects(:not_found).returns(klass) - @controller.send(:locomotive_page).should be_true + it 'assigns values to wildcards' do + page = @controller.send(:locomotive_page) + page.wildcards_hash.should == { 'permalink' => 'edeneo' } end end diff --git a/spec/models/locomotive/extensions/page/fullpath_spec.rb b/spec/models/locomotive/extensions/page/fullpath_spec.rb index adf5e090..9034423d 100644 --- a/spec/models/locomotive/extensions/page/fullpath_spec.rb +++ b/spec/models/locomotive/extensions/page/fullpath_spec.rb @@ -25,6 +25,12 @@ describe Locomotive::Page do @page.pretty_fullpath.should == 'archives/:month/projects/:permalink' end + it 'compiles a fullpath with wildcards' do + @page.fullpath = 'archives/*/projects/*' + @page.wildcards = %w(month permalink) + @page.compiled_fullpath('month' => 'june', 'permalink' => 'hello-world').should == 'archives/june/projects/hello-world' + end + describe 'building the fullpath' do it 'returns "index" for the root page' do @@ -45,16 +51,13 @@ describe Locomotive::Page do end it 'includes a single "*" if the page enables wildcards and if there are a lot of ancestors' do - @page.stubs(:ancestors_and_self).returns([FactoryGirl.build(:page), FactoryGirl.build(:page, :slug => 'archives'), FactoryGirl.build(:page, :slug => 'projects'), @page]) + @page.stubs(:parent).returns(FactoryGirl.build(:page, :fullpath => 'archives/projects')) @page.send(:build_fullpath) @page.fullpath.should == 'archives/projects/*' end it 'includes many "*" when there are ancestors enabling wildcards' do - @page.stubs(:ancestors_and_self).returns([FactoryGirl.build(:page), - FactoryGirl.build(:page, :slug => 'archives'), - FactoryGirl.build(:page, :slug => 'month', :wildcard => true), - FactoryGirl.build(:page, :slug => 'projects'), @page]) + @page.stubs(:parent).returns(FactoryGirl.build(:page, :fullpath => 'archives/*/projects')) @page.send(:build_fullpath) @page.fullpath.should == 'archives/*/projects/*' end @@ -101,9 +104,7 @@ describe Locomotive::Page do end it 'turns a page into a wildcards one' do - Rails.logger.debug "=========== START ============" @month_page.update_attributes :wildcard => true - Rails.logger.debug "=========== END ============" @project_page.reload @project_page.fullpath.should == 'archives/*/projects/*' @posts_page.reload @@ -111,21 +112,52 @@ describe Locomotive::Page do end it 'turns off the wildcard property of page' do - puts "==== 1 ===" - Rails.logger.debug "==== 1 ===" - puts "@month_page = #{@month_page.fullpath.inspect} / #{@month_page.wildcards.inspect}" @month_page.update_attributes :wildcard => true - puts "==== 2 === " - Rails.logger.debug "==== 2 ===" @month_page.update_attributes :wildcard => false - puts "---- DONE ----" - Rails.logger.debug "==== DONE ===" @project_page.reload @project_page.fullpath.should == 'archives/month/projects/*' @project_page.wildcards.should == %w(project) @posts_page.reload @posts_page.fullpath.should == 'archives/month/posts' - @posts_page.wildcards.should == nil + @posts_page.wildcards.should == [] + end + + end + + describe 'building the hash map asssociating a wildcard name with its value from a path' do + + it 'returns an empty map for non wildcards fullpath' do + @page.fullpath = 'index' + @page.wildcards = nil + @page.match_wildcards('index').should be_empty + end + + it 'underscores the wildcard name in the returned hash map' do + @page.fullpath = 'projects/*' + @page.wildcards = %w(my-permalink) + @page.match_wildcards('projects/hello-world').should == { 'my_permalink' => 'hello-world' } + end + + it 'returns a map with one element if the fullpath contains a single wildcard' do + @page.fullpath = 'projects/*' + @page.wildcards = %w(permalink) + @page.match_wildcards('projects/hello-world').should == { 'permalink' => 'hello-world' } + end + + it 'returns a map with as many elements as there are wildcards in the fullpath' do + @page.fullpath = 'archives/*/projects/*' + @page.wildcards = %w(month permalink) + @page.match_wildcards('archives/june/projects/hello-world').should == { + 'month' => 'june', + 'permalink' => 'hello-world' + } + end + + it 'stores the map inside a virtual attribute' do + @page.fullpath = 'projects/*' + @page.wildcards = %w(permalink) + @page.match_wildcards('projects/hello-world') + @page.wildcards_hash.should == { 'permalink' => 'hello-world' } end end