PHP无法处理字符串,从EECMS模板获取

时间:2014-07-31 15:21:20

标签: php expressionengine explode

我在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解析顺序。如果有人知道如何解决这个问题,我很高兴知道; - )。

2 个答案:

答案 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