CakePHP 3 CakePdf wkhtmltopdf从shell生成视图时出现CSS问题

时间:2018-08-03 10:48:13

标签: php cakephp wkhtmltopdf cakephp-3.x

这个问题是关于从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');

}

摘要

  • 模板文件中的普通链接仍使用'_full'=> true,并生成正确的链接。
  • bootstrap_cli文件仍然配置了App.fullBaseUrl ='http://www.app.com'
  • 我将App.base设置为指向webroot,以便从shell调用wkhtmltopdf时,视图可以找到正确的css文件夹(这有点让人讨厌)

问题

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

我知道我已经解决了问题,但是感觉有些不客气。专门将App.base指向/ webroot

0 个答案:

没有答案