Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -270,16 +270,19 @@ You can use the if helper to conditionally render a block. If its argument retur
```html
{{#if isActive}}
This part will be shown if it is active
{{#else if isValid}}
This part will be shown if it is valid
{{else}}
This part will not show if isActive is true
This part will be shown if isActive and isValid are both "falsy" values
{{/if}}
```

```php
<?php

$model = [
"isActive" => true
"isActive" => true,
"isValid" => false
];

echo $handlebars->render($template, $model);
Expand Down Expand Up @@ -449,8 +452,10 @@ $model = [
```html
{{#if isActive}}
This part will be shown if it is active
{{#else if isValid}}
This part will be shown if it is valid
{{else}}
This part will not show if isActive is true
This part will be shown if isActive and isValid are both "falsy" values
{{/if}}
```

Expand Down
69 changes: 68 additions & 1 deletion src/Handlebars/Helpers.php
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,10 @@ public function isEmpty()
*
* {{#if condition}}
* Something here
* {{else if condition}}
* something else if here
* {{else if condition}}
* something else if here
* {{else}}
* something else here
* {{/if}}
Expand All @@ -218,14 +222,53 @@ public function isEmpty()
*/
public function helperIf($template, $context, $args, $source)
{
$tpl = $template->getEngine()->loadString('{{#if ' . $args . '}}' . $source . '{{/if}}');
$tree = $tpl->getTree();
$tmp = $context->get($args);
if ($tmp) {
$template->setStopToken('else');
$token = 'else';
foreach ($tree[0]['nodes'] as $node) {
$name = trim($node['name'] ?? '');
if ($name && substr($name, 0, 7) == 'else if') {
$token = $node['name'];
break;
}
}
$template->setStopToken($token);
$buffer = $template->render($context);
$template->setStopToken(false);
$template->discard();
return $buffer;
} else {
foreach ($tree[0]['nodes'] as $key => $node) {
$name = trim(isset($node['name']) ? $node['name'] : '');
if ($name && substr($name, 0, 7) == 'else if') {
$template->setStopToken($node['name']);
$template->discard();
$template->setStopToken(false);
$args = $this->parseArgs($context, substr($name, 7));
$token = 'else';
$remains = array_slice($tree[0]['nodes'], $key + 1);
foreach ($remains as $remain) {
$name = trim($remain['name'] ?? '');
if ($name && substr($name, 0, 7) == 'else if') {
$token = $remain['name'];
break;
}
}
if (isset($args[0]) && $args[0]) {
$template->setStopToken($token);
$buffer = $template->render($context);
$template->setStopToken(false);
$template->discard();
return $buffer;
} else if ($token != 'else') {
continue;
} else {
return $this->renderElse($template, $context);
}
}
}
return $this->renderElse($template, $context);
}
}
Expand Down Expand Up @@ -730,4 +773,28 @@ private function extractSlice($string)
}
return [$m[1], $slice_start, $slice_end];
}

/**
* Parse avariable from current args
*
* @param \Handlebars\Context $context context object
* @param array $args passed arguments to helper
* @return array
*/
private function parseArgs($context, $args)
{
$args = preg_replace('/\s+/', ' ', trim($args));
$eles = explode(' ', $args);
foreach ($eles as $key => $ele) {
if (in_array(substr($ele, 0, 1), ['\'', '"'])) {
$val = trim($ele, '\'"');
} else if (is_numeric($ele)) {
$val = $ele;
} else {
$val = $context->get($ele);
}
$eles[$key] = $val;
}
return $eles;
}
}