現在、次の関数が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);
}
ユーザープロファイルページを表示すると、次の出力が得られました。
つまり、そのページでプリプロセスフックが呼び出される順序です。次に、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フックで使用可能なユーザーアカウントオブジェクトに等しく設定し、ページのプリプロセスフックで、アカウントで使用可能な完全な名前フィールドに基づいてタイトルを設定することですオブジェクト。考え?
これでようやくうまくいきました。それは本質的に 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()でラップし、配列をいじる代わりにvalue()を使用することもできます。
これはテストされていませんが、 hook_user_view が適切な方法であるように見えます。これをテーマに追加することはできませんが、カスタムモジュールに追加する必要があることに注意してください。
function mymodule_user_view($account, $view_mode, $langcode) {
if ($account->uid == 1 && $view_mode == 'full') {
drupal_set_title('my custom title');
}
}
これでそれを行うことは私にとってより意味があります: http://api.drupal.org/api/drupal/includes%21theme.inc/function/template_preprocess_html/7
しかし、実際には、あなたのボートを浮かせるものは何でも;)