Aveți idee cum aș putea să-mi folosesc propriul fișier modul personalizat twig pentru a-mi tema masa?
Folosesc drupal/examples -> content_entity_example ca punct de plecare:
în content_entity_example.module implementând hook_theme, aș dori să returnez toate câmpurile precum:
/**
 * @fișier
 * Conține Drupal\content_entity_example\content_entity_example.module.
 */
/**
 * @defgroup content_entity_example Exemplu: Entitate de conținut
 * Exemple @ingroup
 * @{
 * Implementați o entitate de conținut.
 *
 * Acest modul demonstrează implementarea unei entități de conținut.
 *
 * Entity API este API-ul care stochează bucăți de conținut și configurație pentru
 * Miez Drupal. De exemplu, dacă ați întâlnit tipuri de conținut de noduri, ați făcut
 * au întâlnit entități de tip „nod”.
 *
 * Acest exemplu implementează API-ul Entity, astfel încât să avem un tip de entitate utilizabil
 * de către utilizator pe care l-ați putea considera noduri specializate, dar care sunt
 * diferit de noduri. Aceste entități se numesc Contact și sunt cunoscute
 * intern prin numele mașinii content_entity_example_contact.
 *
 * Contactul este o entitate de conținut care poate fi folosită pentru a deține informații structurate
 * fără costul general de utilizare a unui tip de conținut de nod. „Fieldable” înseamnă că poți
 * atașați câmpuri la el, așa cum puteți cu nodurile. Este definită programatic
 * (complet în cod). Vom arăta principalele tehnici de manipulat și expus
 * conținutul acestui tip de entitate.
 *
 * Entitatea de contact va demonstra principalele sarcini pentru o entitate:
 * - defini
 * - salva
 * - sarcină
 * - vedere
 * - Editați | ×
 * - șterge
 * - controlează accesul
 *
 * Ori de câte ori este posibil, folosim instrumentele uimitoare încorporate în D8 în mod nativ.
 *
 * @vedeți Drupal\content_entity_example\Entity\Contact
 * @see config_entity_example
 *}
 */
/**
 * Implementează hook_theme(). Înregistrați un modul sau implementările temei unei teme.
 */
funcția content_entity_example_theme() {
  întoarcere [
    'content_entity_example_table' => [
      'variabile' => [
        'header' => NULL,
        'rows' => NULL,
        'footer' => NULL,
        'atribute' => [],
        'caption' => NULL,
        'colgroups' => [],
        „lipicios” => FALSE,
        'responsive' => TRUE,
        'empty' => ''
      ],
    ],
  ];
}
Și în src/Entity/Controller/ContactListBuilder.php aș dori să-mi iau șablonul ('#template'...)
Așa că aș dori să-i spun lui render() utilizatorului șablonul meu
  /**
   * {@inheritdoc}
   *
   * Overscriem ::render() astfel încât să putem adăuga propriul nostru conținut deasupra tabelului.
   * parent::render() este locul unde EntityListBuilder creează tabelul folosind nostru
   * Implementări buildHeader() și buildRow().
   */
  funcția publică render() {
    $build['descriere'] = [
      '#markup' => $this->t('Exemplu de entitate de conținut implementează un model de persoane de contact. Aceste persoane de contact sunt entități care pot fi câmpate. Puteți gestiona câmpurile de pe <a href="@adminlink">pagina de administrare Contacte</a> .', [
        '@adminlink' => $this->urlGenerator->generateFromRoute('content_entity_example.contact_settings'),
      ]),
    ];
    $build['table'] = parent::render();
// TODO adăugați referință la șablon
    returnează $build;
  }
