Artykuly w menu (id malejaco)

Witam serdecznie. Mam zaprojektowane menu z ktorym wrecz nie moge sobie poradzic.
Oto helper w ktorym jest zdefiniowane menu. miedzy innymi. Jak moge go rpzerobic aby artykuly pokazywaly sie w kolejnosci od najwiekszej do najmniejszej czyli tak jakby po dodaniu :order =>“id DESC”. Sek w tym ze nie wiem gdzie i w jaki sposob to dodac :slight_smile:

[code=ruby] # menu

odpala metode url_for_xxx dla kazdego elementu w tablicodrzewie nazw, odpowiednio dla typu obiektu xxx

lub uzupelnia pole url urlem z przekierowania jesli aktywne przekierowanie

struktura tablicy => patrz modele: category, article, metoda names_tree_array

def set_object_urls! arr
arr.each do |item|
item[:url] = self.method(‘url_for_’+item[:type]).call(item[:obj])
set_object_urls! item[:sub]
end
end

wyswietlenie konkretnego menu w miejscu wywolania. kind to :articles albo :shop, objtype - typ(z configu) artykulu

dodatkowe opcje dla niektorych typow menu w opts (patrz komentarze przy realizacjach konkretnych menu ponizej)

menu sklepu jest cacheowane

def show_menu kind, objtype, opts = {}
if kind == :shop
mv = Cache.find_by_key “shop_menu”
if mv.nil?
v = generate_menu kind, objtype, opts
Cache.create :key => “shop_menu”, :value => v
return v
else
return mv.value
end
else
return generate_menu kind, objtype, opts
end
end

def generate_menu kind, objtype, opts
case kind
when :articles
menuconf = @config[‘arttypes’][objtype][:menu]
if opts[:only_additional_left]
arr = Article.names_tree_array_only_additional_left objtype, @lang
else
arr = Article.names_tree_array objtype, @lang
end
when :shop
menuconf = @config[‘shop_menu’]
arr = Category.names_tree_array @lang
end

set_object_urls! arr

case menuconf[:type]
when :dropdown
  show_xmenu2 arr, menuconf, opts
when :block
  show_blockmenu arr, menuconf, opts
when :tree
  show_treemenu arr, menuconf, opts
end

end

def show_menu_additional_left objtype, parent, opts
arr = Article.names_tree_array_only_additional_left objtype, @lang, parent
menuconf = @config[‘arttypes’][‘poziom’][:menu]
set_object_urls! arr

  #show_xmenu2 arr, menuconf, {}
  show_blockmenu arr, menuconf, opts
  #show_treemenu arr, menuconf, {}

end

#xmenu2

def show_xmenu2 arr, conf, opts
ret = "\n”
else
ret += run_blockmenu conf
end
end

def run_blockmenu conf
ret = “\n”
return ret
end

