【问题标题】:PHP - ZF2 - render template from string variablePHP - ZF2 - 从字符串变量渲染模板
【发布时间】:2017-03-31 13:48:10
【问题描述】:

我在 ZF2 中渲染模板时遇到问题,其中模板位于变量中的字符串中。有一个简单的例子:

$template = "<div>easy</div>";
$view = new \Zend\View\Model\ViewModel();
$view->setTemplate($template);   

$renderer = new \Zend\View\Renderer\PhpRenderer();
$html = $renderer->render($view);

此代码渲染失败,渲染器认为模板是文件路径。并且 iam reallz 不确定如何告诉 rendere 它是一个字符串。

感谢您的时间并回复。

【问题讨论】:

  • 那个$template 指的是一个文件名,它将被用作模板而不是实际内容。
  • 我知道,但我没有文件(模板在数据库中) - 不要问我为什么 -> 旧旧系统

标签: php html zend-framework2 render


【解决方案1】:

您必须扩展 PhpRenderer 类并覆盖 render 方法,这样才能使用 $template 中的字符串作为实际模板:

class MyPhpRenderer extends PhpRenderer {
public function render($nameOrModel, $values = null)
{
    if ($nameOrModel instanceof Model) {
        $model       = $nameOrModel;
        $nameOrModel = $model->getTemplate();
        if (empty($nameOrModel)) {
            throw new Exception\DomainException(sprintf(
                '%s: received View Model argument, but template is empty',
                __METHOD__
            ));
        }
        $options = $model->getOptions();
        foreach ($options as $setting => $value) {
            $method = 'set' . $setting;
            if (method_exists($this, $method)) {
                $this->$method($value);
            }
            unset($method, $setting, $value);
        }
        unset($options);

        // Give view model awareness via ViewModel helper
        $helper = $this->plugin('view_model');
        $helper->setCurrent($model);

        $values = $model->getVariables();
        unset($model);
    }

    // find the script file name using the parent private method
    $this->addTemplate($nameOrModel);
    unset($nameOrModel); // remove $name from local scope

    $this->__varsCache[] = $this->vars();

    if (null !== $values) {
        $this->setVars($values);
    }
    unset($values);

    // extract all assigned vars (pre-escaped), but not 'this'.
    // assigns to a double-underscored variable, to prevent naming collisions
    $__vars = $this->vars()->getArrayCopy();
    if (array_key_exists('this', $__vars)) {
        unset($__vars['this']);
    }
    extract($__vars);
    unset($__vars); // remove $__vars from local scope

    while ($this->__template = array_pop($this->__templates)) {
        $this->__file = $this->resolver($this->__template);
        try {
            if (!$this->__file) {
               $this->__content = $this->__template; // this line does what you need
            }else{
              ob_start();
              $includeReturn = include $this->__file;
              $this->__content = ob_get_clean();
            }
        } catch (\Exception $ex) {
            ob_end_clean();
            throw $ex;
        }
        if ($includeReturn === false && empty($this->__content)) {
            throw new Exception\UnexpectedValueException(sprintf(
                '%s: Unable to render template "%s"; file include failed',
                __METHOD__,
                $this->__file
            ));
        }
    }

    $this->setVars(array_pop($this->__varsCache));

    if ($this->__filterChain instanceof FilterChain) {
        return $this->__filterChain->filter($this->__content); // filter output
    }

    return $this->__content;
}
}

然后你 code 应该看起来像:

$template = "<div>easy</div>";
$view = new \Zend\View\Model\ViewModel();
$view->setTemplate($template);   

$renderer = new MyPhpRenderer();
$html = $renderer->render($view);

【讨论】:

  • 噢,是的,这就是我要找的。谢谢你。
  • PHPrender 的私有属性有问题。必须复制所有私有属性 + addtemplate 方法 + setViewHelpermanager 才能使用 viewHelpers。谢谢。下次GL&HF
【解决方案2】:

尝试将 '\' 替换为 _ 下划线为 Zend_View_Renderer_PhpRenderer

【讨论】:

  • 试试这个 $renderer = new Zend_View_Renderer_PhpRenderer(); $html = $renderer->render($view);
  • ERR:找不到类“Dovolena\Model\Repository\Mail\Zend_View_Renderer_PhpRenderer”
猜你喜欢
  • 1970-01-01
  • 2017-11-27
  • 2023-04-04
  • 2012-02-17
  • 1970-01-01
  • 2016-05-22
  • 2018-07-29
  • 1970-01-01
  • 2013-08-11
相关资源
最近更新 更多