web-dev-qa-db-ja.com

ユーザープロファイルページのタイトルを変更するための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ページタイトルはユーザー名のままです。非常に煩わしいです。まだ機能しています...

編集2:実験を行いました。私は次のことをしました:

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

ユーザープロファイルページを表示すると、次の出力が得られました。

  • search_block_form
  • ブロック
  • 領域
  • ブロック
  • 領域
  • user_profile
  • user_profile_item
  • user_profile_category
  • ブロック
  • 領域
  • html
  • 領域
  • user_picture
  • ページ

つまり、そのページでプリプロセスフックが呼び出される順序です。次に、2つの関数を作成しました。

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をコメントアウトし、ccom_preprocess_pageのコメントを外して、ページを再読み込みしました。ブラウザータブのタイトルの両方のページタイトルがmytitleに変更されました

これにより、user_profileプリプロセスフック関数の後のどこかで、ページプリプロセスフックまでのページタイトルがリセットされることがわかります。それがどこにあるかは完全にはわかりません。

したがって、この時点での私の考えは、グローバル変数を作成し、それをuser_profileフックで使用可能なユーザーアカウントオブジェクトに等しく設定し、ページのプリプロセスフックで、アカウントで使用可能な完全な名前フィールドに基づいてタイトルを設定することですオブジェクト。考え?

6
Lester Peabody

これでようやくうまくいきました。それは本質的に 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;
}

しかし、さあ。フックが存在するのはいいことですが、ページのタイトルを設定するようなことをするのは、本当に難しい/あいまいなものであってはなりません...

9
Jim Miller

これについてはすでに回答済みです。ただし、タイトルを実際の名前に変更する場合は、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()でラップし、配列をいじる代わりにvalue()を使用することもできます。

1
filmoreha

これはテストされていませんが、 hook_user_view が適切な方法であるように見えます。これをテーマに追加することはできませんが、カスタムモジュールに追加する必要があることに注意してください。

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

これでそれを行うことは私にとってより意味があります: http://api.drupal.org/api/drupal/includes%21theme.inc/function/template_preprocess_html/7

しかし、実際には、あなたのボートを浮かせるものは何でも;)

0
jdu