2011-03-14 71 views

回答

2

對我來說,我依賴於每次迭代需要多少「代碼」。

對於簡單的樹,我只需在視圖文件的頂部聲明一個函數。 (因爲我認爲這個函數在這個單獨的文件中只有真正的價值)。

對於有更多渲染的樹,我會創建一個單獨的部分文件。該文件可以在視圖文件和部分文件本身中調用。

你也可以創建一個幫助文件,您的特定網頁上使用,把除部分會更有意義和更容易實現(你可以使用所有其他的輔助功能和symfony的功能)

+0

嘿,謝謝。在這種情況下,表現助手與部分表現如何? – Dziamid 2011-03-14 12:48:04

+0

我認爲helpers可能會更快一些,因爲它們一旦加載就可以訪問。 partials是遞歸加載的,因此每次都必須通過Symfony視圖堆棧。但是你也可以緩存partials,partials有更簡潔的代碼。 (對用戶而言更易讀),並且在MVC方面更純粹。 – 2011-03-14 14:49:05

0

HM,這裏是我的sollution:

<?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,那麼您可以使Lambda函數渲染您的樹。 – cuhuak 2011-03-14 09:19:17

+0

你可以舉個例子,在單獨的答案中使用lamdba嗎?這種方法看起來很有前景。 – Dziamid 2011-03-14 13:23:11

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>