Add mongoid-tree to Item

This commit is contained in:
Christophe Vilayphiou committed 2012-05-11 16:16:09 +08:00
1 parent fd52d00187
commit 6a443f0976
13 files changed
+60 -95

No files matched your search

+4 -4
View File
@@ -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
+4 -17
View File
@@ -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 << "<ol>" unless node.parent.nil?
ret << "<li id='#{node.id}'>"
ret << "<li id='#{node.id}' class='#{no_nested}'>"
ret << "<div class='with_action'>"
ret << (link_to node.i18n_variable[I18n.locale], dest)
ret << "<div class='quick-edit hide'>"
@@ -22,14 +22,13 @@ module Admin::ItemHelper
ret << "</div>"
ret << render_children(node)
ret << "</li>"
# ret << "</ol>" 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 << "<ol class='#{'sortable' if parent.parent.nil?}'>"
children.each do |child|
@@ -43,15 +42,3 @@ module Admin::ItemHelper
end
end
# <ol class="sortable">
# <li><div>Some content</div></li>
# <li><div>Some content</div>
# <ol>
# <li><div>Some sub-item content</div></li>
# <li><div>Some sub-item content</div></li>
# </ol>
# </li>
# <li><div>Some content</div></li>
# </ol>
+1 -1
View File
@@ -114,7 +114,7 @@ module ApplicationHelper
def page_title(page)
res = "<title>"
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
+16 -54
View File
@@ -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
-4
View File
@@ -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
@@ -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());
}
});
});