2

我正在尝试 zend 框架 2 的子视图模型,由于某种原因,我的子视图没有呈现。$this->content 最终没有内容。

我的剧本

use Zend\View\Renderer\PhpRenderer;
use Zend\View\Resolver;
use Zend\View\Model\ViewModel;

$renderer = new PhpRenderer();

$resolver = new Resolver\AggregateResolver();

$renderer->setResolver($resolver);

$map = new Resolver\TemplateMapResolver(array(
    'layout' => APP_PATH . '/views/layouts/test-layout.phtml',
    'test1' => APP_PATH . '/views/scripts/test1.phtml',
    'test2' => APP_PATH . '/views/scripts/test2.phtml',
));
$stack = new Resolver\TemplatePathStack(array(
    'script_paths' => array(
        APP_PATH . '/views/scripts',
    )
));

$resolver->attach($map)    // this will be consulted first
         ->attach($stack);

$layout = new ViewModel();
$layout->setTemplate('layout');

$model = new ViewModel(array(
    'name' => '<h1>World</h1>',
    'date' => date('Y-m-d'),
    ));
$model->setTemplate('test1');

$layout->addChild($model, 'content');


echo $renderer->render($layout);

我的“布局”文件

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>Testing layouts and nested view models</title>
    </head>
    <body>
        <div class='container'>
            <?php echo $this->content; ?>
        </div>
    </body>
</html>

我的“test1”视图

<p>Hello <?php echo $this->escapeHtml($this->name); ?>, its <?php echo $this->date; ?></p>

输出

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>Testing layouts and nested view models</title>
    </head>
    <body>
        <div class='container'>
                    </div>
    </body>
</html>

预期产出

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>Testing layouts and nested view models</title>
    </head>
    <body>
        <div class='container'><p>Hello &lt;h1&gt;World&lt;/h1&gt;, its 2013-10-10</p>
                    </div>
    </body>
</html>
4

3 回答 3

0

所以我像这样解决了它,取自 Zend\View\View 但我想知道是否有更简单的方法或 ZF2 已经提供的组件。

class View 
{
    protected $renderer;

    public function setRenderer(Zend\View\Renderer\RendererInterface $renderer)
    {
        $this->renderer = $renderer;
    }

    public function render(Zend\View\Model\ModelInterface $model)
    {
        $renderer = $this->renderer;

        if ($model->hasChildren()
            && (!$renderer instanceof TreeRendererInterface
                || !$renderer->canRenderTrees())
        ) {
            $this->renderChildren($model);
        }

        $rendered = $renderer->render($model);

        return $rendered;
    }

    protected function renderChildren(Zend\View\Model\ModelInterface $model)
    {
        foreach ($model as $child) {
            if ($child->terminate()) {
                throw new Exception\DomainException('Inconsistent state; child view model is marked as terminal');
            }
            $child->setOption('has_parent', true);
            $result  = $this->render($child);
            $child->setOption('has_parent', null);
            $capture = $child->captureTo();
            if (!empty($capture)) {
                if ($child->isAppend()) {
                    $oldResult=$model->{$capture};
                    $model->setVariable($capture, $oldResult . $result);
                } else {
                    $model->setVariable($capture, $result);
                }
            }
        }
    }
}

然后在我的代码中

$view = new View();
$view->setRenderer($renderer);
echo $view->render($layout);
于 2013-10-10T18:16:53.510 回答
0

我不知道其余代码是否正确,但我会尝试替换这部分:

$layout->addChild($model, 'content');
echo $renderer->render($layout);

有了这个: $layout->addChild($model); 返回$布局;

如果它不起作用,您可以尝试将 FireBug PHP 添加到您的项目并执行 FB::info($variablename);

在每个视图上,看看它是否包含 html,然后确保模板路径是正确的 祝你好运:)

于 2013-12-28T11:20:58.797 回答
0

2021 年我仍然在 Zend Framework 2.0 上工作:°)我寻找了一个没有成功的例子。

该文档讨论了 RenderingStrategies :https://framework.zend.com/manual/2.3/en/modules/zend.view.quick-start.html

也许这个例子可以帮助某人......

// use Zend\Stdlib\Response; Zend\View\Strategy\PhpRendererStrategy; ...
{
        // <?php echo $this->author
        // <?php echo $this->date
        $licenseModel = new ViewModel(array('author' => 'No Name'));
        $licenseModel->setVariable('date', '31/12/1999');
        $licenseModel->setTemplate('license.phtml');

        // <?php echo $this->license
        // <?php echo $this->message
        $model = new ViewModel();
        $model->setVariable('message', 'Hello World !');
        $model->addChild($licenseModel, 'licenseHeader');
        $model->setTemplate('index.phtml');

        $view = new View();
        $view->setResponse(new Response());

        $resolver = new TemplatePathStack();
        $resolver->addPath('/home/dev/Documents/test/tpl');

        $renderer = new PhpRenderer();
        $renderer->setResolver($resolver);

        $rendererStrategy = new PhpRendererStrategy($renderer);
        $rendererStrategy->attach($view->getEventManager());

        $view->render($model);
        echo $view->getResponse()->getContent();
}

我可以添加 ResponseStrategies

        $view->addResponseStrategy(function ($event) {
            $event->getResponse()->setContent($event->getResult());
        });
        $view->addRenderingStrategy(function ($event) {
            // do stuff
            return $renderer;
        });

但在我的情况下不是...

于 2021-02-04T03:51:56.327 回答