2011-03-14 14 views
0

入れ子セットツリーを無限深度のli構造としてレンダリングする必要があります。私は平凡なPHP(ここでは:PHP: How to generate a <ul><li> tree in an xml2assoc array result?)でそれを行う方法を理解しながら、私はHTMLタグをエコーし​​、それがテンプレートで完了したいと思います。 PHPをテンプレート言語として使用できますか?再帰関数はどこで定義する必要がありますか?symfony:テンプレート内の再帰呼び出し

答えて

2

私にとっては、各反復でどれだけの「コード」が必要かによって異なります。

単純なツリーの場合、ビューファイルの上部に関数を宣言するだけです。 (私は、関数はその別のファイルにのみ実際の値を持つと思うので)。

もう少しレンダリングされたツリーの場合、別の部分ファイルを作成します。そのファイルは、ビューファイルと部分ファイル自体で呼び出すことができます。

あなたはまた、

+0

ねえ、おかげHMは、ここに私のsollutionです。この場合、パフォーマンスヘルパーとパーシャルはどうですか? – Dziamid

+0

私はヘルパーが一度ロードされてからアクセスできるので、少し速くなると思います。パーシャルは再帰的にロードされるので、毎回Symfonyのビュースタックを通過する必要があります。しかし、パーシャルもキャッシュすることができます。パーシャルは、よりクリーンなコードを持っています。 (ユーザーにとってよりわかりやすい)、MVCの観点ではより純粋です。 –

0

を部分的にはより多くの意味を行い、実装することが容易である(そして、あなたが他のすべてのヘルパー関数とsymfonyの機能を使用することができます)するよりも置くあなたがその特定のページで使用するヘルパーファイルを、作成することができます

<?php 
/** 
* @var $records 
* @var $field 
*/ 
?> 

<?php if(isset($records) && is_object($records) && count($records) > 0): ?> 
    <div id="document-nested-set"> 
    <ul class="nested_set_list"> 
    <?php $prevLevel = 0; $is_first = true; ?> 
    <?php foreach($records as $record): ?> 
     <?php if($prevLevel > 0 && $record['level'] == $prevLevel) echo '</li>'; 
     if($record['level'] > $prevLevel) echo '<ul>'; 
     elseif ($record['level'] < $prevLevel) echo str_repeat('</ul></li>', $prevLevel - $record['level']); ?> 
     <?php $rel = $record['lft']=='1'?'root':($record['is_approved'] && $record['is_checked']?'document':'document_grey') ?> 
     <li id ="phtml_<?php echo $record->id ?>" rel="<?php echo $rel ?>" <?php echo $is_first?'class="open"':'' ?>> 
      <a href="#"><ins>&nbsp;</ins><?php echo $record->$field;?></a> 
     <?php $prevLevel = $record['level']; $is_first = false; ?> 
    <?php endforeach; ?> 
    </ul> 
    </div> 
<?php endif;?> 
+0

PHPバージョンが5.3の場合、ラムダ関数を使ってツリーをレンダリングすることができます。 – cuhuak

+0

あなたは別の答えでlamdbaでそれを行う例を挙げることができますか?このアプローチは本当に有望です。 – Dziamid

0

簡単な例:

<?php 
    $input = array('c' => array('c1' => 't1', 'c2' => array('c21' => array('c211' => 't2'), 'c22' => 't3'))); 

    $iterate = function($array) use (&$iterate) { 
     $out = '<ul>'; 
     foreach($array as $key => $child) 
      $out .= '<li>'.$key.': '.(is_array($child) ? $iterate($child) : $child).'</li>'; 
     return $out.'</ul>'; 
    } 
?> 

<html><body><?php echo $iterate($input); ?></body></html> 
関連する問題