【问题标题】:Symfony: recursive call in templateSymfony:模板中的递归调用
【发布时间】:2013-05-29 20:13:05
【问题描述】:

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

【问题讨论】:

    标签: php symfony1


    【解决方案1】:

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

    对于简单的树,我只想在视图文件的顶部声明一个函数。 (因为我认为该函数在那个单独的文件中只有真正的价值)。

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

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

    【讨论】:

    • 嘿,谢谢。在这种情况下,性能助手与部分性能如何?
    • 我认为助手可能会更快一些,因为一旦加载它们就可以访问。部分是递归加载的,所以每次都必须通过 Symfony 视图堆栈。但是您也可以缓存部分内容,并且部分内容的代码更加简洁。 (对用户来说更易读),并且在 MVC 角度上更纯粹。
    【解决方案2】:

    嗯,这是我的解决方案:

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

    【讨论】:

    • 请注意,如果您的 php 版本是 5.3,那么您可以使用 Lambda 函数来渲染您的树。
    • 您能否在单独的答案中举一个使用 lamdba 执行此操作的示例?这种方法看起来很有前途。
    【解决方案3】:

    一个简单的例子:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-30
      相关资源
      最近更新 更多