Маленькие хитрости в drupal6

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

Аватар пользователя penexe penexe 15 апреля 2009 в 1: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'$comment0);
  
drupal_alter('link'$links$node); // в этом вся "соль"
  
  
return theme('comment_view'$comment$node$links);
}
// плоское
function моя_тема_comment_flat_expanded($comment$node) {
  
$links module_invoke_all('link''comment'$comment0);
  
drupal_alter('link'$links$node);
  
  return 
theme('comment_view'$comment$node$links);
}
?>

затем в своем модуле пишем:

<?php
// с помощью этого хука, можно убирать такие ссылки из нод как "читать далее" и тд
function мой_модуль_link_alter(&$links$node) {
  unset(
$links['comment_forbidden']);
}
?>

сбрасываем кэш, и эта злополучная сточка пропадает как из нод так и из комментариев.

Комментарии

Аватар пользователя penexe penexe 15 апреля 2009 в 2:05

"EllECTRONC" wrote:
к слову о табах, а переводом это разве не решается?

нет, тогда все изменится и в нодах и вообще везде где есть View и Edit

Аватар пользователя EllECTRONC EllECTRONC 15 апреля 2009 в 2:06

"penexe" wrote:
нет, тогда все изменится и в нодах и вообще везде где есть View и Edit

я об этом подозревала... видимо, я уже сплю...

Аватар пользователя neochief neochief 15 апреля 2009 в 7:10

Думаю, стоит все же делать компромиссный вариант, дабы русские буквы не попадали в таблицу сорцов локализации, это плохой тон в дру-разработке. Например что-то типа такого:

<?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';
}
?>

Аватар пользователя seaji seaji 15 апреля 2009 в 12:13

Вообще то, тайтлы пунктов меню не нужно оборачивать в t() - это делается автоматом.
*просто для справки*

Аватар пользователя penexe penexe 15 апреля 2009 в 12:46

"Valeratal" wrote:
а нельзя ли это просто, без создания модуля, прописать в тэмплейт темы?

увы нет, модуль нужен

Аватар пользователя Арматурыч Арматурыч 15 апреля 2009 в 13:19

Очень хороший способ использования - отключать те страницы администрирования, к которым доступ пользователю не нужен.

Иногда у друпала не достаточно базовой гибкости в этом вопросе.

Аватар пользователя restyler restyler 15 апреля 2009 в 15:13

"penexe" wrote:
увы нет, модуль нужен

в случае с комментариями модуль ни к чему.
Достаточно строчку с 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);
}
?>

Аватар пользователя seaji seaji 16 апреля 2009 в 1:48

+1
А вообще, есть два понятия.
Продакшн и девелопмент. По русски: Рабочий вариант и вариант в разработке.
Продакшн лучше всего оптимизировать под производительность, под ваш, конкретный, вариант.
Девелопмент лучше всего оптимизировать под универсальность.

Друпал больше склоняется к универсальности, поэтому здесь свой "плохой тон".

Если Вы уверены, что Ваша разработка на 150% не будет выложена в общий доступ и на всеобщее обозрение, то лучше всего ориентироваться на производительность.

Если же Вы собираетесь делиться этим с сообществом, то уж учитывайте и универсальность.

Аватар пользователя seaji seaji 16 апреля 2009 в 1:52

А уж если говорить конкретно про меню, то здесь функция t() будет вызвана в любом случае, т.к. это дефолтная функция параметра 'title callback', до тех пор, пока вы не переопределите эту функцию.

Аватар пользователя News News 16 апреля 2009 в 13:06

Спасибо.

А может есть смысл собрать сразу несколько таких небольших улучшательств и оформить всё это в виде "русского твик-модуля". Чтобы можно было оттюнить любой друпал-проект просто через веб-форму:
1) Изменить в Профиле вкладку "Просмотр" на [___________]
2) Изменить в Профиле вкладку "Изменить" на [___________]
3) Отключить на всём сайте вывод текста "Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии" [Да/Нет]
4) Убрать штучку [Да/Нет]
5) Добавить дрючку [Да/Нет]
6) ...
.
n) ...

Аватар пользователя gumk gumk 25 апреля 2009 в 14:28

Еще одна хитрость, может кому-то пригодиться

При добавлении материала добавляем вверху табы ссылками на создание материалов (доступных по по правам данному пользователю) то-есть добавление материалов будет выглядить как на хабре

<?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;
    }
  }
)
?>

Отключить отображение табов на создание некоторых материалов можно по прежнему в настройках меню "навигация" сняв галочку "включено"

Аватар пользователя penexe penexe 25 апреля 2009 в 14:25

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;
    }
  }
)
?>
Аватар пользователя albik albik 28 июля 2009 в 15:19

В принципе, раздражающую надпись "login">Войдите или register">зарегистрируйтесь, чтобы получить возможность отправлять комментарии" можно просто заменить с в настройках перевода на " ", и она исчезнет. Зачем дописывать какие-то модули?

Аватар пользователя penexe penexe 26 января 2010 в 22:09

"iNFerNo" wrote:
а в какой это модуль прописывать надо? я об войти или зарегистрироваться.

в свой собственный

Аватар пользователя chel chel 3 февраля 2011 в 18:10

"restyler" wrote:
<?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);
}
?>

Если это не модуль, то куда вставлять этот код?
Чем он лучше/хуже модуля по быстродействию?

Аватар пользователя Azerot Azerot 3 февраля 2011 в 18:31

Это можно вставить в template.php который находится в каталоге темы
По быстродействию конкретный код ничем не лучше и не хуже, просто чтобы сделать модуль надо гораздо больше кода написать, что не всегда бывает удобно и необходимо.

Аватар пользователя iNFerNo iNFerNo 2 марта 2011 в 13:23

"penexe" wrote:

function мой_модуль_menu_alter(&$items) {
$items['user/%user/view']['title'] = 'Профиль';
$items['user/%user_category/edit']['title'] = 'Настройки аккаунта';
$items['user/%user/profile/profile']['title'] = 'Редактировать профиль'; // таб от модуля content_profile

создал модуль. редактировать профиль сделалось... настроить учетную запись поменялось с Изменить

а Просмотреть так и не меняется... на Профиль

Аватар пользователя penexe penexe 2 марта 2011 в 14:00

iNFerNo, попробуйте поменять вес вмодуля в в базе данных
таблица system колонка weight, значение у модуля установить 99
сбросить кеш

Аватар пользователя ivan-zykov ivan-zykov 3 февраля 2012 в 14:53

А как можно сделать разные имена вкладок вместо "Просмотр" для определённых типов материалов через template.php желательно?