Маленькие хитрости в 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'$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']);
}
?>

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

Комментарии


Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Применить"
Опубликовано EllECTRONC в вт, 14/04/2009 - 21:49.

к слову о табах, а переводом это разве не решается?
*просто интересуюсь*


Опубликовано Ильич Рамирес Санчес в вт, 14/04/2009 - 21:51.

"EllECTRONC" написал(а):

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

а как же через жмеринку на париж? :)


Опубликовано penexe в вт, 14/04/2009 - 22:05.

"EllECTRONC" написал(а):

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

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


Опубликовано EllECTRONC в вт, 14/04/2009 - 22:06.

"penexe" написал(а):

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

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


Опубликовано batbug в ср, 15/04/2009 - 02:31.

интересно, спасибо


Опубликовано neochief в ср, 15/04/2009 - 03: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';
}
?>


Опубликовано penexe в ср, 15/04/2009 - 02:57.

neochief, ну если уж делать совсем правильно, то здесь не надо оборачивать в t()


Опубликовано neochief в ср, 15/04/2009 - 03:10.

Да, безусловно вы правы. У меня тут просто 5 утра, со всем вытекающим из этого :)


Опубликовано Azerot в ср, 15/04/2009 - 07:15.

penexe, огромное спасибо! Захомячил! :)


Опубликовано Sergoff в ср, 15/04/2009 - 07:33.

А чё не забобрил? :)


Опубликовано seaji в ср, 15/04/2009 - 08:13.

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


Опубликовано Valeratal в ср, 15/04/2009 - 08:35.

спасибо, полезно

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


Опубликовано penexe в ср, 15/04/2009 - 08:46.

"Valeratal" написал(а):

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

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


Опубликовано Арматурыч в ср, 15/04/2009 - 09:19.

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

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


Опубликовано restyler в ср, 15/04/2009 - 11:13.

"penexe" написал(а):

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

в случае с комментариями модуль ни к чему.
Достаточно строчку с drupal_alter заменить на unset($links['comment_forbidden']);

drupal_alter - это более "корректный" путь, мы как бы создаем хук, и любой модуль может повеситься на него (и изменить данные), но в данной конкретной ситуации это оверкилл, нафиг не надо.

<?php
function моя_тема_comment_thread_expanded($comment$node) {
  
$links module_invoke_all('link''comment'$comment0);
  unset(
$links['comment_forbidden']); 
  
  return 
theme('comment_view'$comment$node$links);
}
?>


Опубликовано penexe в ср, 15/04/2009 - 11:28.

restyler, а в нодах ?
на вкус и цвет...


Опубликовано alexandr.poddubsky в ср, 15/04/2009 - 18:46.

"neochief" написал(а):

плохой тон

дергать бд на любой чих


Опубликовано seaji в ср, 15/04/2009 - 21:48.

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

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

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

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


Опубликовано seaji в ср, 15/04/2009 - 21:52.

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


Опубликовано Dimm в чт, 16/04/2009 - 07:28.

Спасибо!


Опубликовано News в чт, 16/04/2009 - 09:06.

Спасибо.

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


Опубликовано Nokey_mus в чт, 16/04/2009 - 15:37.

Поностью поддерживаю News, нужен модуль!


Опубликовано Valeratal в пт, 17/04/2009 - 05:24.

я тоже поддерживаю
а то форки мне надоели еще со времен предыдущего движка (guppy)


Опубликовано nleo в вс, 19/04/2009 - 08:46.

а с помощью этих функций можно убирать некоторые термины из $terms ноды?


Опубликовано penexe в вс, 19/04/2009 - 17:17.

"nleo" написал(а):

а с помощью этих функций можно убирать некоторые термины из $terms ноды?

нет


Опубликовано gumk в сб, 25/04/2009 - 10: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 в сб, 25/04/2009 - 10: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;
    }
  }
)
?>


Опубликовано gumk в сб, 25/04/2009 - 10:27.

спасибо за исправления!


Опубликовано albik в вт, 28/07/2009 - 11:19.

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


Опубликовано iNFerNo в вт, 26/01/2010 - 18:23.

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


Опубликовано penexe в вт, 26/01/2010 - 19:09.

"iNFerNo" написал(а):

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

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


Опубликовано iNFerNo в пт, 19/03/2010 - 10:23.

а что в него входит в свой собственный модуль. и как его написать если не программист?


Опубликовано chel в чт, 03/02/2011 - 15:10.

"restyler" написал(а):

<?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 в чт, 03/02/2011 - 15:31.

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


Опубликовано iNFerNo в ср, 02/03/2011 - 10:23.

"penexe" написал(а):

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

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

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


Опубликовано penexe в ср, 02/03/2011 - 11:00.

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


Опубликовано iNFerNo в ср, 02/03/2011 - 11:26.

Гранд мерси penexe.


Опубликовано ivan-zykov в пт, 03/02/2012 - 10:53.

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


Опубликовано RxB в пт, 03/02/2012 - 11:08.

Никак


Опубликовано ivan-zykov в пт, 03/02/2012 - 11:17.

И через модуль свой никак?


Опубликовано RxB в пт, 03/02/2012 - 11:33.

Через модуль можно.
hook_menu_alter() и там разруливать в title_callback


Опубликовано ivan-zykov в пт, 03/02/2012 - 15:44.

Вот бы увидеть, как это можно сделать :).


Опубликовано RxB в пт, 03/02/2012 - 16:57.

При таком попрошайничестве не подскажу.


Новое на сайте

Ссылки партнёров