Маленькие хитрости в drupal6
Прислано: penexe
вт, 14/04/2009 - 21:27
В друпал 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']);
}
?>сбрасываем кэш, и эта злополучная сточка пропадает как из нод так и из комментариев.
- penexe's blog
- Для комментирования войдите или зарегистрируйтесь
к слову о табах, а переводом это разве не решается?
*просто интересуюсь*
- Для комментирования войдите или зарегистрируйтесь
слову о табах, а переводом это разве не решается?
а как же через жмеринку на париж? :)
- Для комментирования войдите или зарегистрируйтесь
к слову о табах, а переводом это разве не решается?
нет, тогда все изменится и в нодах и вообще везде где есть View и Edit
- Для комментирования войдите или зарегистрируйтесь
нет, тогда все изменится и в нодах и вообще везде где есть 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 ноды?
- Для комментирования войдите или зарегистрируйтесь
а с помощью этих функций можно убирать некоторые термины из $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;
}
}
)?>
- Для комментирования войдите или зарегистрируйтесь
спасибо за исправления!
- Для комментирования войдите или зарегистрируйтесь
В принципе, раздражающую надпись "Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии" можно просто заменить с в настройках перевода на " ", и она исчезнет. Зачем дописывать какие-то модули?
- Для комментирования войдите или зарегистрируйтесь
а в какой это модуль прописывать надо? я об войти или зарегистрироваться.
- Для комментирования войдите или зарегистрируйтесь
а в какой это модуль прописывать надо? я об войти или зарегистрироваться.
в свой собственный
- Для комментирования войдите или зарегистрируйтесь
а что в него входит в свой собственный модуль. и как его написать если не программист?
- Для комментирования войдите или зарегистрируйтесь
<?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);
}
?>Если это не модуль, то куда вставлять этот код?
Чем он лучше/хуже модуля по быстродействию?
- Для комментирования войдите или зарегистрируйтесь
Это можно вставить в template.php который находится в каталоге темы
По быстродействию конкретный код ничем не лучше и не хуже, просто чтобы сделать модуль надо гораздо больше кода написать, что не всегда бывает удобно и необходимо.
- Для комментирования войдите или зарегистрируйтесь
function мой_модуль_menu_alter(&$items) {
$items['user/%user/view']['title'] = 'Профиль';
$items['user/%user_category/edit']['title'] = 'Настройки аккаунта';
$items['user/%user/profile/profile']['title'] = 'Редактировать профиль'; // таб от модуля content_profile
создал модуль. редактировать профиль сделалось... настроить учетную запись поменялось с Изменить
а Просмотреть так и не меняется... на Профиль
- Для комментирования войдите или зарегистрируйтесь
iNFerNo, попробуйте поменять вес вмодуля в в базе данных
таблица system колонка weight, значение у модуля установить 99
сбросить кеш
- Для комментирования войдите или зарегистрируйтесь
Гранд мерси penexe.
- Для комментирования войдите или зарегистрируйтесь
А как можно сделать разные имена вкладок вместо "Просмотр" для определённых типов материалов через template.php желательно?
- Для комментирования войдите или зарегистрируйтесь
И через модуль свой никак?
- Для комментирования войдите или зарегистрируйтесь
Через модуль можно.
hook_menu_alter() и там разруливать в title_callback
- Для комментирования войдите или зарегистрируйтесь
Вот бы увидеть, как это можно сделать :).
- Для комментирования войдите или зарегистрируйтесь
При таком попрошайничестве не подскажу.
- Для комментирования войдите или зарегистрируйтесь

















Комментарии