📅  最后修改于: 2023-12-03 15:14:48.315000             🧑  作者: Mango
在 Drupal 中,视图 (View) 是一种将节点、用户、评论等数据转换为 HTML 代码的工具。通过视图,我们可以方便地查询和显示数据。但有时候,视图查询的结果并不符合我们的需求,需要对视图进行自定义修改。
本篇文章将介绍如何在 Drupal 9 中通过主题代码修改视图查询的结果。
首先,我们需要复制视图模板,以便在主题中进行修改。
打开网站管理后台,进入“结构 > 视图”页面,找到需要修改的视图。
点击视图名称,进入编辑页面。
在“高级设置”区域中,找到“主题:信息”一栏,点击“模板文件”链接。
在弹出的窗口中,勾选要编辑的模板文件,然后点击“复制选定的模板文件到主题”按钮。
这将在当前主题的 /templates
文件夹下创建一个与模板文件同名的文件,并将其内容复制到这个文件中。
接下来,我们可以在模板文件中对视图查询进行修改。以下是一些常见的修改方法:
Drupal 的视图模块使用 SQL 查询语句来查询数据。我们可以通过修改 SQL 查询语句来筛选或排序数据。
在 Drupal 9 中,视图模板文件的文件名格式为 view-[视图名称]-[机器名].html.twig
。以一个名为 blog
的视图为例,模板文件名为 view--blog.html.twig
。在模板文件中,我们可以使用 Twig 的 {{ output }}
语法来输出视图的 HTML 代码,使用 {{ rows }}
语法来输出视图的查询结果。
以下是一个示例,该示例将文章按发布时间倒序排列:
{% for row in rows %}
{{ row.content }} {# 输出每一行数据 #}
{% endfor %}
{% if pager %}
{{ pager }}
{% endif %}
我们可以将 SQL 查询语句放在模板文件中的 hook_views_pre_render
钩子中。该钩子会在视图结果渲染前被调用,这里我们使用 Drupal 的 db_query()
函数来执行 SQL 查询:
{% hook until="views_pre_render" %}
{% set query = "
SELECT nid, title FROM {node_field_data}
WHERE type = :type
ORDER BY created DESC"
%}
{% set results = db_query(query, {':type': 'article'}) %}
{% for row in results %}
<div class="blog-listing">
<h2><a href="/node/{{ row.nid }}">{{ row.title }}</a></h2>
</div>
{% endfor %}
{% endhook %}
这个示例将查询所有类型为 article
的节点,并按照创建时间倒序排列。
有时候,我们需要对查询结果做出一些单独的处理。在视图模板中,我们可以使用 Drupal 的 hook_views_post_render
钩子来对查询结果进行修改。
以下是一个示例,该示例将文章标题中的所有大写字母转换为小写:
{% hook until="views_post_render" %}
{% for row in rows %}
{% set node = row.content['#node'] %}
{% set title_lowercase = node.title|lower %}
{% set row.content['#node'].title = title_lowercase %}
{% endfor %}
{% endhook %}
这个示例利用了 Twig 的 lower
过滤器,将节点标题转换为小写的。我们将新的标题赋值给视图的查询结果,这样就可以在模板中直接使用新的标题了。
更多关于修改视图的方法,可以参考 Drupal 官方文档。
完成修改后,我们需要将模板文件保存到主题的 /templates
文件夹下。如果主题中已存在同名的模板文件,则会覆盖原有文件,所以记得备份原有文件。
这时,我们就可以在网站前台查看视图的新结果了。
以上就是在 Drupal 9 中通过主题代码修改视图查询的方法。如果您有任何问题,请参考官方文档或在社区寻求帮助。