Смотрю на этом сайте "заголовок профиля" то поудобнее будет)

Аватар пользователя Ilya_ Ilya_ 10 апреля 2018 в 16:58

Всем привет.
Как заменить на D7 название "Моя учетная запись" на $user->name

хочу сделать как на всех нормальных сайтах и на drupal.ru. Выводить имя пользователя и прицепить font-awesome иконку, а не просто "Моя учетная запись".
п.с. Модуль menu token не нужен.

Лучший ответ

Аватар пользователя bumble bumble 11 апреля 2018 в 16:39
2

Ок. На тесте, реализовал следующим образом:

<?php
/**
 * Implements hook_menu_alter().
 */
function MYMODULE_menu_alter(&$items) {
    
$items['user']['title callback'] = 'MYMODULE_user_menu_title';
}
 
/**
 * Rewrite menu item title callback for the 'user' path.
 *
 * Anonymous users should see "User account", but authenticated users are
 * expected to see them name.
 */
function MYMODULE_user_menu_title() {
    return 
user_is_logged_in() ? $GLOBALS['user']->name t('User account');
}
?>

Replace user menu link title

Комментарии

Аватар пользователя Ilya_ Ilya_ 10 апреля 2018 в 18:40

bumble wrote:

Это 7ка.

В целом, реализовано с помощью хука theme_menu_link.

Спасибо, респект!

Вот функция, если в будущем кто-нибудь захочет поменять:

<?php

function имя темы_translated_menu_link_alter(&$item$map) {
global 
$user;
if (
$item['href'] == 'user') {
$item['title'] = t($user->name);
}
}
?>

Вроде мелочь, но Друпал весь состоит из таких "приятных" мелочей, которые иногда вгоняют в уныние) И из-за которых целые модули ставить расточительно как-то.
Хотя может быть данный вопрос дело вкуса, но во всех современных и топовых сайтах, включая соц-сети, кнопка профиля называется либо именем профиля, либо аватарка + имя.

Аватар пользователя Ilya_ Ilya_ 10 апреля 2018 в 19:37

я не очень в php. Функция выше выдает ошибки
Notice: Array to string conversion в функции _menu_tree_check_access() (строка 1530 в файле \includes\menu.inc).
и
Notice: Undefined property: stdClass::$name в функции promotion_translated_menu_link_alter() (строка 231 в файле \sites\all\themes\promotion\template.php).

Аватар пользователя bumble bumble 10 апреля 2018 в 19:44
1

Не совсем понятно зачем Вам hook_translated_menu_link_alter, когда есть обычный hook_menu_link_alter, но и его назначение не особо очевидно.

И конструкции вида t($user->name) - уж точно не правильны.

Вам вполне подошел бы тот вариант, который был рекомендован изначально, что-то вроде:

<?php
function THEME_menu_link($variables) {
  global 
$user;
  
  if (
$variables['element']['#href'] == 'user') {
    
$variables['element']['#title'] = $user->name;
  }
}
?>
Аватар пользователя bumble bumble 10 апреля 2018 в 20:32
  1. Удалить предыдущие вариации функций (альтеров).
  2. Поместить код приведенный в примере в файл templates.php текущей темы оформления.
  3. Заменить THEME на машинное имя текущей темы оформления.
  4. Сбросить все кеши.
Аватар пользователя Ilya_ Ilya_ 10 апреля 2018 в 21:04

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

п.с. для теста удалил форматы ввода в template.php. Значит файл читается темой.

результат тотже

Аватар пользователя bumble bumble 11 апреля 2018 в 16:39
2

Ок. На тесте, реализовал следующим образом:

<?php
/**
 * Implements hook_menu_alter().
 */
function MYMODULE_menu_alter(&$items) {
    
$items['user']['title callback'] = 'MYMODULE_user_menu_title';
}
 
/**
 * Rewrite menu item title callback for the 'user' path.
 *
 * Anonymous users should see "User account", but authenticated users are
 * expected to see them name.
 */
function MYMODULE_user_menu_title() {
    return 
user_is_logged_in() ? $GLOBALS['user']->name t('User account');
}
?>

Replace user menu link title