diff --git a/Gemfile b/Gemfile
index 24ee0383..c24754c6 100644
--- a/Gemfile
+++ b/Gemfile
@@ -16,6 +16,7 @@ gem 'kaminari', :git => 'git://github.com/amatsuda/kaminari.git'
gem 'mini_magick'
gem 'mongoid'
+gem 'mongoid-tree', :require => 'mongoid/tree'
gem "mongo_session_store-rails3"
gem 'nokogiri'
gem 'radius'
diff --git a/Gemfile.lock b/Gemfile.lock
index e850e52b..0dfca3b6 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -118,6 +118,8 @@ GEM
activemodel (~> 3.1)
mongo (~> 1.3)
tzinfo (~> 0.3.22)
+ mongoid-tree (0.7.0)
+ mongoid (~> 2.0)
multi_json (1.1.0)
nokogiri (1.5.2)
nokogiri (1.5.2-x86-mingw32)
@@ -277,6 +279,7 @@ DEPENDENCIES
mini_magick
mongo_session_store-rails3
mongoid
+ mongoid-tree
nokogiri
radius
rails (>= 3.1.0, < 3.2.0)
diff --git a/app/controllers/pages_controller.rb b/app/controllers/pages_controller.rb
index c4e00aa2..b781f202 100644
--- a/app/controllers/pages_controller.rb
+++ b/app/controllers/pages_controller.rb
@@ -15,7 +15,7 @@ class PagesController < ApplicationController
def show
#begin
- @item = Item.first(:conditions => {:full_name => params[:page_name]})
+ @item = Item.first(:conditions => {:path => params[:page_name]})
if @item && @item.is_published && (@item.enabled_for.nil? ? true : @item.enabled_for.include?(I18n.locale.to_s))
case @item._type
when 'Page'
@@ -33,16 +33,16 @@ class PagesController < ApplicationController
def index_from_link
if params[:page]
- redirect_to "/#{@item.full_name}?page=#{params[:page]}&category_id=#{params[:category_id]}&tag_id=#{params[:tag_id]}"
+ redirect_to "/#{@item.path}?page=#{params[:page]}&category_id=#{params[:category_id]}&tag_id=#{params[:tag_id]}"
else
- redirect_to "/#{@item.full_name}?category_id=#{params[:category_id]}&tag_id=#{params[:tag_id]}"
+ redirect_to "/#{@item.path}?category_id=#{params[:category_id]}&tag_id=#{params[:tag_id]}"
end
end
def show_from_link
# debugger
# a=1
- redirect_to "/#{@item.full_name}?id=#{params[:id]}&preview=#{params[:preview]}"
+ redirect_to "/#{@item.path}?id=#{params[:id]}&preview=#{params[:preview]}"
end
def load_orbit_bar
diff --git a/app/helpers/admin/item_helper.rb b/app/helpers/admin/item_helper.rb
index dc78db88..aeadfdd0 100644
--- a/app/helpers/admin/item_helper.rb
+++ b/app/helpers/admin/item_helper.rb
@@ -8,9 +8,9 @@ module Admin::ItemHelper
dest = admin_page_path(node)
when 'Link'
dest = admin_link_path(node)
+ no_nested = 'no-nest'
end
- # ret << "
" unless node.parent.nil?
- ret << "- "
+ ret << "
- "
ret << "
"
ret << (link_to node.i18n_variable[I18n.locale], dest)
ret << "
"
@@ -22,14 +22,13 @@ module Admin::ItemHelper
ret << "
"
ret << render_children(node)
ret << ""
- # ret << "" unless node.parent.nil?
end
ret.html_safe
end
def render_children(parent)
- children = parent.ordered_children
- if !children.entries.blank?
+ children = parent.children
+ if !parent.children.entries.blank?
ret = ''
ret << "
"
children.each do |child|
@@ -43,15 +42,3 @@ module Admin::ItemHelper
end
end
-
-
-#
-# Some content
-# Some content
-#
-# Some sub-item content
-# Some sub-item content
-#
-#
-# Some content
-#
\ No newline at end of file
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 844fbe14..37c2d0d2 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -114,7 +114,7 @@ module ApplicationHelper
def page_title(page)
res = ""
page_title = page.title ? page.title[I18n.locale] : page.i18n_variable[I18n.locale]
- if page.is_home? && @site.title
+ if page.root? && @site.title
res << @site.title[I18n.locale]
elsif @site.title && @site.title_always_on
res << @site.title[I18n.locale] + ' - ' + page_title
diff --git a/app/models/item.rb b/app/models/item.rb
index cea088fc..4d6ca001 100644
--- a/app/models/item.rb
+++ b/app/models/item.rb
@@ -2,59 +2,31 @@ class Item
include Mongoid::Document
include Mongoid::Timestamps
+ include Mongoid::Tree
+ include Mongoid::Tree::Ordering
- field :name, :index => true
- field :full_name, :index => true
- field :position, :type => Integer
- field :is_published, :type => Boolean, :default => false, :index => true
- field :enabled_for, :type => Array, :default => nil
- field :menu_enabled_for, :type => Array, :default => nil
+ field :name
+ field :path
+ field :is_published, :type => Boolean, :default => false
+ field :enabled_for, :type => Array, :default => nil
+ field :menu_enabled_for, :type => Array, :default => nil
validates_format_of :name, :with => /^[0-9a-zA-Z\-_]+$/
validates :name, :exclusion => { :in => LIST[:forbidden_item_names] }
validates_uniqueness_of :name, :scope => :parent_id
- validates_presence_of :name, :full_name, :position
+ validates_presence_of :name
+
+ validates_associated :parent, :children
+ after_rearrange :rebuild_path
- belongs_to :parent, :class_name => "Item"
has_one :i18n_variable, :as => :language_value, :autosave => true, :dependent => :destroy
- has_many :children, :class_name => "Item", :as => 'parent'
-
- before_validation :setup_default_value
def self.find_by_name(item_name)
Item.first(:conditions => { :name => item_name, :is_published => true })
end
-
- # Get an array of ancestors
- def ancestors
- node, nodes = self, []
- nodes << node = node.parent while !node.parent.blank? rescue nil
- nodes.reverse
- end
- # Get an array of ancestor's id
- def ancestor_ids
- node, nodes = self, []
- while !node.parent.blank? do
- node = node.parent rescue nil
- nodes << node.id if node
- end
- # nodes << node = node.parent while !node.parent.blank? rescue nil
- nodes.reverse
- end
-
- # Build the url from the array of ancestors
- def url
- urls = ancestors.map{ |a| a.name } << self.name
- urls.join("/")
- end
-
- def ordered_children
- self.children.asc(:position)
- end
-
- def ordered_and_visible_children
- objects = ordered_children
+ def visible_children
+ objects = self.children
a = []
if objects
objects.each do |object|
@@ -66,20 +38,10 @@ class Item
protected
- def setup_default_value
- # Set the position value within the parent scope
- if self.position.blank?
- max_page = Item.where(:parent_id => self.parent_id).count
- self.position = (max_page)? max_page + 1 : 1
- end
-
- # Build the full_name from the ancestors array
- full_node = self.ancestors.map{ |a| a.name }.push( self.name )
- # Remove root node if not root
- full_node.shift if full_node.size >= 2
- self.full_name = full_node.join("/")
+ def rebuild_path
+ self.path = (self.ancestors_and_self - [Item.root]).collect{|x| x.name unless x.root?}.join('/')
end
-
+
# Enable the validation for parent_id
def validates_presence_of_parent_id?
true
diff --git a/app/models/page.rb b/app/models/page.rb
index 5a742e92..0378b688 100644
--- a/app/models/page.rb
+++ b/app/models/page.rb
@@ -15,10 +15,6 @@ class Page < Item
before_save :create_parts, :set_key
# embeds_many :custom_images, :class_name => 'Image', as: :design_image
-
- def is_home?
- self.parent ? false : true
- end
def title
@title ||= I18nVariable.first(:conditions => {:key => 'title', :language_value_id => self.id, :language_value_type => self.class}) rescue nil
diff --git a/app/views/admin/items/_site_map_left_bar.html.erb b/app/views/admin/items/_site_map_left_bar.html.erb
index 69e7851c..fb280299 100644
--- a/app/views/admin/items/_site_map_left_bar.html.erb
+++ b/app/views/admin/items/_site_map_left_bar.html.erb
@@ -19,9 +19,6 @@
stop: function(event, ui) {
$.post("<%= admin_update_position_path %>", { id: ui.item.attr('id'), parent_id: ui.item.parent().closest('li').attr('id'), position: ui.item.index() } );
- // console.log("parent: " + ui.item.parent().closest('li').attr('id'));
- // console.log("id: " + ui.item.attr('id'));
- // console.log("position: " + ui.item.index());
}
});
});
diff --git a/lib/parsers/parser_back_end.rb b/lib/parsers/parser_back_end.rb
index 33b19510..e9c08a01 100644
--- a/lib/parsers/parser_back_end.rb
+++ b/lib/parsers/parser_back_end.rb
@@ -14,7 +14,7 @@ module ParserBackEnd
# }.join(' | ')
# end
# c.define_tag 'link' do |tag|
- # item = Item.first(:conditions => { :full_name => tag.attr['name'] })
+ # item = Item.first(:conditions => { :path => tag.attr['name'] })
# ret = ''
# ret << " 0
+ if page.visible_children.size > 0
res << "