php - CakePHP 3 CakePdf wkhtmltopdf 从shell生成视图时出现的css问题
问题描述
这个问题是关于 wkhtmltopdf 在从 CLI / shell 使用时查找 CSS 文件
背景
为了在从 shell 生成视图时建立完整的链接(即用于电子邮件生成),我配置了我的 bootstrap_cli.php 文件来定义 fullBaseUrl:
// in /config/bootstrap_cli.php
Configure::write('App.fullBaseUrl', APPDOMAIN);
这在网上有很好的记录,并且工作正常。
我一直在使用带有 wkhtmltopdf 的 CakePdf 插件作为引擎来为我的应用程序中的某些页面生成一些 PDF 报告。根据阅读文档,指向 css 的链接需要确保我们使用的是 fullbase。
//in /src/Template/Layout/pdf/default.ctp
<?= $this->Html->css('style.css', ['fullBase' => true]) ?>
并且在模板文件中,需要请求完整的链接
// in /src/Template/Pdf/report.ctp
<?= $this->Html->link('test', ['controller' =>'Article', 'action' => 'view', '_full' => true, $id]) ?>
当我从浏览器中使用 CakePdf 时,这很好用,无论它是内联渲染还是保存到磁盘。
// in /src/Controller/ReportController.php
public function view($id) {
/** other code **/
$this->viewBuilder()
->setLayout('default') // this looks in Template/Layout/Pdf
->setTemplate('/Pdf/report')
->setClassName('CakePdf.Pdf');
}
问题
从 shell 脚本调用时,问题是 css 的 fullBaseUrl 设置和 fullBase 会导致问题,特别是:
// in /src/Template/Layout/pdf/default.ctp
<?= $this->Html->css('style.css', ['fullBase' => true]) ?>
生成这个:
<link rel="stylesheet" src="https://www.app.com/var/www/vhosts/app/bin/css/style.css">
我为 CLI 创建了一个替代布局并删除了 fullBase => true
// in /src/Template/Layout/pdf/default_cli.ctp
<?= $this->Html->css('style.css') ?>
生成这个:
<link rel="stylesheet" src="/var/www/vhosts/app/bin/css/style.css">
现在的问题是它在/bin中而不是在 webroot 中。
经过反复试验并阅读Cake 文档后,我在 CLI 中修改了 App.base 值,但仅针对这一脚本,而不是在 bootstrap_cli.php 中:
// in /src/Shell/PdfShell.php
class PdfShell extends Shell {
Public function initialize() {
parent::initialize();
Configure::write('App.base.', ROOT . DS . 'webroot');
}
现在这会导致样式表位于正确的位置,并且一切正常。
为了完整起见,这就是我从 shell 脚本生成文件的方式
// in /src/Shell/PdfShell.php
Public function report($id) {
$data1 = $this->Controller->get($id);
$data2 = $this->OtherController->find()->select('stuff');
$viewVars = compact('data1','data2');
$CakePdf = new CakePdf();
$CakePdf->template('report','default_cli');
$CakePdf->viewVars($viewVars);
$pdf = $CakePdf->output();
$pdf = $CakePdf->write(APP . '/Files/Pdf/report.pdf');
}
概括
- 模板文件中的普通链接仍然使用 '_full' => true,并生成正确的链接。
- bootstrap_cli 文件仍然配置了 App.fullBaseUrl = ' http://www.app.com '
- 我将 App.base 设置为指向 webroot,以便在从 shell 调用 wkhtmltopdf 时视图可以找到正确的 css 文件夹(这有点让人觉得很奇怪)
问题
这是一个错误吗?还是我不了解如何从 CLI 正确配置视图。有更好的方法吗?
我知道我已经解决了这个问题,但感觉有点hacky。特别将 App.base 指向 /webroot
解决方案
推荐阅读
- git - 您好,我需要编写一个简短的 shell 脚本,列出您的 Git 存储库忽略的所有现有文件。例子:
- azure - Application Insights 中的用户流和漏斗功能之间的区别
- mysql - 在 MySQL 中创建一个被某些条件称为不同的列
- ruby-on-rails - 如何将 form_select 添加到 rails 应用程序中的某个固定下拉列表
- python - 如何根据时间列更改日列的值?
- html - 单击同一页面上的跳转链接/目标返回顶部
- javascript - Redux-form如何在勾选复选框时更新/附加特定值到initialValue中的键
- java - 仅包含数字的输入字符串的 Java 数字格式异常
- reactjs - 反应:无法使用 onclick 事件获取 NavDropdown 的 ID
- excel - 如何使Excel按原样表示单元格值而不是公式?