首页 > 解决方案 > 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');

}

概括

问题

这是一个错误吗?还是我不了解如何从 CLI 正确配置视图。有更好的方法吗?

我知道我已经解决了这个问题,但感觉有点hacky。特别将 App.base 指向 /webroot

标签: phpcakephpwkhtmltopdfcakephp-3.x

解决方案


推荐阅读