2011-03-14 73 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>