Понадобилось сделать подменю на основе словаря. Готовые решения типа taxonomy_menu неправильно отрабатывали многоязычность, поэтому пришлось самому разбираться.
Система в друпале такая, есть таблица роутинга, на основе которой генерируется таблица ссылок.
Изначально есть модуль, который черех hook_menu создает страницу, допустим toys, выводящую игрушки. Нам нужно сделать подменю, генерируемое по словарю, термины которого задают тип игрушки. Т.е. toys/1 - самолетики, toys/2 - машинки, toys/3 - самолетики для англ. языка, toys/4 - машинки для англ. языка. Включаем i18n_taxonomy, делаем третий типа перевода словая, получаем возможность вносить разные термины для разных языков.
Теперь функция вставки терминов в меню:
function delete_menu_links_by_router_path($path, $with_parent = false) {
if (strlen($path) <= 0) return false;
$where = '';
if (!$with_parent) $where .= ' AND plid > 0';
db_query('DELETE FROM {menu_links} WHERE router_path = "%s"'.$where, $path);
}
// генерируем подменю
function module_refresh_submenu() {
delete_menu_links_by_router_path('toys');
$vid = variable_get('toys_vid', 1); // получаем нужный словарь
// выключаем переводы чтобы получить все термины
$i18n_mode = i18n_selection_mode();
i18n_selection_mode('off');
$terms = taxonomy_get_tree($vid);
i18n_selection_mode($i18n_mode);
// сохраняем ссылки
foreach ($terms as $key => $value) {
$item = array(
'link_title' => $value->name,
'link_path' => 'toys/'.$value->tid,
'router_path' => 'toys',
'options' => array('langcode' => $value->language, 'my_filter' => 1),
'menu_name' => 'menu-mainmenu', // название меню
);
menu_link_save($item);
}
}
Функцию рефреша вызывать где надо, скорее всего в реализации hook_taxonomy.
Осталось вручную отфильтровать нашу ссылку для разных языковых версий. У меня это прекрасно поместилось в темизирующей функции примерно так:
Может конечно всё это можно сделать гораздо проще, но не нашел как.
Комментарии
Интересно... а вот куда это вставлять? В блок? В темлейт.пхп? Или нужно модули ядра изменять?
п.с. второй код поняла куда... а вот первый?
[deleted]
а через views что нельзя было?