# -*- 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"}, ] include Rails.application.routes.url_helpers belongs_to :menu_content, :polymorphic => true belongs_to :menu validates :name, :presence => true validates :slug, :presence => true attr_accessor :skip_before_update, :skip_permalink accepts_nested_attributes_for :menu_content acts_as_tree def url if menu_content self.permalink else "/404.html" end end def cible_url menu_item_path(:url => self.permalink) end before_validation do self.slug = self.slug.to_slug #self.validate_permalink end before_save do end def generate_permalink r = "" node, ancestors = self, [] ancestors << node = MenuItem.find(node.parent_id) while node.parent_id? ancestors.reverse.each do |ancestor| r += ancestor.slug.to_s r+= "/" end r+= self.slug.to_s end def set_permalink if !skip_permalink self.permalink = self.generate_permalink 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 scope :archived, -> {where("archived = ?",true )} scope :unarchived, -> {where(:archived => nil )} end