it-swarm.com.de

Fügen Sie dem Render-Array Attribute hinzu

Ich versuche, einem Render-Array einige Attribute hinzuzufügen. In Drupal 7) können wir dies tun, indem wir eine Eigenschaft in einem Array wie dem folgenden hinzufügen.

$items[] = array('data' => $item_data, 'id' => 'someId'); // attribute = 'id'
$variables['subpanels'] = theme('item_list', array('items' => $items, 'title' => NULL, 'type' => 'ul'));

In Drupal 8 gibt es kein #attributes Eigenschaft dokumentiert in Render Arrays in Drupal 8 . Wie kann ich diese ID hinzufügen als Attribut in einem Render-Array mit Drupal 8?

Dies ist der Code, den ich bisher verwende.

mymoduleController.php

public static function _mymodule_f1($users_online) {
  $user = \Drupal::currentUser();

  $render_array_1 = array();
  $render_array_1['name'] = 'test-name';
  $render_array_1['header'] = t('test-header');
  $render_array_1['contents'] = array('#value' => '<div class="test_options">' . '<a class="test_loading" href="#"></a>'. '</div>');

  $items = array();
  foreach ($users_online as $key => $value) {
    if ($key != 'total') {
      $items[] = array('#value' => '<a class="' . $key . '" href="#">' .   $value['name'] . '</a>', 'class' => array('status-' . $value['status']));
    }
  }
  //print_r($items);
  if ($items) {
    $item_list = array(
      '#theme' => 'item_list',
      '#items' => $items,
    );
    $render_array_1['footer'] = $item_list;
  }
  $render_array_1['text'] = array('#value' => t('T1') . ' (<span class="online-count">' . count($items) . '</span>)');
  $image = [
   '#theme' => 'image',
   '#uri' => drupal_get_path('module', 'mymodule') . '/css/themes/images/loading.gif',
   '#width' => NULL,
   '#height' => NULL,
   '#class' => 'icon'
  ];

  $render_array_1['icon'] = $image;
  $mymodule_subpanel = array(
    '#theme' => 'mymodule_subpanel',
    '#subpanel' => $render_array_1
  );
  return $mymodule_subpanel;
}

mymodule.module

function mymodule_theme() {
  return array(
    'mymodule' => array(
      'variables' => array('mymodule' => NULL),
      'template' => 'mymodule',
    ),
   'mymodule_subpanel' => array(
     'variables' => array('subpanel' => NULL),
     'template' => 'mymodule-subpanel',
   ),
 );
}

function mymodule_preprocess_mymodule(&$variables) {
  $items = array();
  $users_online = mymoduleController::f2();
  $render_items = mymoduleController::_mymodule_f1($users_online);
  $render_items['#attributes'] = array('id' => 'some_id'); //not working; unable to add id='some_id' in the <li> tag.
  //print_r($render_items);

  $items[] = $render_items;
  //print_r($items);

  $item_list = array(
    '#theme' => 'item_list',
    '#items' => $items, // array of render arrays.
    '#title' => NULL,
    '#list_type' => 'ul',
    '#attributes' => array('id' => 'mainpanel')
  );
  $variables['subpanels'] = $item_list;
}
3
raghav

Render-Arrays können Render-Elemente oder Design-Vorlagen enthalten.

Beispiel für ein Renderelement:

'#type' => 'link'

und eine Themenvorlage:

'#theme' => 'item_list'

Renderelemente haben den Parameter #attributes. Dies wird in der Basisklasse Drupal\Core\Render\Element\RenderElement Definiert, von der aus alle Render- und Formularelemente erweitert werden.

Dies ist bei Vorlagen im Allgemeinen nicht der Fall.

Die Vorlage links hat zum Beispiel #attributes Und behandelt dies in template_preprocess_links() in /core/includes/theme.inc.

Das Beispiel aus der Frage ist item-list. Diese Vorlage hat eine Variable #wrapper_attributes. In der ersten Zeile der Vorverarbeitungsfunktion können Sie sehen, wie wrapper-attributes In ein Attributobjekt transformiert wird, das dann an die Vorlage twig $) weitergeleitet wird, wo es in der Liste platziert wird Verpackung:

/**
 * Prepares variables for item list templates.
 *
 * Default template: item-list.html.twig.
 *
 * @param array $variables
 *   An associative array containing:
 *   - items: An array of items to be displayed in the list. Each item can be
 *     either a string or a render array. If #type, #theme, or #markup
 *     properties are not specified for child render arrays, they will be
 *     inherited from the parent list, allowing callers to specify larger
 *     nested lists without having to explicitly specify and repeat the
 *     render properties for all nested child lists.
 *   - title: A title to be prepended to the list.
 *   - list_type: The type of list to return (e.g. "ul", "ol").
 *   - wrapper_attributes: HTML attributes to be applied to the list wrapper.
 *
 * @see https://www.drupal.org/node/1842756
 */
function template_preprocess_item_list(&$variables) {
  $variables['wrapper_attributes'] = new Attribute($variables['wrapper_attributes']);
    foreach ($variables['items'] as &$item) {
    $attributes = array();
    // If the item value is an array, then it is a render array.
    if (is_array($item)) {
      // List items support attributes via the '#wrapper_attributes' property.
      if (isset($item['#wrapper_attributes'])) {
        $attributes = $item['#wrapper_attributes'];
      }

Die Vorlage item_list Hat auch die Variable attributes, die an die Vorlage twig] übergeben wird. Hier können Sie sehen, wie dies alles im HTML-Markup endet , einschließlich der Attribute der Elemente, die für jedes Element aus Wrapper-Attributen im Vorprozess gesammelt werden:

item-list.html.twig

{#
/**
 * @file
 * Theme override for an item list.
 *
 * Available variables:
 * - items: A list of items. Each item contains:
 *   - attributes: HTML attributes to be applied to each list item.
 *   - value: The content of the list element.
 * - title: The title of the list.
 * - list_type: The tag for list element ("ul" or "ol").
 * - wrapper_attributes: HTML attributes to be applied to the list wrapper.
 * - attributes: HTML attributes to be applied to the list.
 * - empty: A message to display when there are no items. Allowed value is a
 *   string or render array.
 * - context: A list of contextual data associated with the list. May contain:
 *   - list_style: The custom list style.
 *
 * @see template_preprocess_item_list()
 */
#}
{% if context.list_style %}
  {%- set wrapper_attributes = wrapper_attributes.addClass('item-list--' ~ context.list_style) %}
  {%- set attributes = attributes.addClass('item-list__' ~ context.list_style) %}
{% endif %}
{% if items or empty -%}
  <div{{ wrapper_attributes.addClass('item-list') }}>
    {%- if title is not empty -%}
      <h3>{{ title }}</h3>
    {%- endif -%}
    {%- if items -%}
      <{{ list_type }}{{ attributes }}>
        {%- for item in items -%}
          <li{{ item.attributes }}>{{ item.value }}</li>
        {%- endfor -%}
      </{{ list_type }}>
    {%- else -%}
      {{- empty -}}
    {%- endif -%}
  </div>
{%- endif %}

Übrigens. Der Wrapper wird nur im klassischen Thema platziert, das Basisthema verwendet dies nicht.

Fazit :

Vorlagen haben standardmäßig keine Attribute. Wie die Beispiele zeigen, können sie wie Renderelemente unter einem anderen Variablennamen oder gar nicht behandelt werden.

5
4k4