payreagri_app/app/models/menu_item.rb
2018-08-03 01:48:58 +02:00

218 lines
5.2 KiB
Ruby

# -*- encoding : utf-8 -*-
class MenuItem < ActiveRecord::Base
ContentTypes =[
{:slug => "Page", :name => "page"},
{:slug => "MenuAlias", :name => "Alias"},
{:slug => "MenuUrl", :name => "Lien externe"},
{:slug => "Article", :name => "Lien vers un article"},
]
has_many :popup_popupables, :as => :popupable
has_many :popups, :through => :popup_popupables
has_many :animal_animalables, :as => :animalable
has_many :animals, :through => :animal_animalables
has_many :category_categoryables, :as => :categoryable
has_many :categories, :through => :category_categoryables
has_many :menu_item_tags
has_many :tags, :through => :menu_item_tags
has_many :menu_item_articles
has_many :articles, :through => :menu_item_articles
has_many :menu_item_categories
#has_many :categories, :through => :menu_item_categories
include Rails.application.routes.url_helpers
belongs_to :menu_content, :polymorphic => true
belongs_to :menu
#validates :name, :presence => true
#validates :slug, :presence => true
has_many :menu_item_langs, :dependent => :destroy
accepts_nested_attributes_for :menu_content
accepts_nested_attributes_for :menu_item_langs
belongs_to :image_file
belongs_to :icon_image_file, :class_name => "ImageFile"
belongs_to :icon_b_image_file, :class_name => "ImageFile"
belongs_to :icon_v_image_file, :class_name => "ImageFile"
attr_accessor :skip_before_update, :skip_permalink, :ancestors_menu, :skip_index
#after_update do
# if !skip_index
# logger.debug ["Updating document... ", self.menu_content.__elasticsearch__.delete_document, self.menu_content.__elasticsearch__.index_document].join
# end
#end
def name
self.menu_item_langs.first.name
end
acts_as_tree
def select_lang(lang_site_id)
self.menu_item_langs.find_by_lang_site_id(lang_site_id)
end
def url
if menu_content
self.permalink
else
"/404.html"
end
end
def cible_url(lang)
menu_item_path(:url => self.menu_item_langs.find_by_lang_site_id(lang.id).permalink, :lang => lang.slug)
end
def generate_permalink(menu_item_lang)
r = ""
node, ancestors = self, []
ancestors << node = MenuItem.find(node.parent_id) while node.parent_id?
ancestors.reverse.each do |ancestor|
r += ancestor.select_lang(menu_item_lang.lang_site_id).slug.to_s
r+= "/"
end
r+= menu_item_lang.slug.to_s
end
def set_permalink
if !skip_permalink
self.menu_item_langs.each do |menu_item_lang|
menu_item_lang.permalink = self.generate_permalink(menu_item_lang)
menu_item_lang.save
end
#self.skip_permalink = true
#self.skip_before_update = true
#self.save
# self.children.each do |child|
# child.save
# end
end
end
def validate_permalink
self.parent_id = nil if self.parent_id == 0
errors.add(:parent_id, 'doit être différent de la page actuelle') if parent_id == id and id != nil
if self.id
errors.add(:parent_id, 'attention la page parente à pour page parente celle-ci = boucle') if self.parent_id and self.id == MenuItem.find(self.parent_id).parent_id
end
conditions = ["menu_id = ? and parent_id "+(self.parent_id ? "=" : "IS")+" ? and slug = ? "+("and id != ?" if self.id).to_s, self.menu_id,self.parent_id ,self.slug]
conditions << self.id if self.id
if MenuItem.where(conditions).first
errors.add(:slug, 'est déjà utilisé')
end
end
def cible_name
"Elément de menu : #{self.name}"
end
before_create do
if !position
top = MenuItem.where(:parent_id => self.parent_id, :menu_id => self.menu_id).order("position DESC").first
if top
self.position = top.position.to_i + 1
else
self.position = 1
end
end
end
before_update do
if self.parent_id_changed?
MenuItem.where(["menu_id = ? and position > ? and parent_id "+(self.changes['parent_id'][0] ? "=" : "IS")+" ?",self.menu_id,self.position,self.changes['parent_id'][0]]).each do |portlet|
portlet.position = portlet.position - 1
portlet.save!
end
self.position = 1
MenuItem.where(["menu_id = ? and parent_id "+(self.parent_id ? "=" : "IS")+" ?",self.menu_id,self.parent_id]).each do |portlet|
portlet.position = portlet.position + 1
portlet.save!
end
end
end
before_destroy do
MenuItem.where(["menu_id = ? and position > ? and parent_id "+(self.parent_id ? "=" : "IS")+" ?",self.menu_id,self.position,self.parent_id]).each do |portlet|
portlet.position = portlet.position - 1
portlet.skip_before_update = true
portlet.save!
end
end
after_save do
if menu_content_type == "Page"
self.menu_content.skip_save_menu_item = true
self.menu_content.save
end
end
scope :archived, -> {where("archived = ?",true )}
scope :unarchived, -> {where(:archived => nil )}
end