模板
SonataAdminBundle
附带了大量的 twig
文件,用于显示每个 Admin
操作页面的不同部分。如果您阅读过本指南架构部分的 Templates
部分,您现在应该知道这些文件是如何在 views
文件夹中组织的。如果您还没有阅读,现在是阅读的好时机。
除了这些之外,还有一些其他的视图文件是从存储层包含进来的。由于它们的内容和结构对于每个实现都是特定的,因此这里不讨论它们,但重要的是您要记住它们的存在,并且它们与直接包含在 SonataAdminBundle
中的视图文件一样重要。
全局模板
SonataAdminBundle
视图是使用 twig
文件实现的,并充分利用了其继承功能。因此,即使是最简单的页面实际上也是使用许多不同的 twig
文件渲染的。在该 twig
继承层次结构的末尾始终是以下两个文件之一
- 布局: @SonataAdmin/standard_layout.html.twig
- ajax: @SonataAdmin/ajax_layout.html.twig
正如您可能从它们的名称中猜到的那样,第一个用于“标准”请求,另一个用于 AJAX 调用。@SonataAdmin/standard_layout.html.twig
包含整个页面中存在的几个元素,例如徽标、标题、顶部菜单和菜单。它还包括整个管理部分使用的基本 CSS 和 JavaScript 文件和库。AJAX 模板不包含任何这些元素。
CRUDController 操作模板
如前所述,CRUDController
有几个操作,允许您操作您的模型实例。这些操作中的每一个都使用特定的模板文件来渲染其内容。默认情况下,SonataAdminBundle
对其匹配的操作使用以下模板
list
: @SonataAdmin/CRUD/list.html.twigshow
: @SonataAdmin/CRUD/show.html.twigedit
: @SonataAdmin/CRUD/edit.html.twighistory
: @SonataAdmin/CRUD/history.html.twigpreview
: @SonataAdmin/CRUD/preview.html.twigdelete
: @SonataAdmin/CRUD/delete.html.twigbatch_confirmation
: @SonataAdmin/CRUD/batch_confirmation.html.twigacl
: @SonataAdmin/CRUD/acl.html.twig
请注意,所有这些模板都扩展了其他模板,有些模板只做这件事。这种继承架构旨在帮助您通过在您自己的扩展包中扩展这些模板来进行自定义,而不是重写所有内容。
如果您仔细观察,所有这些模板最终都扩展了从控制器传递的 base_template
变量。此变量将始终采用上述全局模板之一的值,这就是对这些文件所做的更改如何影响整个 SonataAdminBundle
界面的方式。
其他模板
还有几个其他模板可以自定义,使您能够微调 SonataAdminBundle
user_block
: 自定义默认在管理界面右上角渲染的 Twig 区块,其中包含用户信息。默认情况下为空,有关真实示例,请参阅SonataUserBundle
。add_block
: 自定义默认在管理界面右上角渲染的 Twig 区块,提供对可用管理类上的创建操作的快速访问。history_revision_timestamp:
自定义使用历史记录相关操作时时间戳的渲染方式。action
: 您可以用于自定义操作的通用模板short_object_description
: 由HelperController
中的getShortObjectDescriptionAction
操作使用,此模板显示模型实例的简短描述。list_block
: 用于渲染仪表盘的管理映射列表的模板。有关更多信息,请参阅仪表盘页面。- batch: 用于渲染列表中每个实例前面的复选框的模板。
select
: 当加载列表视图作为 sonata_admin 表单类型的一部分时,此模板用于创建一个按钮,允许您选择匹配的行。pager_links
: 渲染在列表视图末尾显示的页码列表(当存在多个页面时)pager_results
: 渲染下拉菜单,让您可以在列表视图中选择每页的元素数量
配置模板
此模板结构的主要目标是使您可以方便地自定义您需要的模板。您可以在您自己的扩展包中扩展您想要的模板,并告诉 SonataAdminBundle
使用您的模板而不是默认模板。您可以通过多种方式做到这一点。
您可以在配置文件中指定您的模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
# config/packages/sonata_admin.yaml
sonata_admin:
templates:
layout: '@SonataAdmin/standard_layout.html.twig'
ajax: '@SonataAdmin/ajax_layout.html.twig'
list: '@SonataAdmin/CRUD/list.html.twig'
show: '@SonataAdmin/CRUD/show.html.twig'
show_compare: '@SonataAdmin/CRUD/show_compare.html.twig'
edit: '@SonataAdmin/CRUD/edit.html.twig'
history: '@SonataAdmin/CRUD/history.html.twig'
preview: '@SonataAdmin/CRUD/preview.html.twig'
delete: '@SonataAdmin/CRUD/delete.html.twig'
batch: '@SonataAdmin/CRUD/list__batch.html.twig'
acl: '@SonataAdmin/CRUD/acl.html.twig'
action: '@SonataAdmin/CRUD/action.html.twig'
select: '@SonataAdmin/CRUD/list__select.html.twig'
filter: '@SonataAdmin/Form/filter_admin_fields.html.twig'
dashboard: '@SonataAdmin/Core/dashboard.html.twig'
search: '@SonataAdmin/Core/search.html.twig'
batch_confirmation: '@SonataAdmin/CRUD/batch_confirmation.html.twig'
inner_list_row: '@SonataAdmin/CRUD/list_inner_row.html.twig'
base_list_field: '@SonataAdmin/CRUD/base_list_field.html.twig'
list_block: '@SonataAdmin/Block/block_admin_list.html.twig'
user_block: '@SonataAdmin/Core/user_block.html.twig'
add_block: '@SonataAdmin/Core/add_block.html.twig'
pager_links: '@SonataAdmin/Pager/links.html.twig'
pager_results: '@SonataAdmin/Pager/results.html.twig'
tab_menu_template: '@SonataAdmin/Core/tab_menu_template.html.twig'
history_revision_timestamp: '@SonataAdmin/CRUD/history_revision_timestamp.html.twig'
short_object_description: '@SonataAdmin/Helper/short-object-description.html.twig'
search_result_block: '@SonataAdmin/Block/block_search_result.html.twig'
action_create: '@SonataAdmin/CRUD/dashboard__action_create.html.twig'
button_acl: '@SonataAdmin/Button/acl_button.html.twig'
button_create: '@SonataAdmin/Button/create_button.html.twig'
button_edit: '@SonataAdmin/Button/edit_button.html.twig'
button_history: '@SonataAdmin/Button/history_button.html.twig'
button_list: '@SonataAdmin/Button/list_button.html.twig'
button_show: '@SonataAdmin/Button/show_button.html.twig'
form_theme: []
filter_theme: []
警告
请注意,这是一个全局更改,这意味着它将自动影响所有模型映射,包括您定义的 Admin
映射和其他扩展包定义的 Admin
映射。
如果您愿意,您可以基于每个 Admin
映射指定自定义模板。在内部,CRUDController
从属于 Admin
的 TemplateRegistry
类实例中获取此信息,因此您可以在 Admin
服务定义中指定要使用的模板
1 2 3 4 5 6 7 8 9
# config/services.yaml
services:
app.admin.post:
class: App\Admin\PostAdmin
calls:
- [setTemplate, ['edit', 'PostAdmin/edit.html.twig']]
tags:
- { name: sonata.admin, model_class: App\Entity\Post, manager_type: orm, group: 'Content', label: 'Post' }
注意
还存在一个 setTemplates(array $templates)
(注意复数形式)方法,允许您一次设置多个模板。
使用 setTemplate()
和 setTemplates()
方法所做的更改将覆盖在配置文件中所做的自定义设置,因此您可以指定全局自定义模板,然后在特定的 Admin
类上覆盖该自定义设置。
查找已配置的模板
每个 Admin
都有一个连接到它的 TemplateRegistry
服务,该服务保存通过上述配置注册的模板。通过该类的 getTemplate($name)
方法,您可以访问为该 Admin
设置的模板。TemplateRegistry
可以通过 $this->getTemplateRegistry()
在 Admin
中访问。使用服务容器,可以在 Admin
外部访问模板注册表。使用 Admin
代码 + .template_registry
作为服务 ID(即“app.admin.post”使用模板注册表“app.admin.post.template_registry”)。
可以使用服务 ID "sonata.admin.global_template_registry" 访问保存全局模板的 TemplateRegistry
服务。
在 Twig 模板中,您可以使用 get_admin_template($name, $adminCode)
函数访问当前 Admin
的模板,或使用 get_global_template($name)
函数访问全局模板。
1 2 3 4 5
{% extends get_admin_template('base_list_field', admin.code) %}
{% block field %}
{# ... #}
{% endblock %}