我有一个项目,我使用电子邮件和 pdf 模板,我所做的就是让渲染全部在组件中进行。
首先,我的文件夹结构包含(我只会在此处放置相关的内容)缓存、组件和视图目录。让我们看一下电子邮件设置而不是 PDF,因为这与您的情况更相关。
/app
/cache
/email
/components
/views
/email
/elements
当然有公共,控制器等,但我们不要为此考虑它们。
我正在为我的使用 Swift 邮件程序,但我希望你能同样使用它。在 /app/components/Swift.php 我有一个 __construct 调用this->init_template_engine();
/**
* Create a volt templating engine for generating html
*/
private function init_template_engine() {
$this->_template = new \Phalcon\Mvc\View\Simple();
$di = new \Phalcon\DI\FactoryDefault();
$this->_template->setDI($di);
$this->_template->registerEngines([
'.volt' => function($view, $di) {
$volt = new \Phalcon\Mvc\View\Engine\Volt($view, $di);
$volt->setOptions([
'compiledPath' => APP_DIR."cache".DS."email".DS, // render cache in /app/cache/email/
'compiledSeparator' => '_'
]);
return $volt;
// or use ".phtml" => 'Phalcon\Mvc\View\Engine\Php' if you want,
// both will accept PHP code if ya don't fancy it being a 100% volt.
},
]);
// tell it where your templates are
$this->_template->setViewsDir(APP_DIR.'views'.DS.'email'.DS);
return $this->_template;
}
上面的常量(如 APP_DIR)是我已经在我的引导程序中创建的,它们所做的只是存储目录的完整路径。
一旦 $_template 变量设置了模板引擎,我就可以使用它来呈现我的模板。
/**
* Returns HTML via Phalcon's volt engine.
* @param string $template_name
* @param array $data
*/
private function render_template($template_name = null, $data = null) {
// Check we have some data.
if (empty($data)) {
return false; // or set some default data maybe?
}
// Use the template name given to render the file in views/email
if(is_object($this->_template) && !empty($template_name)) {
return $this->_template->render($template_name, ['data' => $data]);
}
return false;
}
一个示例伏特电子邮件模板可能如下所示:
{{ partial('elements/email_head') }}
<h2>Your Order has been dispatched</h2>
<p>Dear {{ data.name }}</p>
<p>Your order with ACME has now been dispatched and should be with you within a few days.</p>
<p>Do not hesitate to contact us should you have any questions when your waste of money arrives.</p>
<p>Thank you for choosing ACME Inc.</p>
{{ partial('elements/email_foot') }}
我所要做的就是获取 html 并使用 swiftmailer 的 setBody 方法,我就完成了:
->setBody($this->render_template($template, $data), 'text/html');
您不需要像这样在组件中放置单独的视图引擎,它可能会像那样占用内存,但它确实显示了整个过程。希望这是有道理的:)