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