Lex 解析器和 CodeIgniter,有条件的怪异行为

问题描述 投票:0回答:1

我使用 lexpyrocms 解析器作为与 composer 一起安装的包以及带有 HMVC 的 codeigniter 框架,这允许我在我的模板/视图中使用 {{pseudo-variable}}。

在我看来,解析器语法有一个非常奇怪的行为:

我有这个简单的 $modules 数组作为数据,我可以在视图/模板中打印_r()

$modules = 
Array ( 
       [users] => stdClass Object ( [id_mdl] => 8 [name_mdl] => users ),
       [actions] => stdClass Object ( [id_mdl] => 9 [name_mdl] => actions ) 
);

如果我使用基本的 Lex 语法,我可以毫无问题地显示 name_mdl

{{modules}} {{name_mdl}} {{/modules}}
=> 输出“用户”和“操作”

但是当我在循环中使用条件“if”时,我在测试变量是否存在时得到了错误的匹配:

{{modules}}

    {{name_mdl}} 

{{/modules}}

这个输出正确

users actions

{{modules}}

    {{if exists name_mdl}} 
    name_mdl OK {{name_mdl}} 
    {{endif}}

{{/modules}}

但这不会输出任何东西:

{{modules}}

    {{if not exists name_mdl}} 
    name_mdl  NOT OK {{name_mdl}} 
    {{endif}}

{{/modules}}

这输出

'name_mdl NOT OK users name_mdl NOT OK actions'
解析器正确显示了一个它刚刚回避的变量,因为它存在于条件中..

我到处搜索了一下,但它看起来像一个孤儿问题,在任何地方都找不到线索。

codeigniter hmvc pyrocms-lex
1个回答
0
投票

嗯..我设法摆脱了这种奇怪的行为,但我不确定我所做的改变的哪一部分解决了问题......所以它的价值:

我遇到的错误是在一个循环中

{{list_of_things}}{{/list_of_things}}
用条件
if exists
检查现有变量是不可能的,尽管这个变量的显示工作正常:

{{list_of_things}}

    {{ list_name }} <-- display the list_name of each entry  

    {{ if exists list_name }} 
        The condition was never met, tough the data 'list_name' can be displayed above
    {{ endif }} 

{{/list_of_things}}

之后我做了两件事,解决了这个问题...


1-我移动了 Lex Parser 的声明

$this->parser = new Lex\Parser();

来自我的前端控制器

application/modules/my_module/module_controller.php

进入我的扩展核心控制器类的构造函数

application/core/MY_Controller.php

2-我清理了我的 views 文件夹,因为那里有一些来自早期开发的双文件:

要注意:调用的视图是application/modules/my_module/views/theme/my_template.php

  • 之前:

    modules/my_module/views/
                         my_template.php

    modules/my_module/views/theme/
                         my_template.php

  • 之后:

    modules/my_module/views/

    modules/my_module/views/theme/
                         my_template.php


所以我最好的猜测是 HMVC 将 Lex Parser 与“loaded_paths”混淆了一点,并且同一模块中具有相同名称的两个视图(即使不在同一目录中)可能会导致意外行为..但我不明白为什么会改变解析器的条件...

© www.soinside.com 2019 - 2024. All rights reserved.