Как создать меню на основе словаря в многоязыковом сайте

Главные вкладки

Аватар пользователя Lvl Lvl 16 июня 2009 в 16:56

Понадобилось сделать подменю на основе словаря. Готовые решения типа 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.
Осталось вручную отфильтровать нашу ссылку для разных языковых версий. У меня это прекрасно поместилось в темизирующей функции примерно так:

function mytheme_menu_single($menu, $level, $sub = '') {

        global $language;
        // вручную отфильтровываем языки
        if (!empty($menu['link']['options']['my_filter'])) {
                if ($menu['link']['options']['langcode'] != $language->prefix) return $sub;
        }
        // ...
}

Может конечно всё это можно сделать гораздо проще, но не нашел как.

Комментарии

Аватар пользователя Geldora Geldora 16 июня 2009 в 17:09

Интересно... а вот куда это вставлять? В блок? В темлейт.пхп? Или нужно модули ядра изменять?

п.с. второй код поняла куда... а вот первый?