В друпал 6й версии добавился замечательный хук hook_menu_alter позволяющий переопределить меню, сформированное хуками hook_menu.
пример использования:
например в профиле пользователя табы, называются Просмотр и Изменить, что как-то не очень хорошо выглядит, мы это исправим.
в своем модуле пишем:
<?php
function мой_модуль_menu_alter(&$items) {
$items['user/%user/view']['title'] = 'Профиль';
$items['user/%user_category/edit']['title'] = 'Настройки аккаунта';
$items['user/%user/profile/profile']['title'] = 'Редактировать профиль'; // таб от модуля content_profile
// здесь мы заменили скучные названия ссылок в меню создания нод
$items['node/add/group']['title'] = 'Создать группу';
$items['node/add/blog']['title'] = 'Написать в блог';
$items['node/add/mega-photos-album']['title'] = 'Создать фотоальбом';
}
?>
И не забудьте сбросить кэш
ДО:
ПОСЛЕ:
поехали дальше...
Многих наверно напрягает обилие текста
Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
под каждым комметарием при просмотре ветки анонимом. решение есть
в теме создаем 2 функции:
<?php
// дерево
function моя_тема_comment_thread_expanded($comment, $node) {
$links = module_invoke_all('link', 'comment', $comment, 0);
drupal_alter('link', $links, $node); // в этом вся "соль"
return theme('comment_view', $comment, $node, $links);
}
// плоское
function моя_тема_comment_flat_expanded($comment, $node) {
$links = module_invoke_all('link', 'comment', $comment, 0);
drupal_alter('link', $links, $node);
return theme('comment_view', $comment, $node, $links);
}
?>
затем в своем модуле пишем:
<?php
// с помощью этого хука, можно убирать такие ссылки из нод как "читать далее" и тд
function мой_модуль_link_alter(&$links, $node) {
unset($links['comment_forbidden']);
}
?>
сбрасываем кэш, и эта злополучная сточка пропадает как из нод так и из комментариев.
Комментарии
к слову о табах, а переводом это разве не решается?
*просто интересуюсь*
а как же через жмеринку на париж?
нет, тогда все изменится и в нодах и вообще везде где есть View и Edit
я об этом подозревала... видимо, я уже сплю...
интересно, спасибо
Думаю, стоит все же делать компромиссный вариант, дабы русские буквы не попадали в таблицу сорцов локализации, это плохой тон в дру-разработке. Например что-то типа такого:
<?php
function мой_модуль_menu_alter(&$items) {
$items['user/%user/view']['title'] = 'Profile';
$items['user/%user_category/edit']['title'] = 'Account settings';
$items['user/%user/profile/profile']['title'] = 'Edit profile'; // таб от модуля content_profile
// здесь мы заменили скучные названия ссылок в меню создания нод
$items['node/add/group']['title'] = 'Create group';
$items['node/add/blog']['title'] = 'Post to blog';
$items['node/add/mega-photos-album']['title'] = 'Create photo album';
}
?>
neochief, ну если уж делать совсем правильно, то здесь не надо оборачивать в t()
Да, безусловно вы правы. У меня тут просто 5 утра, со всем вытекающим из этого
penexe, огромное спасибо! Захомячил!
А чё не забобрил?
Вообще то, тайтлы пунктов меню не нужно оборачивать в t() - это делается автоматом.
*просто для справки*
спасибо, полезно
а нельзя ли это просто, без создания модуля, прописать в тэмплейт темы?
увы нет, модуль нужен
Очень хороший способ использования - отключать те страницы администрирования, к которым доступ пользователю не нужен.
Иногда у друпала не достаточно базовой гибкости в этом вопросе.
в случае с комментариями модуль ни к чему.
Достаточно строчку с drupal_alter заменить на unset($links['comment_forbidden']);
drupal_alter - это более "корректный" путь, мы как бы создаем хук, и любой модуль может повеситься на него (и изменить данные), но в данной конкретной ситуации это оверкилл, нафиг не надо.
<?php
function моя_тема_comment_thread_expanded($comment, $node) {
$links = module_invoke_all('link', 'comment', $comment, 0);
unset($links['comment_forbidden']);
return theme('comment_view', $comment, $node, $links);
}
?>
restyler, а в нодах ?
на вкус и цвет...
дергать бд на любой чих
+1
А вообще, есть два понятия.
Продакшн и девелопмент. По русски: Рабочий вариант и вариант в разработке.
Продакшн лучше всего оптимизировать под производительность, под ваш, конкретный, вариант.
Девелопмент лучше всего оптимизировать под универсальность.
Друпал больше склоняется к универсальности, поэтому здесь свой "плохой тон".
Если Вы уверены, что Ваша разработка на 150% не будет выложена в общий доступ и на всеобщее обозрение, то лучше всего ориентироваться на производительность.
Если же Вы собираетесь делиться этим с сообществом, то уж учитывайте и универсальность.
А уж если говорить конкретно про меню, то здесь функция t() будет вызвана в любом случае, т.к. это дефолтная функция параметра 'title callback', до тех пор, пока вы не переопределите эту функцию.
Спасибо!
Спасибо.
А может есть смысл собрать сразу несколько таких небольших улучшательств и оформить всё это в виде "русского твик-модуля". Чтобы можно было оттюнить любой друпал-проект просто через веб-форму:
1) Изменить в Профиле вкладку "Просмотр" на [___________]
2) Изменить в Профиле вкладку "Изменить" на [___________]
3) Отключить на всём сайте вывод текста "Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии" [Да/Нет]
4) Убрать штучку [Да/Нет]
5) Добавить дрючку [Да/Нет]
6) ...
.
n) ...
Поностью поддерживаю News, нужен модуль!
я тоже поддерживаю
а то форки мне надоели еще со времен предыдущего движка (guppy)
а с помощью этих функций можно убирать некоторые термины из $terms ноды?
нет
Еще одна хитрость, может кому-то пригодиться
При добавлении материала добавляем вверху табы ссылками на создание материалов (доступных по по правам данному пользователю) то-есть добавление материалов будет выглядить как на хабре
<?php
function мой_модуль_menu_alter(&$items) {
$types = node_get_types();
foreach ($types as $type) {
if (node_hook($type->type, 'form') && node_access('create', $type->type)) {
$items['node/add/'.$type->type]['type'] = MENU_LOCAL_TASK;
}
}
)?>
Отключить отображение табов на создание некоторых материалов можно по прежнему в настройках меню "навигация" сняв галочку "включено"
2 gumk,
<?php
function мой_модуль_menu_alter(&$items) {
$types = node_get_types();
foreach ($types as $type) {
if (node_hook($type->type, 'form') && node_access('create', $type->type)) {
$type_url_str = str_replace('_', '-', $type->type);
$items['node/add/'. $type_url_str]['type'] = MENU_LOCAL_TASK;
}
}
)?>
спасибо за исправления!
В принципе, раздражающую надпись "login">Войдите или register">зарегистрируйтесь, чтобы получить возможность отправлять комментарии" можно просто заменить с в настройках перевода на " ", и она исчезнет. Зачем дописывать какие-то модули?
а в какой это модуль прописывать надо? я об войти или зарегистрироваться.
в свой собственный
а что в него входит в свой собственный модуль. и как его написать если не программист?
Если это не модуль, то куда вставлять этот код?
Чем он лучше/хуже модуля по быстродействию?
Это можно вставить в template.php который находится в каталоге темы
По быстродействию конкретный код ничем не лучше и не хуже, просто чтобы сделать модуль надо гораздо больше кода написать, что не всегда бывает удобно и необходимо.
создал модуль. редактировать профиль сделалось... настроить учетную запись поменялось с Изменить
а Просмотреть так и не меняется... на Профиль
iNFerNo, попробуйте поменять вес вмодуля в в базе данных
таблица system колонка weight, значение у модуля установить 99
сбросить кеш
Гранд мерси penexe.
А как можно сделать разные имена вкладок вместо "Просмотр" для определённых типов материалов через template.php желательно?
Никак
И через модуль свой никак?
Через модуль можно.
hook_menu_alter() и там разруливать в title_callback
Вот бы увидеть, как это можно сделать :).
При таком попрошайничестве не подскажу.