我在PHP中构建ExpressionEngine模块。
在ExpressionEngine中,可以使用以下命令访问模板中传递给模块的参数:
$my_param = $this->EE->TMPL->fetch_param('my_param');
但是,当我以这种方式获取字符串时,explode不起作用:
public function get_tyres()
{
$tyres = $this->EE->TMPL->fetch_param('tyres');
echo($tyres);
// this shows: '205/55R16M+S|205/55R16|205/55R16'
// now I want to split it into single tyres, using the pipe as a delimiter
$tyre_array = explode("|", $tyres);
foreach($tyre_array as $tyre)
{
echo($tyre . '<br>');
}
// the above produces: '205/55R16M+S|205/55R16|205/55R16',
// where I'd expect it to produce:
// 205/55R16M+S
// 205/55R16
// 205/55R16
}
我尝试使用$tyres = (string) $this->EE->TMPL->fetch_param('tyres');
专门投射到字符串,没有运气。
我还尝试过手动创建和爆炸字符串:
$tyres = '205/55R16M+S|205/55R16|205/55R16';
哪个有效,但显然我需要从模板中获取参数,而不是硬编码。
最后,我尝试使用preg_split和正则表达式,但没有运气:
$tyre_array = preg_split('/\|/', $tyres);
也返回了一个包含整个字符串的数组。
这里有什么用?这是范围相关的事情吗?它是与编码相关的东西吗?接下来要找什么?
更新
好的,我们到了某个地方。我已将以下内容添加到该功能中:
for($i = 0; $i < strlen($tyres); $i++) {
echo substr($tyres, $i, 1) . ", ";
}
返回... {, v, e, r, s, i, o, n, :, t, y, r, e, s, },
,实际上是HTML模板中传递给PHP的变量:
{exp:my_module:tyres tyres="{version:tyres}"}
<h1>{tyre:name}</h1>
... more irrelevant HTML
{/exp:my_module:tyres}
这意味着它与ExpressionEngine的解析顺序有关。显然,变量{version:tyres}
尚未被解析。所以我将该变量传递给模块,它试图通过管道字符将其爆炸,但字符串{version:tyres}
不包含管道,这意味着它不能被爆炸。然后ExpressionEngine返回{version:tyres}
作为整体,将其传回模板,然后然后将变量解析为205/55R16M+S|205/55R16|205/55R16
。
我已经对此进行了测试,并且可以通过以下方式确认爆炸:&#39;返回数组:
array (size=2)
0 => string '{version' (length=8)
1 => string 'tyres}' (length=6)
我现在将查看ExpressionEngine解析顺序。如果有人知道如何解决这个问题,我很高兴知道; - )。
答案 0 :(得分:1)
我测试了你的代码,复制并粘贴你的测试字符串,它对我来说很好。确保你的管道(&#34; |&#34;)真的是你认为的那个角色,而不是说,看起来像管道的一些疯狂的unicode东西,但实际上是Klingon for for&#39;工作人员等等。
尝试这样的事情作为现实检查:
echo " the pipe is at " .strpos($tyres,"|"). " and I really hope this it says '12'";
答案 1 :(得分:1)
答案在于ExpressionEngine解析顺序,如下所述:https://ellislab.com/expressionengine/user-guide/templates/template_engine.html#rendering-stages
因为模板标签{exp:my_module:tires}使用了一个嵌套的模板标签传递给它的变量,所以当最内层标签被解析时,变量尚未被解析。
将参数parse="inward"
添加到外部模板标记使ExpressionEngine首先解析该标记,并将正确的变量传递给内部模板标记。
有关更改解析顺序的更多信息,请参阅https://ellislab.com/expressionengine/user-guide/templates/plugins.html#changing-parsing-order。