Рейтинг:0

Using dynamic templates in custom module

флаг 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
флаг gr
одна вещь, которую вы определенно можете сделать, это передать `$ name` шаблону, а в шаблоне использовать sth. например `{{ include('template-' ~ name ~ '.html.twig') }}`
neessen avatar
флаг ro
Да, я тоже думал об этом решении, но для этого потребуется, чтобы файл существовал. Конечно, я мог бы проверить в контроллере, существует ли файл ветки, передать эту информацию в массив рендеринга и использовать эту логику в шаблоне ветки.
флаг ru
AFAIK `pattern` [больше не существует] (https://www.drupal.org/project/drupal/issues/2063793) и является просто остатком в документах. Вместо этого используйте [hook_theme_suggestions_alter](https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%21theme.api.php/function/hook_theme_suggestions_alter/8.8.x)

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.