hook_page_alter, чтобы изменить заголовок на странице профиля пользователя?

Сейчас у меня есть следующая функция, реализованная в template.php:

function ccom_page_alter(&$page) {
  if (array_key_exists('#account',$page['content']['system_main'])) {
    $account = $page['content']['system_main']['#account'];

    if (isset($account)) {
      drupal_set_title($account->field_complete_name['und'][0]['safe_value']);
    }
  }
}

Это лучший способ установить заголовок на странице пользователя? Или я должен делать это с помощью другого крючка?

EDIT : я обновил свой template.php, чтобы использовать hook_preprocess_user_profile, и у меня есть это:

function ccom_preprocess_user_profile(&$variables) {
  drupal_set_title($variables['elements']['#account']->field_complete_name[LANGUAGE_NONE][0]['safe_value']);
}

Изменяется название страницы (например, тот, который отображается в браузере на вкладке), но имя пользователя Drupal для профиля пользователя остается именем пользователя. Очень надоедливый. Все еще работает ...

EDIT 2 . Я провел эксперимент. Я сделал следующее:

function ccom_preprocess(&$variables, $hook) {
  dpm($hook);
}

Который дал следующий вывод при просмотре страницы профиля пользователя:

  • search_block_form
  • блок литий>
  • область
  • блок литий>
  • область
  • user_profile
  • user_profile_item
  • user_profile_category
  • блок литий>
  • область
  • HTML
  • область
  • user_picture
  • страница

Итак, это порядок, в котором на этой странице вызывается предварительный захват. Затем я создал две функции:

function ccom_preprocess_user_profile(&$variables) {
  dpm($variables);
  drupal_set_title('mytitle');
}

function ccom_preprocess_page(&$variables) {
  dpm($variables);
  drupal_set_title('mytitle');
}

Сначала я загрузил страницу с помощью функции ccom_preprocess_page. Заголовок на вкладке браузера изменился на mytitle , но заголовок страницы остался как имя пользователя для просматриваемой страницы профиля пользователя.

Затем я прокомментировал ccom_preprocess_user_profile и uncommented ccom_preprocess_page и снова загрузите страницу. Заголовок заголовка браузера и изменился на mytitle .

Это говорит мне, что где-то после того, как функция препроцесса user_profile и до и вплоть до крючка препроцесса страницы, заголовок страницы сбрасывается. Где это я, я не совсем уверен.

Итак, я подумал, что в этот момент было бы создать глобальную переменную и установить ее равной объекту учетной записи пользователя, доступному в hook_profile, а затем в обработчике preprocess страницы просто установить заголовок на основе полного поля имени в объекте учетной записи. Мысли?

6 голосов | спросил Lester Peabody 1 PM000000110000004931 2012, 23:58:49

3 ответа


9

Это, наконец, помогло мне; это, по сути, то, что было опубликовано на http://drupal.org/node/1262070#comment-5038516 , но с некоторые функции переименования и обобщения:

function YOUR_MODULE_menu_alter(&$items) {
    // Change the title of user profile pages to the user's name.  Gak.
    $items['user/%user']['title callback'] = 'YOUR_MODULE_user_page_title';
}

, а затем

function YOUR_MODULE_user_page_title() {
    if (arg(0) == 'user') {
        // Load uid from url
        $user = user_load(arg(1));
        // Get the full user name somehow; here, I'm calling a function of my own.
        $output = get_user_full_name($user);
    }
    // Fallback to username if no fields are present
    if (empty($output)) {
        $output = $user->name;
    }
    return $output;
}

Но, давай. Приятно, что крючки есть, но делать что-то вроде установки названия страницы. ДЕЙСТВИТЕЛЬНО не должно быть так сложно /неясно ...

ответил Jim Miller 8 +04002012-10-08T21:38:30+04:00312012bEurope/MoscowMon, 08 Oct 2012 21:38:30 +0400 2012, 21:38:30
1

Я знаю, что это уже ответили. Однако, предполагая, что вы хотите изменить название на фактическое имя, было бы проще использовать модуль RealName. Вы могли бы также сделать это, что, я думаю, намного проще, чем принятое решение:

function hook_username_alter(&$name, $account) {
  if (arg(0) == 'user' && is_numeric(arg(1))) {
    if (isset($account->uid)) {
      $name = $account->your_field_name['und'][0]['safe_value'];
    }
  }
}

Возможно, вы даже могли бы переносить $ account в entity_metadata_wrapper () и использовать значение () вместо того, чтобы прикручивать массив.

ответил filmoreha 25 PMpThu, 25 Apr 2013 12:45:11 +040045Thursday 2013, 12:45:11
0

Это не проверено, но кажется, что hook_user_view - это правильный путь, Предостережение: вы не можете помещать это в свою тему, но в пользовательский модуль.

function mymodule_user_view($account, $view_mode, $langcode) {
  if ($account->uid == 1 && $view_mode == 'full') {
     drupal_set_title('my custom title');
  }
}
ответил JamesWilson 28 52014vEurope/Moscow11bEurope/MoscowFri, 28 Nov 2014 06:50:30 +0300 2014, 06:50:30

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132