这个问题是关于从CLI / shell使用wkhtmltopdf查找CSS文件
背景
要在从外壳生成视图时(即用于生成电子邮件)建立完整的链接,我已经配置了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脚本调用时,问题在于fullBaseUrl设置和CSS的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 docs之后,我在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');
}
摘要
问题
这是一个错误吗?还是我不了解如何从CLI正确配置视图。有更好的方法吗?
我知道我已经解决了问题,但是感觉有些不客气。专门将App.base指向/ webroot