Symfony:模板中的递归调用

时间:2011-03-14 01:14:33

标签: php symfony1

我需要将嵌套的树集渲染为具有无限深度的li结构。虽然我理解如何在普通的PHP(例如这里:PHP: How to generate a <ul><li> tree in an xml2assoc array result?)中做到这一点,我讨厌回应html标签,并希望在模板中完成它。 PHP可以作为模板语言吗?我应该在哪里定义递归函数?

3 个答案:

答案 0 :(得分:2)

对我来说,我依赖于每次迭代需要多少“代码”。

对于简单的树,我只是在视图文件的顶部声明一个函数。 (因为我认为该功能在该单独的文件中只有实际价值)。

对于有更多渲染的树,我会创建一个单独的部分文件。该文件可以在视图文件和部分文件本身中调用。

您还可以创建一个帮助文件,您在该特定页面上使用它,而不是部分更有意义并且更容易实现(并且您可以使用所有其他帮助函数和symfony函数)

答案 1 :(得分:0)

嗯,这是我的解决方案:

<?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;?>

答案 2 :(得分: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>