是否可以让Mustache(php)partials包含他们自己的数据?

时间:2014-08-05 21:13:01

标签: php viewmodel mustache.php

我希望有一个Mustache模板引用部分,其中partial也将数据添加到上下文中。而不必将数据中的数据定义为初始的Mustache渲染。

我在https://gist.github.com/lode/ecc27fe1ededc9b4a219

中有一个模型

归结为:

<?php

// controller
$options = array(
    'partials' => array(
        'members_collection' => new members_collection
    )
);
$mustache = new Mustache_Engine($options);

$template = '
    <h1>The team</h1>
    {{> members_collection}}
';
echo $mustache->render($template);

// viewmodel
class members_collection {
    public $data;

    public function __toString() {
        $template = '
            <ul>
                {{# data}}
                    {{.}}
                {{/ data}}
            </ul>
        ';

        $mustache = new Mustache_Engine();
        return $mustache->render($template, $this);
    }

    public function __construct() {
        $this->data = array(
            'Foo Bar',
            'Bar Baz',
            'Baz Foo',
        );
    }
}

这会产生类似Cannot use object of type members_collection as array的错误。

有没有办法让这项工作?或者使用__toString的方式不正确?并使用partials_loader或__invoke帮助?我得到了它,但可能会错过任何东西。

2 个答案:

答案 0 :(得分:1)

在上面的示例中,members_collection不是部分的,而是子视图。两个非常小的更改使其工作:在选项数组中,将partials键更改为helpers;并且,在父模板中,从部分标记更改为未转义的插值标记({{> members_collection}} - &gt; {{{members_collection}}})。

<?php

require '/Users/justin/Projects/php/mustache/mustache.php/vendor/autoload.php';

// controller
$options = array(
    'helpers' => array(
        'members_collection' => new members_collection
    )
);
$mustache = new Mustache_Engine($options);

$template = '
    <h1>The team</h1>
    {{{members_collection}}}
';
echo $mustache->render($template);

// viewmodel
class members_collection {
    public $data;

    public function __toString() {
        $template = '
            <ul>
                {{# data}}
                    {{.}}
                {{/ data}}
            </ul>
        ';

        $mustache = new Mustache_Engine();
        return $mustache->render($template, $this);
    }

    public function __construct() {
        $this->data = array(
            'Foo Bar',
            'Bar Baz',
            'Baz Foo',
        );
    }
}

答案 1 :(得分:0)

我假设你在PHP中使用bobthecow PHP实现Mustache模板。

截至上次我检查过,Mustache PHP它并不支持数据驱动的部分。你想要一种控制器&#39;支持部分...然而,目前部分只是简单包括这个文件样式部分。

你自己必须建立这个。祝你好运!