Symfony: рекурсивный вызов в шаблоне - PullRequest
0 голосов
/ 14 марта 2011

Мне нужно визуализировать дерево вложенных множеств как li-структуру с неограниченной глубиной.Хотя я понимаю, как сделать это на простом php (например, здесь: PHP: как создать дерево

), я ненавижу выводить теги html и хотел бысделать это в шаблоне.Возможно ли использование PHP как языка шаблонов?Где я должен определить рекурсивную функцию?

Ответы [ 3 ]

2 голосов
/ 14 марта 2011

Для меня я зависит от того, сколько «кода» необходимо в каждой итерации.

Для простых деревьев я бы просто объявил функцию в верхней части файла представления. (Поскольку я думаю, что эта функция имеет только реальное значение в этом отдельном файле).

Для деревьев с немного большим рендерингом я бы создал отдельный частичный файл. Этот файл может быть вызван в файле представления и в самом частичном файле.

Вы также можете создать вспомогательный файл, который вы используете на этой конкретной странице, и поместить его, чем частичный, будет более понятным и проще в реализации (и вы можете использовать все другие вспомогательные функции и функции Symfony)

0 голосов
/ 29 мая 2013

простой пример:

<?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>
0 голосов
/ 14 марта 2011

хм, вот мое решение:

<?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;?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...