2011-07-08 55 views
4

我目前使用CodeIgniter的Extended Template Parser Library。我在嘗試模板分析嵌套數組時遇到了問題。這裏是我給視圖數組:擴展模板解析器:CodeIgniter ...嵌套數組問題

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() [功能。 preg-match-all]:編譯 失敗:無法在偏移量2重複 文件名:libraries/Parser.php行 編號:474

我開始認爲,根據需要,庫不支持嵌套數組,只要多個子數組。圖書館有許多測試。有一個具體的測試需要:

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

       ) 

並將其正確呈現在視圖中。但是,正如你所看到的,我的要求是它進一步進入一層。

其他人是否使用這個庫,並遇到類似的問題? 如果不是,你用什麼CodeIgniter模板解析?它將如何嵌套?我願意接受所有建議,如果需要,我會轉移到另一個圖書館。

回答

3

笨和解析器是我個人遇到了麻煩。找到一個支持良好的圖書館並不容易,但也有一些體面的圖書館。

我使用的是Dwoo,這是我嘗試過的唯一一個直接在盒子裏工作的人。從我使用它的時候起,它得到了相當好的支持;它確實支持嵌套循環,並且有一個相當不錯的緩存系統。我個人認爲它不像Smarty那麼重要。

的Dwoo笨包裝是由一個人寫的叫菲爾鱘魚,你可以在這裏找到它:

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

您可以找到有關Dwoo這裏的更多信息:

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

並且繼承了它支持的一些功能的鏈接(我原本很難找到這個頁面,即使它正好在導航窗格中,哈哈)

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

而如果你想讓它,擴展它是非常簡單的東西沒有做......這一切都沒有在Wiki ..祝你好運!

0

不幸的是,這似乎是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; 
} 
+0

僅供參考,2009年您鏈接到的線程是關於一個RSS解析器,不是一回事。解析器庫OP使用的也是一個社區構建的第三方庫,不包含在CI中 - 所以我認爲這與Codeigniter中的潛在錯誤沒有任何關係。 –

+0

@韋斯利默奇'錯了鏈接,我現在找不到合適的人。 – cwallenpoole

0

有簡單的方法來解決這個問題: 認沽數組作爲模型

0

第一變量,此功能包含在內置的模板類。 (當你第一次發佈這個問題時,我不知道它是否存在,但它現在就在那裏,我自己使用它。)訣竅是創建適當的數組結構傳遞給解析器。我剛剛在一個實時頁面中測試了這個例子,在CI 2.1.3中100%工作。

作爲一個具體的例子,考慮這個代碼顯示(以最小的格式)在酒店可用的一系列房間,並顯示每個房間每天旅行的每日費率。

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

隨着出放類似於(2天,在此實例中):

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