【问题标题】:Extended Template Parser: CodeIgniter... Issue with Nested Arrays扩展模板解析器:CodeIgniter... 嵌套数组问题
【发布时间】:2011-07-08 02:54:25
【问题描述】:

我目前正在为 CodeIgniter 使用 Extended Template Parser Library。尝试模板解析嵌套数组时遇到问题。这是我提供给视图的数组:

 Array
    (
                [users] => Array
                    (
                        [0] => Array
                            (
                                [id] => 42
                                [username] => jordanarseno
                                [posts] => Array
                                    (
                                        [0] => Array
                                            (
                                                [id] => 1354
                                                [title] => foo
                                            )
                                        [1] => Array
                                            (
                                                [id] => 1350
                                                [title] => bar
                                            )
                                    )
                            )
                    ) 
    )

我能够呈现用户详细信息...{username}{firstname} 等。但我无法呈现帖子详细信息。

我的模板代码很简单,如下:

{users}
    {username}
    {posts}
        {title}
    {/posts}
{/users}

PHP 抛出以下错误:

遇到 PHP 错误 严重性: 警告消息:preg_match_all() [function.preg-match-all]:编译 失败:在偏移量 2 处没有可重复的内容 文件名:libraries/Parser.php 行 数量:474

我开始认为该库不支持嵌套数组,因为我需要 多个 子数组。该库带有许多测试。有一个特定的测试需要:

 [posts] => Array
        (
            [0] => Array
                (
                    [title] => first post
                    [paras] => Array
                        (
                            [main] => foo
                            [short] => bar
                        )

                )

并在视图中正确呈现它。但是,如您所见,我的要求是进一步深入一层。

还有其他人使用这个库吗?你遇到过类似的问题吗? 如果没有,你用什么来解析 CodeIgniter 模板?它将如何嵌套?我愿意接受所有建议,如果需要,我会搬到另一个图书馆。

【问题讨论】:

    标签: parsing templates codeigniter


    【解决方案1】:

    Codeigniter 和解析器是我个人遇到的麻烦。找到一个支持良好的库并不容易,但有一些不错的库。

    我使用的是 Dwoo,它是我尝试过的唯一一款开箱即用的产品。从我使用它开始,它就得到了相当好的支持;它确实支持嵌套循环并且有一个相当不错的缓存系统。我个人也不觉得它像 Smarty 那样重要。

    Dwoo Codeigniter 包装器是由一个叫 Phill Sturgeon 的人编写的,你可以在这里找到它:

    https://github.com/philsturgeon/codeigniter-dwoo

    您可以在此处找到有关 Dwoo 的更多信息:

    http://wiki.dwoo.org/index.php/Main_Page

    这是它支持的一些功能的链接(我最初很难找到这个页面,即使它就在导航窗格中哈哈)

    http://wiki.dwoo.org/index.php/Plugins

    如果它没有达到你想要的效果,扩展它非常简单......它都在 Wiki 中......祝你好运!

    【讨论】:

      【解决方案2】:

      不幸的是,这似乎是 CodeIgniter 中的一个错误。我看到的最早的参考资料是 2009 年(不知何故我最初在这里复制了错误的链接(现在我找不到链接)......把它归结为精疲力尽?无论如何,感谢 Wesley Murch指出它),但我似乎没有在任何错误修复中看到它。

      那么,问题出在哪里?数字索引很麻烦。有几种方法可以修复它。首先,您可以将视图加载到一个字符串中,并对其以及您的数组进行操作,然后输出结果......(听起来很糟糕)

      或者...您可以尝试修复您拥有的 CI 版本。在 MY_Parser 中,试试这个(完全未经测试,我实际上要注销过夜):

      function _parse_pair($variable, $data, $string)
      {
          $num = is_numeric($variable);
          if (!$num && FALSE === ($match = $this->_match_pair($string, $variable)))
          {
              return $string;
          }
      
          $str = '';
          foreach ($data as $row)
          {
              $temp = $num? $match['1']: $string;
              foreach ($row as $key => $val)
              {
                  if ( ! is_array($val))
                  {
                      $temp = $this->_parse_single($key, $val, $temp);
                  }
                  else
                  {
                      $temp = $this->_parse_pair($key, $val, $temp);
                  }
              }
      
              $str .= $temp;
          }
      
          if(!$num) return str_replace($match['0'], $str, $string);
          return $str;
      }
      

      【讨论】:

      • 仅供参考,您链接到的 2009 年的线程是关于 RSS 解析器的,不是一回事。 OP 使用的解析器库也是社区构建的第三方库,不包含在 CI 中 - 所以我认为这与 Codeigniter 中的潜在错误无关。
      • @Wesley Murch '这是错误的链接,我现在找不到正确的。
      【解决方案3】:

      有一个简单的方法来解决它: 将数组作为模型中的第一个变量

      【讨论】:

        【解决方案4】:

        此功能包含在内置模板类中。 (我不知道您第一次发布问题时它是否存在,但它现在就在那里,我自己使用它。)诀窍在于创建正确的数组结构以传递给解析器。我刚才在一个实时页面中测试了这个示例,在 CI 2.1.3 中 100% 工作。

        作为一个具体示例,请考虑以下代码,该代码显示(以最少的格式)酒店的一系列可用房间,并按每个房间显示您每天旅行的每日房价。 (在本例中为 2 天。)

        {available_rooms}
            <p>{room_type} {total_rate}</p>
            {room_rates}
                <p>${room_rate} {room_date}</p>
            {/room_rates}
            <hr>
        {/available_rooms}
        

        与输出类似:

        1 King Bed 119.98
         59.99 2013-03-23
         59.99 2013-03-24
        
        1 King Bed 119.98
         59.99 2013-03-23
         59.99 2013-03-24
        
        2 Double Beds 139.98
         69.99 2013-03-23
         69.99 2013-03-24
        
        2 Double Beds 139.98
         69.99 2013-03-23
         69.99 2013-03-24
        

        这是我在这个例子中成功使用的数组。

        > available_rooms > 0 > room_type = 1 King Bed 
        > available_rooms > 0 > total_rate = 119.98 
        > available_rooms > 0 > room_rates > 0 > room_rate = 59.99 
        > available_rooms > 0 > room_rates > 0 > room_date = 2013-03-23 
        > available_rooms > 0 > room_rates > 1 > room_rate = 59.99 
        > available_rooms > 0 > room_rates > 1 > room_date = 2013-03-24 
        > available_rooms > 1 > room_type = 1 King Bed 
        > available_rooms > 1 > total_rate = 119.98 
        > available_rooms > 1 > room_rates > 0 > room_rate = 59.99 
        > available_rooms > 1 > room_rates > 0 > room_date = 2013-03-23 
        > available_rooms > 1 > room_rates > 1 > room_rate = 59.99 
        > available_rooms > 1 > room_rates > 1 > room_date = 2013-03-24 
        > available_rooms > 2 > room_type = 2 Double Beds 
        > available_rooms > 2 > total_rate = 139.98 
        > available_rooms > 2 > room_rates > 0 > room_rate = 69.99 
        > available_rooms > 2 > room_rates > 0 > room_date = 2013-03-23 
        > available_rooms > 2 > room_rates > 1 > room_rate = 69.99 
        > available_rooms > 2 > room_rates > 1 > room_date = 2013-03-24 
        > available_rooms > 3 > room_type = 2 Double Beds 
        > available_rooms > 3 > total_rate = 139.98 
        > available_rooms > 3 > room_rates > 0 > room_rate = 69.99 
        > available_rooms > 3 > room_rates > 0 > room_date = 2013-03-23 
        > available_rooms > 3 > room_rates > 1 > room_rate = 69.99 
        > available_rooms > 3 > room_rates > 1 > room_date = 2013-03-24
        

        【讨论】:

          猜你喜欢
          • 2013-06-14
          • 1970-01-01
          • 2011-05-04
          • 1970-01-01
          • 1970-01-01
          • 2012-12-30
          • 2019-05-13
          • 2012-02-01
          • 2011-10-14
          相关资源
          最近更新 更多