表示されている他のフィールドに一貫したフォーマットで、デフォルトのユーザープロファイル(profile2なし)にロールを表示しようとしています。
user-profile.tpl.php
にはこれがあります:
<div class="profile"<?php print $attributes; ?>>
<?php
// var_dump($user_profile); exit;
$account = user_load(arg(1));
$roles = '';
foreach ($account->roles as $rid => $role) {
$roles .= "<li>".$role."</li>";
}
if (count($roles) > 0) {
$user_profile['field_user_roles'] = array(
'#entity_type' => 'custom',
'#bundle' => 'custom',
'#theme' => 'field',
'#field_type' => 'text',
'#title' => 'Roles',
'#label_display' => 'above',
'#field_name' => 'field_user_roles',
'#markup' => '<ul>' . $roles . '</ul>',
'#weight' => 5,
);
}
?>
<?php print render($user_profile); ?>
</div>
これは私にこの出力を与えています(これは近いです):
問題は、フィールドの表示に#markup
を使用していないようです。
私は何か間違っていることを示すこれらのエラーを受け取っています:
通知:未定義のインデックス:#items in template_preprocess_field()(/path/to/site/modules/field/field.moduleの行1060)。
警告:template_preprocess_field()のforeach()に無効な引数が指定されています(/path/to/site/modules/field/field.moduleの行1060)。
通知:未定義のインデックス:#view_mode in zurb_foundation_preprocess_field()(/path/to/site/sites/all/themes/zurb_foundation/template.phpの311行目)。
私は Foundation Drupalテンプレート(v7.5) も使用していますが、これは上記のエラーに関連しているようです。
回答を更新しました
Drupal.orgモジュールライブラリをスクロールすると、 Role exposed が見つかりました。私はそれを使ったことがありませんが、トリックも行うようです:
Role Expose -moduleを使用すると、サイト管理者はユーザーに自分のユーザーロールを公開できます。役割はユーザープロファイルページに表示されます。ユーザーには、自分の役割またはすべてのユーザーの役割を表示するオプションが付与されます。
元の答え
レンダーアレイを見ると、少し誤解されているように感じます(ユーザーオブジェクトにフィールドを構成し、その役割のすべての文字列を既に配置している場合を除いて、ここではロジックは必要ありません)...
_$user_profile['field_user_roles'] = array(
'#entity_type' => 'custom', // Nope, it is 'user'.
'#bundle' => 'custom', // Nope, it is 'user'.
'#theme' => 'field', // Probably it is not a field, but a custom render element containing markup.
'#field_type' => 'text', // Probably not since it probably wasn't a field.
'#title' => 'Roles',
'#label_display' => 'above',
'#field_name' => 'field_user_roles', // Probably not since it probably wasn't a field.
'#markup' => '<ul>' . $roles . '</ul>',
'#weight' => 5,
);
_
一部のデータを削除した方がうまくいくと思います(下記参照)。
小さな注意点として、テンプレートファイル内ではロジックをできるだけ回避する必要があります。そのため、小さなカスタムモジュールを作成して、 hook_user_view_alter()
を実装することをお勧めします。 (1つのテーマのみをサポートする場合は、テーマの_template.php
_ファイルに配置することもできます。モジュール名としてテーマ名を使用します。)
_function MODULENAME_user_view_alter(&$build) {
// Obtain the account that user_view() stored for us.
$account = $build['#account'];
// Prepare roles string.
$roles = '';
foreach ($account->roles as $rid => $role) {
$roles .= "<li>".$role."</li>";
}
if (count($roles) > 0) {
$build['modulename_user_roles'] = array( // Prefix with module name to prevent collisions.
'#type' => 'item',
'#title' => 'Roles',
'#markup' => '<ul>' . $roles . '</ul>',
'#attributes' => array('class' => 'class-one class-two'),
);
}
}
_
さらに hook_field_extra_fields()
を実装して_example.com/admin/config/people/accounts/display
_のプロパティを公開し、管理インターフェイス内でその重みを選択できます。
_function MODULENAME_field_extra_fields() {
$extra['user']['user'] = array(
'display' => array(
'modulename_user_roles' => array( // Make sure the name matches your custom property
'label' => t('User roles'),
'description' => t("Lists the user's roles."),
'weight' => 5,
),
)
);
return $extra;
}
_
組み合わせると、プロパティは_$user_profile
_配列に追加されているはずであり、テンプレートファイルをオーバーライドする必要はありません。
Yogeshによって提案された のようにitem_listを使用する場合、MODULENAME_user_view_alter()
のレンダー配列は次のようになります。
_ $build['modulename_user_roles'] = array(
'#title' => 'Roles',
'#theme' => 'item_list',
'#items' => $account->roles,
'#type' => 'ul',
'#attributes' => array('class' => 'class-one class-two'),
);
_
theme_item_list 関数を使用してlsit形式で出力できます。以下のサンプルを確認してください:
<div class="profile" <?php print $attributes; ?>>
<?php $account = user_load(arg(1)); ?>
<?php print theme('item_list', array('items' => $account->roles)); ?>
</div>
または、以下のように独自のhtmlを作成することもできます(推奨されません)。
<div class="profile" <?php print $attributes; ?>>
<?php
$account = user_load(arg(1));
// Below code wraps roles in <li> tag.
$roles = '<ul><li>' . implode('</li><li>', $account->roles) . '</li></ul>';
// Below code show roles separated by comma.
// $roles = implode(', ', $account->roles);
print '<ul>' . $roles . '</ul>';
?>
</div>