设定:
content
,它需要两个参数作为集合和索引。调用#each
助手的#content
助手调用,如下所示:
{{#each data}} {{#content ../parent_options @index}} {{/ content}} {{/每}}
问题:
在content
帮助程序定义中,我想访问@index
值,比如0,1,2,...
,但我只是得到一个字符串!
如何作为参数传递并在内容助手定义中访问@index
的值?
答案 0 :(得分:0)
正如commented中所展示的boukeversteegh和official 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>