Отображать роли в профиле?

Я пытаюсь показать роли в профиле пользователя по умолчанию (без профиля2) с последовательным форматированием на другие отображаемые поля.

В 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>

Что дает мне этот результат (который близок):

 введите описание изображения здесь>> </a> </p>

<p> Проблема заключается в том, что он не использует <code>---- +: = 2 =: + ----</code> для отображения поля. </p>

<p> Я получаю эти ошибки, которые указывают, что я делаю что-то неправильно: </p>

<blockquote>
  <p> Примечание. Неопределенный индекс: #items в template_preprocess_field () (строка 1060 из /path/to/site/modules/field/field.module). </p>
  
  <p> Предупреждение: неверный аргумент, предоставленный foreach () в template_preprocess_field () (строка 1060 из /path/to/site/modules/field/field.module). </p>
  
  <p> Примечание. Неопределенный индекс: #view_mode в zurb_foundation_preprocess_field () (строка 311 из /path/to/site/sites/all/themes/zurb_foundation/template.php). </p>
</blockquote>

<p> Я также использую <a href= шаблон Drupal Foundation (v7.5) , который, как представляется, относятся к вышеуказанным ошибкам.

4 голоса | спросил Samsquanch 29 ThuEurope/Moscow2016-12-29T19:23:09+03:00Europe/Moscow12bEurope/MoscowThu, 29 Dec 2016 19:23:09 +0300 2016, 19:23:09

2 ответа


6

Обновленный ответ

Прокручивая библиотеку модулей Drupal.org, я обнаружил Роль разоблачить . Я никогда не использовал его, но он, похоже, тоже делает трюк:

  

Роль 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() . (Если вы планируете поддерживать только одну тему, вы также можете поместить ее в файл 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, и больше нет необходимости переопределять файл шаблона.

Если вы хотите использовать item_list, как , предложенный Yogesh , ваш массив рендеринга в 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'),
    );
ответил Neograph734 7 Jam1000000amSat, 07 Jan 2017 01:18:45 +030017 2017, 01:18:45
3

Вы можете использовать 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>
ответил Yogesh 6 Jam1000000amFri, 06 Jan 2017 08:21:28 +030017 2017, 08:21:28

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132