și, ca atare, utilizați fișierul meu șablon în /templates/content-entity-example.html.twig
care urmează să fie schimbat într-o fază ulterioară. (trebuie doar să-l încarc)
{#
/**
 * @fișier
 * Suprascrierea temei pentru a afișa un tabel.
 *
 * Variabile disponibile:
 * - atribute: atribute HTML de aplicat etichetei <table>.
 * - legenda: un șir localizat pentru eticheta <caption>.
 * - colgroups: Grupuri de coloane. Fiecare grup conține următoarele proprietăți:
 * - atribute: atribute HTML de aplicat etichetei <col>.
 * Notă: Drupal acceptă în prezent doar un singur rând de antet de tabel, vezi
 * https://www.drupal.org/node/893530 și
 * http://api.drupal.org/api/drupal/includes!theme.inc/function/theme_table/7#comment-5109.
 * - antet: celule antet tabel. Fiecare celulă conține următoarele proprietăți:
 * - tag: Numele etichetei HTML de utilizat; fie „th”, fie „td”.
 * - atribute: atribute HTML de aplicat etichetei.
 * - conținut: un șir localizat pentru titlul coloanei.
 * - câmp: Nume câmp (obligatoriu pentru sortarea coloanelor).
 * - sort: Ordine de sortare implicită pentru această coloană ("asc" sau "desc").
 * - sticky: un steag care indică dacă trebuie utilizat un antet de tabel „lipicios”.
 * - rânduri: rânduri de tabel. Fiecare rând conține următoarele proprietăți:
 * - atribute: atribute HTML de aplicat etichetei <tr>.
 * - date: celule de tabel.
 * - no_striping: Un steag care indică faptul că rândul ar trebui să primească nr
 * stil „par / impar”. Setarea implicită este FALSE.
 * - celule: celule de tabel ale rândului. Fiecare celulă conține următoarele chei:
 * - tag: Numele etichetei HTML de utilizat; fie „th”, fie „td”.
 * - atribute: orice atribute HTML, cum ar fi „colspan”, care se aplică
 * celula tabelului.
 * - conținut: șirul de afișat în celula tabelului.
 * - active_table_sort: Un boolean care indică dacă celula este activă
         sortare de masă.
 * - footer: rânduri de subsol de tabel, în același format ca variabila rânduri.
 * - gol: mesajul de afișat pe un rând suplimentar dacă tabelul nu are
 * orice rând.
 * - no_striping: Un boolean care indică faptul că rândul nu trebuie să primească striping.
 * - header_columns: numărul de coloane din antet.
 *
 * @vedeți template_preprocess_table()
 */
#}
<tabel{{ atribute }}>
  {% if legenda %}
    <caption>{{ caption }}</caption>
  {% endif %}
  {% pentru colgroup în colgroups %}
    {% if colgroup.cols %}
      <colgroup{{ colgroup.attributes }}>
        {% pentru col în colgroup.cols %}
          <col{{ col.atribute }} />
        {% endfor %}
      </colgroup>
    {% altfel %}
      <colgroup{{ colgroup.attributes }} />
    {% endif %}
  {% endfor %}
  {% if header %}
    <cap>
    <tr>
      {% pentru celula din antetul %}
      {%
        setați clase_celule = [
        cell.active_table_sort ? 'este activ',
      ]
      %}
      <{{ cell.tag }}{{ cell.attributes.addClass(cell_classes) }}>
      {{- cell.content -}}
    </{{ cell.tag }}>
    {% endfor %}
    </tr>
    </thead>
  {% endif %}
  {% dacă rândurile %}
    <tbody>
    {% pentru rând în rânduri %}
      {%
        setați row_classes = [
        nu no_striping? cycle(['impar', 'par'], buclă.index0),
      ]
      %}
    <tr{{ row.attributes.addClass(row_classes) }}>
      {% pentru celula din row.cells %}
        <{{ cell.tag }}{{ cell.attributes }}>
        {{- cell.content -}}
        </{{ cell.tag }}>
      {% endfor %}
      </tr>
    {% endfor %}
    </tbody>
  {% elseif gol %}
    <tbody>
    <tr class="odd">
      <td colspan="{{ header_columns }}" class="empty message">{{ empty }}</td>
    </tr>
    </tbody>
  {% endif %}
  {% if footer %}
    <tfoot>
    {% pentru rândul din subsol %}
    <tr{{ row.attributes }}>
      {% pentru celula din row.cells %}
        <{{ cell.tag }}{{ cell.attributes }}>
        {{- cell.content -}}
        </{{ cell.tag }}>
      {% endfor %}
      </tr>
    {% endfor %}
    </tfoot>
  {% endif %}
</tabel>
content_entity_example funcționează grozav, dar nu îmi pot încărca propriul șablon.