2011-07-08 14 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は、次のエラーがスローされます。 警告メッセージ::preg_match_all() [機能

A PHPエラーは重大度が発生しました。 preg-match-all]:コンパイル 失敗:オフセット2で何も繰り返されません。 ファイル名:libraries/Parser.php Line 番号:474

私はライブラリがネストされた配列をサポートしていないと思っています。複数のサブアレイが必要です。図書館には多くのテストがあります。

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

       ) 

具体的なテストがあり、ビューで正しくレンダリングされます。しかし、あなたが見ることができるように、私の要件はそれがさらに一層進むということです。

誰かがこのライブラリを使用していますか?同様の問題が発生しましたか? そうでない場合は、CodeIgniterテンプレートの解析には何を使用しますか?それはどのようにネストされますか?私はすべての提案に開放されており、必要に応じて別の図書館に移動します。

答えて

3

CodeIgniterのとパーサは、私が個人的に問題を持っていたものです。うまくサポートされているライブラリを見つけることは容易ではありませんが、そこにいくつかのまともなものがあります。

私が使用しているのはドゥーーですが、それは私が試した唯一のものでした。それは、それを使用して私の時間から、合理的にサポートされています。それはネストされたループをサポートし、かなりまともなキャッシュシステムを持っています..私は個人的にもSmartyのように重いとは思いません。

がDwoo CodeIgniterのラッパーが男フィルチョウザメを呼び出して、あなたがそれをここに見つけることができますによって書かれている:

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

あなたはここにDwooに関する詳細な情報を見つけることができます。

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

をそして、それがサポートしている機能のいくつかへのリンクをheresします(私はこのページをもともと、それがナビゲーションペインハハにあるにもかかわらず見つけることができなかった)

01これは、ウィキにすべてがあります

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

そして、それはあなたがそれがやりたいしない場合は、それを拡張することは非常に簡単です... ..幸運!

0

残念ながら、これはCodeIgniterのバグだと思われます。私が見た最も初期のリファレンスは2009年です(何とか元々ここに間違ったリンクをコピーしましたが(今はリンクを見つけることができません)...消耗してしまいますか?とにかく、Wesley Murch out)、私はバグを修正してもそれを見ることはできません。

だから、何が問題なのですか?数値インデックスは面倒です。それを修正するにはいくつかの方法があります。まず、ビューを文字列にロードし、配列と同様に操作して結果を出力することができます。(悲惨な音)

または、次のような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

@Wesley Murch 'twas間違ったリンクと私は今すぐ右のものを見つけることができません。 – cwallenpoole

0

それを修正するための簡単な方法があります:モデル

0

の最初の変数として 入れアレイこの機能は、内蔵のテンプレートクラスに含まれています。 (最初に質問を投稿したときに存在していたかどうかはわかりませんが、今はそこにあります。私はそれを自分で使います)。このトリックは、パーサーに渡すための適切な配列構造を作成することです。このサンプルをライブページでテストしましたが、CI 2.1.3で100%動作します。

具体的な例として、ホテルで利用できる一連の部屋を最小限のフォーマットで表示するこのコードを検討し、旅行ごとに1日あたりの料金を表示します。これは私がこの例で正常に使用される配列である

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 

:(この例では2日、)

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

うちでは、に似て置きます。

> 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 
関連する問題