是否可以使用Phalcon \ Mvc \ View呈现自定义视图(只是自定义.phtml)模板?

时间:2013-01-14 22:02:21

标签: phalcon

我需要在变量中呈现电子邮件模板以便稍后发送(存储在.phtml文件中),我真的不想实现我的特殊类来处理它。

是否可以渲染非控制器操作视图,而不是自定义操作视图?

我尝试了以下代码,但输出NULL:((

// Controller context
$view = new Phalcon\Mvc\View();
$view->setViewsDir('app/views/');
$view->setVar('var1', 'var2');
// Setting some vars...
$view->start();
$view->partial($emailTemplatePath);
$view->finish();
$result = $view->getContent();
var_dump($result); // Gives null

6 个答案:

答案 0 :(得分:4)

除了Nikolaos的回复之外,您还可以使用$ view-> getRender()来呈现返回其输出的单个视图。

$view->setViewsDir('apps/views/');
echo $view->getRender('partials', 'test'); // get apps/views/partials/test.phtml

答案 1 :(得分:2)

您需要检查$emailTemplatePath的路径。它应该指向正确的文件,即

// points to app/views/partials/email.phtml
$view->partial('partials/email');

如果您正在使用Volt并将其注册为引擎,那么您的文件必须是:

// app/views/partials/email.volt

答案 2 :(得分:1)

使用$view->render('partials/email')而不是调用部分方法。

答案 3 :(得分:1)

我有一个项目,我使用电子邮件和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方法,我就完成了:

- &gt; setBody($ this-&gt; render_template($ template,$ data),'text / html');

你不需要在组件中放置这样的单独视图引擎,它可能会像这样变得像内存一样,但它确实显示了整个过程。希望有道理:)

答案 4 :(得分:1)

呈现视图并将其作为变量返回的最简单方法是使用Phalcon \ Mvc \ View \ Simple类。在您的控制器中,声明Simple视图类的新实例并将渲染引擎附加到它。然后,您可以使用其render()方法选择视图文件并传入变量:

// create a simple view to help render sections of the page
$simple_view = new \Phalcon\Mvc\View\Simple();
$simple_view->setViewsDir( __DIR__ . '/../views/' );
$simple_view->setDI( $this->di );
$simple_view->registerEngines(array(
    '.volt' => 'Phalcon\Mvc\View\Engine\Volt'
));

// use the simple view to generate one or more widgets
$widget_html = array();
$widget_objects = $widget_search->getWidgetObjects();
forEach( $widget_objects as $widget ){
    $widget_html[] = $simple_view->render('index/widgetview',array('widget'=>$widget));
}

// pass the html snippets as a variable into your regular view
$this->view->setVar('widget_html',$widget_html);

答案 5 :(得分:0)

我通常使用Volt引擎,一个简单的方法是在DI容器中重新定义视图,如下所示:

$view = $this->view;

$content = $view->getRender('mail', 'show',
  array(
    "var1" => "some value 1",
    "var2" => "some value 2"
  ),
  function($view) {
      $view->setRenderLevel(\Phalcon\Mvc\View::LEVEL_LAYOUT);
  }
);

echo $content;