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 страницы просто установить заголовок на основе полного поля имени в объекте учетной записи. Мысли?
3 ответа
Это, наконец, помогло мне; это, по сути, то, что было опубликовано на 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;
}
Но, давай. Приятно, что крючки есть, но делать что-то вроде установки названия страницы. ДЕЙСТВИТЕЛЬНО не должно быть так сложно /неясно ...
Я знаю, что это уже ответили. Однако, предполагая, что вы хотите изменить название на фактическое имя, было бы проще использовать модуль 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 () и использовать значение () вместо того, чтобы прикручивать массив.
Это не проверено, но кажется, что hook_user_view - это правильный путь, Предостережение: вы не можете помещать это в свою тему, но в пользовательский модуль.
function mymodule_user_view($account, $view_mode, $langcode) {
if ($account->uid == 1 && $view_mode == 'full') {
drupal_set_title('my custom title');
}
}