app/models/dc_menu.rb in drg_cms-0.5.50.2 vs app/models/dc_menu.rb in drg_cms-0.5.51.1
- old
+ new
@@ -54,14 +54,15 @@
field :css, type: String
field :active, type: Boolean, default: true
field :created_by, type: BSON::ObjectId
field :updated_by, type: BSON::ObjectId
- index( { name: 1 }, { unique: true } )
-
+ belongs_to :dc_site
embeds_many :dc_menu_items
+ index( { name: 1 }, { unique: true } )
+
validates :name, :length => { :minimum => 4 }
validates :name, uniqueness: true
validates_length_of :description, minimum: 10
#######################################################################
@@ -75,18 +76,83 @@
# all current menus in dc_menus collection will be returned.
#
# Returns:
# Array. Of choices prepared for select input field.
#######################################################################
- def self.choices4_menu(site)
+def self.choices4_menu(site)
rez = []
menus = (site.menu_name.blank? ? all : where(name: site.menu_name)).to_a
menus.each do |menu|
rez << [menu.name, nil]
menu.dc_menu_items.where(active: true).order_by(order: 1).each do |menu_item|
rez << ['-- ' + menu_item.caption, menu_item._id]
end
end
rez
+end
+
+#######################################################################
+# Subroutine of choices4_menu_as_tree
+#######################################################################
+def self.do_sub_menu(menus, parent, ids) #:nodoc:
+ result = []
+ menus.each do |item|
+ long_id = "#{ids};#{item.id}"
+ result << [item.caption, long_id, parent, item.order]
+ sub_menus = item.dc_menu_items.order_by(order: 1).to_a
+ result += do_sub_menu(sub_menus, long_id, long_id) if sub_menus.size > 0
+ end
+ result
+end
+
+#######################################################################
+# Will return menu structure for menus belonging to the site.
+#
+# Parameters:
+# [Site] DcSite document. Site for which menu belongs to. If site is not specified
+# all current menus in collection will be returned.
+#
+# Returns:
+# Array. Of choices prepared for tree:select input field.
+#######################################################################
+def self.choices4_menu_as_tree(site_id=nil)
+ qry = where(active: true)
+#
+ ar = [nil]
+ if site_id.class == BSON::ObjectId
+ ar << site_id
+ elsif site_id.respond_to?(:id)
+ ar << site_id.id
+ end
+ qry = qry.in(dc_site_id: ar)
+#
+ result = []
+ qry.each do |menu|
+ result << [menu.name, menu.id, nil,0]
+ sub_menus = menu.dc_menu_items.order_by(order: 1).to_a
+ result += do_sub_menu(sub_menus, menu.id, menu.id.to_s) if sub_menus.size > 0
+ end
+ result
+end
+
+#######################################################################
+# Will update link value of selected menu_item
+#
+# Parameters:
+# [path] String. String path to MenuItem document, separated by ;
+# [link] String. New value of the link field
+#######################################################################
+def self.update_menu_item_link(path, link)
+ return unless path and link
+#
+ ar = path.split(';')
+ menu = find(ar.shift)
+ while (item = ar.shift) do
+ menu = menu.dc_menu_items.find(item)
+ end
+ return unless menu.respond_to?(:link) # top level selected
+#
+ menu.link = link
+ menu.save
end
end