Theme + Menu trong Drupal 6 ?
public
group:
jcisio - Mon, 2008-07-07 17:49
Có khá nhiều module trình bày menu theo ý mình, như Simple Menu, Nice Menus, Taxonomy Menu... nhưng chúng quá cồng kềnh. Trong Drupal lại có chức năng theme rất mạnh, có thể dùng để trình bày lại menu. Nhưng mà không biết làm cách nào ?
Lệnh
<?php
print theme('links', ... $primary_links);
?>có thể dùng để định dạng lại menu, nhưng $primary_link lại chỉ có 1 cấp. Tạo 1 region sau đó gán 1 menu vào region này, thì
<?php
print $region;
?>sẽ giải quyết được vấn đề đa cấp, nhưng lại không điều khiển được cấu trúc html trong $region. Phải bắt hàm nào để chỉnh lại ? (vì nếu chỉ sửa css thôi thì vẫn còn bị gò bó).


Khi gọi theme ('foo') thì
Khi gọi theme ('foo') thì Drupal sẽ gọi các hàm theo thứ tự:
themename_foo =>phptemplate_foo (đúng phải là templatename_foo) =>theme_foođể trình bày nội dung.
Vậy, muốn handle cái theme ('link'), chỉ cần tạo hàm themename_links, và copy nội dung của hàm cũ vào đó, chỉnh nội dung hàm để có kết quả theo ý muốn.
Có một điều mà các hàm giao diện Drupal làm rất tốt: Cung cấp khá chi tiết class & ID, dựa vào các class và ID này, tha hồ mà chỉnh. Nhiều lúc bí về CSS quá thì có thể lạm dụng JS một chút.
--
Thế Hồng
Cái theme('links'...) thì
Cái theme('links'...) thì chỉnh được, nhưng vì $primary_links đưa vào đó chỉ có 1 cấp nên không dùng được. khi làm 2 hàng menu. Vậy mới nhảy qua cái cách tạo region rồi trong file template "print $region".
$region dùng định dạng chuẩn cung cấp bởi Drupal, class & id chi tiết nhưng bị cái nó theo cấu trúc < span>< span>< a>text< /a>< /span>< /span> mà mình thì lại cần kiểu < a>< span>text< /span>< /a> để trình bày cạnh, góc cho mấy cái menu :( Tất nhiên, vài dòng regexp để chuyển giá trị trong $region theo cách của mình là xong, nhưng nếu có cách thao tác trên dữ liệu chưa định dạng thì phải tốt hơn rồi.
--
[vi] www.thongtincongnghe.com
Trang tin điện tử về CNTT, Viễn thông, Điện tử...
Có override nói ở trên
Cái override nói ở trên TH đã nhầm với Drupal 5. Drupal 6, sử dụng theme registry, TH chỉ mới học sử dụng hook_theme để override, còn về override = theme cụ thể như thế nào thì chưa có làm. Sorry, TH đang maintainance các site Drupal 5, học thêm Drupal 6 nên có hơi loạn :-(
Chủ đề của topic này nên là "sử dụng primary links" đa cấp hay cái chi chi, chứ "Theme + Menu trong Drupal 6?" thấy nó lạc lạc làm sao í nhỉ?
TH có search trong api.drupal.org từ khoá "primary" thỉ lòi ra hàm "menu_primary_links" => mò tới "menu_navigation_links" thì thấy nó có tham số đầu vào là $level, không rõ tham số làm gì? Thấy "menu_secondary_links" có gọi hàm này và truyền vào $level = 1 nếu như primary links source == secondary links source.
--
Thế Hồng
Tiêu đề như vậy bởi
Tiêu đề như vậy bởi vì không phải chỉ dùng riêng cho primary links. Tạo bất kì menu nào cũng được, rồi tìm cách hiển thị nó trong menu ngang. Vấn đề là theme cái menu này.
Hàm menu_navigation_links có lí đó, mặc dù nó can thiệp hơi sâu và để config được trong admin thì phải viết thêm code. Có lẽ các module tạo menu đều dùng hàm này. Tối nay về sẽ nghiên cứu. Không rõ primary/secondary links source là cái gì (k° phải mỗi menu có source riêng, mình add item vào từng cái, trừ những cái được thêm tự động từ các module ?), nhưng trong hàm menu_navigation_links thì $level cho biết cấp tối đa sẽ hiển thị (duyệt từ cấp đó trở lên).
--
[vi] www.thongtincongnghe.com
Trang tin điện tử về CNTT, Viễn thông, Điện tử...
Không rõ primary/secondary
Menu soruces là các giá trị được cấu hình từ biểu mẫu này: /?q=admin/build/menu/settings
--
Thế Hồng
Đính chính lại là cái
Đính chính lại là cái $level chỉ lấy duy nhất menu cấp đó mà thôi.
Tối hôm qua về làm thì thấy có thể bắt chước nice_menus được, dùng hàm menu_tree_page_data() để lấy toàn bộ dữ liệu về menu rồi xử lí. Nhưng vẫn không thể đè lên cái theme chuẩn để tạo link dạng "< a...>title< /a>" được (chắc là được, trong template thì register (D6 đòi register các hook theme), cũng như module devel nó override toàn bộ các hook theme để chèn span vào).
Thôi chọn cách dễ nhất là lấy dữ liệu có sẵn (tạo 1 region tên là 'nav' chứa menu) rồi sửa lại, cũng chưa hoàn chỉnh lắm, nhưng về mặt trình bày ok:
<?php$nav = preg_replace('/\<div.*?\>/', '', $nav);
$nav = preg_replace('/<\/div>/', '', $nav);
$nav = preg_replace('/ class="menu"/', '', $nav);
$nav = str_replace(array('leaf', 'collapsed', 'expanded', 'first', 'last'), '', $nav);
$nav = preg_replace('/(\<a .*?\>)(.*?)\<\/a\>/', '\\1<span>\\2</span></a>', $nav);
?>
--
[vi] www.thongtincongnghe.com
Trang tin điện tử về CNTT, Viễn thông, Điện tử...