Drupal站点AJAX请求返回PHP代码被注释无法执行渲染如何解决
问题根因说明
- Drupal 默认的文本输入过滤机制会拦截、转义或注释掉内容字段中的PHP代码,避免恶意代码执行,你看到的PHP代码被包裹在
<!-- -->注释中就是该机制处理后的结果。 - 即使在Twig中使用
|raw过滤器也只会原样输出文本,不会触发PHP代码解析执行。你尝试的processed_text渲染方式未生效,大概率是当前Body字段使用的文本格式未开启PHP执行权限。
解决方案
注意:直接在Node Body等内容字段中编写可执行PHP代码属于极高危操作,仅建议在完全受控的测试环境中使用,生产环境优先选择以下更安全的合规方案。
方案1(生产环境推荐,无安全风险):自定义AJAX回调接口
该方案完全不需要将PHP代码写入Node Body,符合Drupal开发规范:
- 新建自定义Drupal模块,在模块的
*.routing.yml文件中定义专属AJAX路由,示例配置:
your_module.ajax_callback: path: '/api/custom-ajax' defaults: _controller: '\Drupal\your_module\Controller\CustomAjaxController::handlePost' _format: json requirements: _permission: 'access content' # 可根据业务需求调整权限控制规则
- 在模块的
src/Controller/CustomAjaxController.php文件中编写你的PHP业务逻辑,处理前端POST请求并返回对应结果。 - 前端jQuery直接请求你定义的
/api/custom-ajax路由获取返回值即可。
方案2(次推荐):动态插入PHP执行结果
如果你需要在Node详情页渲染PHP逻辑的运行结果,不要将PHP代码写入Body字段,通过Drupal钩子动态插入内容:
- 实现
hook_node_view_alter()钩子,在钩子中执行你的PHP逻辑,将运行结果插入到Node的渲染数组中,Twig模板正常渲染Body字段即可。
方案3(仅限测试环境使用):开启PHP过滤器
如果你一定要在Node Body中直接编写并执行PHP代码,按以下步骤操作:
- 安装Drupal官方贡献的PHP Filter模块(Drupal 8及以上版本核心默认不自带该模块)。
- 进入后台「配置」-「内容创作」-「文本格式和编辑器」,找到Body字段使用的文本格式,开启「PHP代码过滤器」。注意:该文本格式的使用权限仅可开放给超级管理员,绝对不要给普通用户、匿名用户开放,否则站点存在极大被入侵风险。
- 保留你使用的
processed_text渲染代码即可触发PHP代码执行:
{% set body = { '#type': 'processed_text', '#text': node.body.value, '#format': node.body.format, } %} {{ body }}
内容的提问来源于stack exchange,提问作者stckvrw
相关产品推荐
相关产品推荐

