Qual è la differenza tra gli elementi di rendering container e html_tag?

Sep 28 2020

Qual è la differenza tra gli elementi di rendering di #type html_tag (impostato su div) e il contenitore in Drupal 8?

L'elemento di rendering del contenitore è una versione più semplice di html_tag? È più facile elaborare in anticipo gli elementi del contenitore?

Prendo atto che:

  • storicamente, html_tag era per elementi void nel tag in Drupal 7.x.
  • se l'elemento contenitore è utilizzato come form, aggiunge la classe form-wrapper / js-form-wrapper e un ID HTML se ha #array_parents .

Forse le mie teorie sono corrette (è più facile lasciarlo per ragioni storiche / ragioni di elementi di forma)?

PHP:

  use Drupal\Core\StringTranslation\TranslatableMarkup;

  $variables['myhtml_tag'] = [ '#type' => 'html_tag', '#tag' => 'div', '#attributes' => [ 'class' => 'my-container-class1', ], 'child' => [ '#markup' => new TranslatableMarkup('Some Container text1.'), ], ]; $variables['mycontainer'] = [
    '#type' => 'container',
    '#attributes' => [
      'class' => 'my-container-class2',
    ],
    'child' => [
      '#markup' => new TranslatableMarkup('Some Container text2.'),
    ],
  ];

HTML:

<div class="my-container-class1">Some Container text1.</div>

<div class="my-container-class2">Some Container text2.</div>

Risposte

4 leymannx Sep 28 2020 at 15:49

Ho eseguito "Blame" sul system.module 7.x dopo non aver trovato 'container'la minima idea di nel branch 6.x. Nella sezione "Blame" puoi vedere che Dries stesso ha commesso la patch che ha introdotto $types['container']nel 2010 e che riconduce al seguente numero su drupal.org:

  • # 557272: FAPI: sistema JavaScript States

Il problema che ha introdotto #statesl' API del modulo ! Ora esaminiamo la pagina per "contenitore". Ok, il commento # 36 spiega un bel po 'del motivo per cui è stato introdotto:

Come discusso con kkaefer e tha_sun, abbiamo cambiato il tipo di elemento dell'API Form "wrapper" su "container" per non confonderci troppo con altre cose "wrapper", come "wrapper_callback", "theme_wrappers", ecc. Il tipo "container" ancora usa la classe CSS di "* -wrapper", tuttavia, per abbinarsi al resto degli standard di codifica Drupal.

E nel commit stesso puoi vedere come gli containerelementi sostituiscono già alcuni markupelementi (che markupsono l'impostazione predefinita se #typeomessi) che avevano '#prefix' => '<div>', '#suffix' => '</div>con HTML hardcoded.

Per farla breve: Container è un involucro classico. E più di un elemento di forma . Considerando che html_tagè più un elemento di rendering , tradizionalmente utilizzato per elementi void, spesso nell'HTML <head>. Come inserire meta tag o inserire librerie JavaScript e CSS nei tag script.

4 marcvangend Sep 28 2020 at 16:39

Buona domanda. Per come la vedo io, il contenitore è un modo semplice per avvolgere le cose in un file <div>. Ciò è utile per aggiungere struttura ai form, ma anche molto utile per altre situazioni in cui è necessario creare array di rendering più grandi. Lo uso spesso in questo modo (esempio semplificato) perché rende il tuo codice più chiaro:

$build['wrapper'] = [ '#type' => 'container', '#attributes' => ['class' => ['select-wrapper']], ]; $build['wrapper']['select'] = [
  '#type' => 'select',
  '#title' => $this->t('Select'), '#options' => $options,
  '#empty_option' => $this->t('- Select an option -'),
];

Inoltre, il fatto che un contenitore non richieda impostazioni aggiuntive lo rende adatto e spesso utilizzato nella proprietà #theme_wrappers in questo modo:

$form['description'] = [
  '#markup' => $description,
  '#theme_wrappers' => ['container'],
];

Personalmente, utilizzo il tipo html_tag solo per elementi semplici diversi da un div, ad esempio:

$build['heading'] = [
  '#type' => 'html_tag',
  '#tag' => 'h2',
  '#value' => 'My Title',
];

Spero possa aiutare!

2 4k4 Sep 28 2020 at 13:30

L'elemento contenitore ha più senso in una forma. Può essere organizzato in gruppi, può essere reso opzionale e l'ID, se mancante, viene generato automaticamente.