def subblock arr, level, conf, opts
ret = “”
dtpre = opts[“dt#{level}prefix”]
ddpre = opts[“dd#{level}prefix”]
dtpost = opts[“dt#{level}postfix”]
ddpost = opts[“dd#{level}postfix”]
dtpre ||= opts[“dtprefix”]
ddpre ||= opts[“ddprefix”]
dtpost ||= opts[“dtpostfix”]
ddpost ||= opts[“ddpostfix”]
dtpre ||= “”
ddpre ||= “”
dtpost ||= “”
ddpost ||= “”
arr.each do |item|

    if !item[:sub].empty? && !conf[:nodes_active]
	    ret += "<li  id='block_#{item[:obj].id}'>#{dtpre} #{h item[:obj].name}#{dtpost}</li>"
    else
	    ret += "<div id='pierwszy#{item[:obj].id}' style=\"display: none;\">
		<ul><li id='block_#{item[:obj].id}'>#{dtpre} <span class=\"naglowek2\"> #{link_to item[:name], item[:url]}</span> #{dtpost} &nbsp;&nbsp;&nbsp;&nbsp; 
		<br />
		<a href=\"#\" onclick=\"document.getElementById('drugi#{item[:obj].id}').style.display='block'; document.getElementById('pierwszy#{item[:obj].id}').style.display='none'\"> 
		
		#{
		  if @lang == 'pl'
		  @ukryj = 'Ukryj... ';
		  else
		  @ukryj = 'Hide...';
		  end
		}
		
		</a>
		<br /> #{item[:obj].content} </li><br />
	    </ul>
	    </div>
	    
	    <div id='drugi#{item[:obj].id}' >
	    <ul><li id='block_#{item[:obj].id}'>#{dtpre} <span class=\"naglowek2\"> #{link_to item[:name], item[:url]}</span> #{dtpost} &nbsp;&nbsp;&nbsp;&nbsp; 
		<br />
		<a href=\"#\" onclick=\"document.getElementById('pierwszy#{item[:obj].id}').style.display='block'; document.getElementById('drugi#{item[:obj].id}').style.display='none';\"> 
		
		#{
		  if @lang == 'pl'
		  @ukryj = 'Więcej... ';
		  else
		  @ukryj = 'More...';
		  end
		}
		
		</a>
	    <br /> #{item[:obj].trailer} </li><br />
	    </ul>  
	    </div>"
    end
  
 
end

return ret

end[/code]
Sa tu 2 menu poziome i pionowe. Mnie interesuje pionowe albo oba ;p
Dziekuje za pomoc.

użyj znaczników [ code=ruby] [ /code] zeby wstawić kod (bez spacji przed code oczywiście)

…tak, widziałem już tego cmsa, ale powtórzę raz jeszcze, że to najgorzej napisany kod w rubym, jaki widziałem - i jednocześnie dowód na to, że jak ktoś chce napisać fatalnej jakości kod, to napisze go w każdym języku… tyle tytułem wstępu
Odpowiedzią pewnie będzie przestudiowanie/przerobienie metody names_tree_array modelu article.
Natomiast gdy przeczytałem opis metody, w który zwracane jest “tablicodrzewo” spadłem z krzesła, opluwając przy okazji monitor :smiley:

ctr+A delete.
Zastanów się czy usunięcie tego całego menu i napisanie go na nowo nie będzie prostsze niż w nim grzebanie. Serio.
A jak już musisz, to artykuły pojawiają się w dwóch miejscach:

if opts[:only_additional_left] arr = Article.names_tree_array_only_additional_left objtype, @lang else arr = Article.names_tree_array objtype, @lang end

def show_menu_additional_left objtype, parent, opts arr = Article.names_tree_array_only_additional_left objtype, @lang, parent
Zajrzyj więc do metod Article.names_tree_array_only_additional_left i Article.names_tree_array_only_additional_left objtype.

Piękny :wink: i chyba już raz przepisywany tylko że pewnie z php.
Przepisując to używaj więcej content_tag. Poniżej przykład który na 99 % nie działa, pisane z głowy, nie mam na czym testować.

def subblock arr, level, conf, opts arr.map do |item| if !item[:sub].empty? && !conf[:nodes_active] content_tag(:li, "#{opts["dt#{level}prefix"]} #{h item[:obj].name}#{opts["dt#{level}postfix"]}", :id => "block_#{item[:obj].id}") else if @lang == 'pl' more_link = link_to_function('Ukryj... ', "$('trailer#{item[:obj].id}').hide();$('content#{item[:obj].id}').show();") less_link = link_to_function('Więcej... ', "$('trailer#{item[:obj].id}').show();$('content#{item[:obj].id}').hide();") else more_link = link_to_function('Hide... ', "$('trailer#{item[:obj].id}').hide();$('content#{item[:obj].id}').show();") less_link = link_to_function('More... ', "$('trailer#{item[:obj].id}').show();$('content#{item[:obj].id}').hide();") end trailer = content_tag(content_tag(:span, "<br/> #{more_link} <br/> #{item[:obj].trailer} <br/>", :id => "trailer#{item[:obj].id}")) content = content_tag(content_tag(:span, "<br/> #{less_link} <br/> #{item[:obj].trailer} <br/>", :style => "display:hidden;", :id => "contet#{item[:obj].id}")) content_tag(:ul, content_tag(:li, dtpre + content_tag(:span, link_to(item[:name], item[:url]) , :class => "naglowke2") + dtpost + "<br/>" + trailer + content, :id => "block_#{item[:obj].id}")) end end.join end