web-dev-qa-db-ja.com

プロファイルに役割を表示しますか?

表示されている他のフィールドに一貫したフォーマットで、デフォルトのユーザープロファイル(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>

これは私にこの出力を与えています(これは近いです):

enter image description here

問題は、フィールドの表示に#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) も使用していますが、これは上記のエラーに関連しているようです。

4
Samsquanch

回答を更新しました

Drupal.orgモジュールライブラリをスクロールすると、 Role exposed が見つかりました。私はそれを使ったことがありませんが、トリックも行うようです:

Role Expose -moduleを使用すると、サイト管理者はユーザーに自分のユーザーロールを公開できます。役割はユーザープロファイルページに表示されます。ユーザーには、自分の役割またはすべてのユーザーの役割を表示するオプションが付与されます。

Role expose

元の答え

レンダーアレイを見ると、少し誤解されているように感じます(ユーザーオブジェクトにフィールドを構成し、その役割のすべての文字列を既に配置している場合を除いて、ここではロジックは必要ありません)...

_$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'),
    );
_
6
Neograph734

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>
2
Yogesh