Puncte:0

Using dynamic templates in custom module

drapel ro

I have created a custom Drupal 9 module, and I would like for this module to use different template files basing on a variable. I have looked at hook_theme() and I think the pattern return value might be what I am looking for, but I can't seem to make it work.

testpage.module

function testpage_theme() {
  return array(
    'testpage' => array(
      'template' => 'testpage',
      'variables' => array('items' => array(), 'title' => NULL),
      'pattern' => 'testpage__'
    )
  );
}  

### Controller file (Testpage.php)

```php
namespace Drupal\testpage\Controller;
use Drupal\Core\Controller\ControllerBase;
use Symfony\Component\HttpFoundation\Response;

class Testpage extends ControllerBase {

  public function Render($name) {
    $result = "Lorem ipsum";
    $build = array(
      '#theme' => array('testpage__'.$name, 'testpage'),
      '#items' => $result,
      '#title' => 'Testpage',
      '#cache' => [
        'max-age' => 0
      ]
    );

    return($build);
  }
}

I created three template files in a "templates" folder.

  • testpage.html.twig
  • testpage--test.html.twig
  • testpage--test2.html.twig

Basing on $name, it should use the matching template file. However, it is always just using the markup from the testpage.html.twig. When $name is equal to "test", it should use the testpage--test.html.twig file; when $name is equal to "test2", it should use the testpage--test2.html.twig file. And it would be great if it would use the testpage.html.twig file as a fallback if a matching template does not exist. I thought this was possible with the pattern return value, but I can't seem to get it to work correctly. Am I missing something, or is this not possible?

john Smith avatar
drapel gr
un lucru pe care l-ați putea face cu siguranță este să transmiteți `$name` șablonului și în șablon să folosiți sth. precum `{{ include('template-' ~ name ~ '.html.twig') }}`
neessen avatar
drapel ro
Da, m-am gândit și la acea soluție, dar asta ar necesita ca fișierul să existe. Desigur, aș putea verifica în controler dacă fișierul twig există și să transmit acele informații matricei de randare și să folosesc acea logică în șablonul twig.
drapel ru
AFAIK `pattern` [nu mai există](https://www.drupal.org/project/drupal/issues/2063793) și este doar un rămas în documente. În schimb, utilizați [hook_theme_suggetions_alter](https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%21theme.api.php/function/hook_theme_suggestions_alter/8.8.x)

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.