【发布时间】:2013-05-29 20:13:05
【问题描述】:
我需要将嵌套集树渲染为具有无限深度的 li 结构。虽然我了解如何在普通 php 中执行此操作(例如:PHP: How to generate a <ul><li> tree in an xml2assoc array result?),但我讨厌回显 html 标记并希望在模板中完成它。 PHP 可以作为模板语言吗?我应该在哪里定义递归函数?
【问题讨论】:
我需要将嵌套集树渲染为具有无限深度的 li 结构。虽然我了解如何在普通 php 中执行此操作(例如:PHP: How to generate a <ul><li> tree in an xml2assoc array result?),但我讨厌回显 html 标记并希望在模板中完成它。 PHP 可以作为模板语言吗?我应该在哪里定义递归函数?
【问题讨论】:
对我来说,我取决于每次迭代需要多少“代码”。
对于简单的树,我只想在视图文件的顶部声明一个函数。 (因为我认为该函数在那个单独的文件中只有真正的价值)。
对于渲染更多的树,我会创建一个单独的部分文件。该文件可以在视图文件和部分文件本身中调用。
您还可以创建一个帮助文件,在特定页面上使用它,放置比部分更有意义且更容易实现(并且您可以使用所有其他帮助函数和 symfony 函数)
【讨论】:
嗯,这是我的解决方案:
<?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> </ins><?php echo $record->$field;?></a>
<?php $prevLevel = $record['level']; $is_first = false; ?>
<?php endforeach; ?>
</ul>
</div>
<?php endif;?>
【讨论】:
一个简单的例子:
<?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>
【讨论】: