Search code examples
codeigniterhmvcpyrocms-lex

Lex Parser & CodeIgniter, conditionnal weird behavior


I'm using lexpyrocms parser as a package installed with composer along with a codeigniter framework with HMVC, which allows me to use {{pseudo-variable}} in my templates/views.

I have a very weird behavior with the parser syntax in my view:

I have this simple $modules array as data that I can print_r() in the view/template

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

If I use basic Lex syntax, I can display the name_mdl without problem with

{{modules}} {{name_mdl}} {{/modules}} => output 'users' and 'actions'

but when I use the conditional 'if' inside the loop, I get a wrong matching when I test if a variable exists :

{{modules}}

    {{name_mdl}} 

{{/modules}}

this outputs correctly users actions

{{modules}}

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

{{/modules}}

but this does not output anything:

{{modules}}

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

{{/modules}}

This outputs 'name_mdl NOT OK users name_mdl NOT OK actions' the parser displays correctly a variable it just recused as existing in the condition..

I've searched a bit everywhere but it looks like an orphan problem, can't find a clue anywhere.


Solution

  • Well.. I managed to get rid of this strange behavior, but I'm not sure which part of the changement I've made solved the problem ...So for what it's worth :

    The error I faced was that in a loop {{list_of_things}}{{/list_of_things}} the checking of an existing variable with conditional if exists wasn't possible, though the display of this variable worked fine :

    {{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}}
    

    I did two things after that, and got rid-off the problem...


    1- I moved the declaration of the Lex Parser $this->parser = new Lex\Parser();

    from my front controller application/modules/my_module/module_controller.php

    into the constructor of my extending core controller class application/core/MY_Controller.php

    2- I cleaned up my views folder cause there where some double file from earlier development :

    to be noted : the view called was and is application/modules/my_module/views/theme/my_template.php

    • before :

      modules/my_module/views/ my_template.php

      modules/my_module/views/theme/ my_template.php

    • after :

      modules/my_module/views/

      modules/my_module/views/theme/ my_template.php


    So my best guess is that HMVC messed a bit the Lex Parser with the 'loaded_paths', and that two views with the same name in the same module (even though not in the same directory) can lead to unexpected behavior .. but I don't see why the hell that would change the conditionals of the parser ...