web-dev-qa-db-fra.com

hook_page_alter pour changer le titre sur la page de profil utilisateur?

En ce moment, j'ai la fonction suivante implémentée dans 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']);
    }
  }
}

Est-ce la meilleure façon de définir le titre sur une page utilisateur? Ou devrais-je le faire via un autre crochet?

MODIFIER : J'ai mis à jour mon template.php utiliser hook_preprocess_user_profile à la place, et j'ai ceci:

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

Le titre de la page change (comme celui que le navigateur vous montre sur un onglet), mais le profil utilisateur Drupal le titre de la page reste le nom d'utilisateur. Très ennuyeux. Fonctionne toujours ...

EDIT 2: J'ai exécuté une expérience. J'ai fait ce qui suit:

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

Ce qui a donné la sortie suivante lors de la visualisation d'une page de profil utilisateur:

  • search_block_form
  • bloquer
  • région
  • bloquer
  • région
  • profil de l'utilisateur
  • user_profile_item
  • user_profile_category
  • bloquer
  • région
  • html
  • région
  • user_picture
  • page

C'est donc l'ordre dans lequel les hooks de prétraitement sont appelés sur cette page. J'ai ensuite créé deux fonctions:

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

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

J'ai d'abord chargé la page avec le ccom_preprocess_page fonction mise en commentaire. Le titre dans l'onglet du navigateur est devenu mytitle , mais le titre de la page est resté le nom d'utilisateur de la page de profil utilisateur affichée .

J'ai ensuite commenté ccom_preprocess_user_profile et sans commentaires ccom_preprocess_page et a rechargé la page à nouveau. Le titre de l'onglet du navigateur ( et le titre de la page est devenu mytitle .

Cela m'indique que quelque part après la fonction de hook de prétraitement user_profile et jusqu'à et y compris le hook de prétraitement de page, le titre de la page est réinitialisé. Là où c'est, je ne suis pas tout à fait sûr.

Donc, ma réflexion à ce stade serait de créer une variable globale et de la définir égale à l'objet de compte d'utilisateur disponible dans le hook user_profile, puis dans le hook de prétraitement de la page, définissez simplement le titre en fonction du champ de nom complet disponible dans le compte objet. Pensées?

6
Lester Peabody

Cela a finalement fonctionné pour moi; c'est essentiellement ce qui a été publié sur http://drupal.org/node/1262070#comment-5038516 , mais avec une fonction renommant et généralisant:

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

et alors

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

Mais allez. C'est bien que les crochets soient là, mais faire quelque chose comme définir le titre d'une page VRAIMENT ne devrait pas être aussi difficile/obscur ...

9
Jim Miller

Je sais que cela a déjà été répondu. Cependant, en supposant que vous vouliez changer le titre en un nom réel, il aurait été plus facile d'utiliser le module RealName. Vous auriez également pu le faire, ce qui, je pense, est beaucoup plus facile que la solution acceptée:

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

Vous pourriez probablement même envelopper $ account dans entity_metadata_wrapper () et utiliser value () au lieu de tourner autour du tableau.

1
filmoreha

Ce n'est pas testé, mais il semble que hook_user_view est la bonne façon de procéder, la mise en garde étant que vous ne pouvez pas mettre cela dans votre thème, mais dans un module personnalisé.

function mymodule_user_view($account, $view_mode, $langcode) {
  if ($account->uid == 1 && $view_mode == 'full') {
     drupal_set_title('my custom title');
  }
}
0
JamesWilson

il est plus logique pour moi de le faire avec ceci: http://api.drupal.org/api/drupal/includes%21theme.inc/function/template_preprocess_html/7

mais vraiment, tout ce qui fait flotter votre bateau;)

0
jdu