Handlebars:如何将@index作为参数传递给自定义助手

时间:2013-11-03 05:00:48

标签: javascript php handlebars.js

设定:

  • 我正在使用Handelbars.PHP,但考虑到Handlebars.js的解决方案可能会对我有帮助。
  • 自定义助手content,它需要两个参数作为集合和索引。
  • 调用#each助手的#content助手调用,如下所示:

    {{#each data}}      {{#content ../parent_options @index}} {{/ content}} {{/每}}

问题:

content帮助程序定义中,我想访问@index值,比如0,1,2,...,但我只是得到一个字符串!

如何作为参数传递并在内容助手定义中访问@index的值?

2 个答案:

答案 0 :(得分:0)

正如commented中所展示的boukeversteeghofficial project repo所展示的那样:

  

Handlebars.PHP不解析帮助者的论据,这是你的工作   解析并赋予它们意义(我说的是第三个参数   传递给助手_helper_each($template, $context, $args, $source))。但在你的情况下,没有必要解析参数,你   可以通过$context->lastIndex()轻松访问它。

https://github.com/XaminProject/handlebars.php/issues/27

的完整评论

最终自定义助手供参考:

    /**
     * Handlebars Helper Content. Return object->Alphabet[index].
     *
     * @param $template
     * @param $context
     * @param $args
     * @param $source
     *
     * @return Handlebars_String
     * @throws InvalidArgumentException
     */
    public static function _helper_content($template, $context, $args, $source) {
        $Alphabet = range('A', 'Z');

        $tmp = explode(' ', $args);
        $buffer = '';

        $object = $context->get($tmp[0]);

        if (count($tmp) < 2 || $tmp[1] == '@index') {
            $last_index = $context->lastIndex();
            $letter = $Alphabet[$last_index];
        }
        else {
            $index = $context->get($tmp[1]);
            $letter = $Alphabet[$index];
        }

        $buffer .= $object->$letter;

        return new Handlebars_String($buffer);
    }

答案 1 :(得分:0)

下面是一些样板代码,您可以使用它们来创建具有自定义帮助程序的强大模板,同时仍然使用最少量的代码。

它包含两个助手:

  • 一个将字符串更改为大写。在演示代码中将@key值传递给它。
  • 一个用于递增数值。在演示代码中将@index值传递给它。

模板table.hbs

{{#if table}}
<table>
    <thead>
        <tr>
            <th style="width: 2%;">#</th>
            {{#each table.0}}
            <th nowrap="nowrap">
                {{uppercase @key}}
            </th>
            {{/each}}
        </tr>
    </thead>
    <tbody>
        {{#each table}}
        <tr> 
            <th>{{increment @index}}</th>
            {{#each this}}
            <td><input type="text" value="{{this}}" /></td>
            {{/each}}
        </tr>
        {{/each}}
    </tbody>
</table>
{{#if paginator}}
<nav class="pagination">
    <ul>
        {{#each paginator}}
        <li><a href="{{this}}">{{@key}}</a></li>
        {{/each}}
    </ul>
</nav>
{{/if}}
{{else}}
<p>No data found!</p>
{{/if}}

视图:

// Create handlebars object
$template_engine = new \Handlebars\Handlebars;

// Get helpers object
$helpers = $template_engine->getHelpers();

// Add 'camelize' helper
$helpers->add('uppercase', function($template, $context, $args, $source) {
    return ucwords($context->get($args));
});

// Add 'increment' helper
$helpers->add('increment', function($template, $context, $args, $source) {
    return $context->get($args) + 1;
});

// Render template
echo $template_engine->render(file_get_contents(__DIR__ . '/table.hbs'), array(
    'table' => array(
        array('name' => 'John', 'profession' => 'programmer', 'city' => 'Leuven'),
        array('name' => 'Sam', 'profession' => 'designer', 'city' => 'Aarschot'),
        array('name' => 'Tom', 'profession' => 'owner', 'city' => 'Leuven'),
        array('name' => 'Steve', 'profession' => 'copywriter', 'city' => 'Brussels'),
        array('name' => 'Thomas', 'profession' => 'designer', 'city' => 'Antwerp')
    ),
    'paginator' => array(
        'first' => 'http://www.test.com/first',
        '1' => 'http://www.test.com/1',
        '2' => 'http://www.test.com/2',
        '3' => 'http://www.test.com/3',
        'last' => 'http://www.test.com/last'
    )
));

输出:

<table>
    <thead>
        <tr>
            <th style="width: 2%;">#</th>
            <th nowrap="nowrap">
                Name
            </th>
            <th nowrap="nowrap">
                Profession
            </th>
            <th nowrap="nowrap">
                City
            </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <th>1</th>
            <td><input type="text" value="John" /></td>
            <td><input type="text" value="programmer" /></td>
            <td><input type="text" value="Leuven" /></td>
        </tr>
        <tr>
            <th>2</th>
            <td><input type="text" value="Sam" /></td>
            <td><input type="text" value="designer" /></td>
            <td><input type="text" value="Aarschot" /></td>
        </tr>
        <tr>
            <th>3</th>
            <td><input type="text" value="Tom" /></td>
            <td><input type="text" value="owner" /></td>
            <td><input type="text" value="Leuven" /></td>
        </tr>
        <tr>
            <th>4</th>
            <td><input type="text" value="Steve" /></td>
            <td><input type="text" value="copywriter" /></td>
            <td><input type="text" value="Brussels" /></td>
        </tr>
        <tr>
            <th>5</th>
            <td><input type="text" value="Thomas" /></td>
            <td><input type="text" value="designer" /></td>
            <td><input type="text" value="Antwerp" /></td>
        </tr>
    </tbody>
</table>
<nav class="pagination">
    <ul>
        <li><a href="http://www.test.com/first">first</a></li>
        <li><a href="http://www.test.com/1">1</a></li>
        <li><a href="http://www.test.com/2">2</a></li>
        <li><a href="http://www.test.com/3">3</a></li>
        <li><a href="http://www.test.com/last">last</a></li>
    </ul>
</nav>