概念
- Elements
在drupal中,页面的各个部分被组织微elements。这些elements通常包括其他elements。
比如:links, buttons, fields, images, nodes, blocks, pages都是elements。 Render arrays
用来存储关于elements信息的php概念叫做Render arrays.
Render arrays包括以下三种类型- #markup
- #theme
- #type
Twig templates
Twig templates是将Render Arrays转换成markup的文件。
render pipeline
Overview of the available patterns
Render arrays #theme 方式创建模板
在hook_theme中注册模板
1234# for #theme'my_template' => ['variables' => ['test_var' => NULL],],在controller中调用模板
12'#theme' => 'my_template','#test_var' => $this->t('Test Value'),渲染步骤1中注册的模板
templates/my-template.html.twig123<p>Test twig template!</p><p>test_var: {{ test_var }}</p>
Render arrays #type 方式创建模板
在hook_theme中注册模板
1234# for #type'my_element' => ['render element' => 'element',],在controller中调用模板
12'#type' => 'my_element','#label' => $this->t('Example Label'),调用RenderElement子类模板逻辑
src/element/MyElement.php12345678class MyElement extends RenderElement {# 定义element结构public function getInfo() {}# 设定element值public static function preRenderMyElement($element) {}}渲染步骤1中注册的模板
templates/my-element.html.twig12345<div class="myElement"><div class="randomNumber">Random Number: {{ element['#random_number'] }}</div><p>{{ element.description }}</p>{{ element.link }}</div>
修改Render arrays的值
-
123function test_twig_preprocess_my_template(&$variables) {$variables['test_var'] = 'Test Value changed by hook_preprocess_HOOK';}
修改block Render arrayhook_block_view_alter 和 修改entity Render arrayhook_entity_view_alter
刚构建完Render arrays时修改12345function test_block_view_alter(array &$build, \Drupal\Core\Block\BlockPluginInterface $block) {if ($build['#plugin_id'] == 'system_menu_block:menu-title-link') {$build['#configuration']['label'] = '<a href="/test5">xxxx</a>';}}
参考资料
Creating Elements, Theming Elements, and Managing Front-end Libraries
Create custom twig templates from custom module