ZF2 从递归 PHP 函数中分离 HTML

Posted

技术标签:

【中文标题】ZF2 从递归 PHP 函数中分离 HTML【英文标题】:ZF2 Seperate HTML from Recursive PHP function(s) 【发布时间】:2013-03-28 15:47:26 【问题描述】:

我正在尝试将 html 元素与 Zend Framework 2 中的 php 代码分开,但我不知道如何解决这个问题/分开。我目前正在回显那些完成这项工作的 HTML 元素。但是必须有一种方法可以将 HTML 与 PHP 分开,而不是回显 HTML 元素。

目前我制作了一个viewhelper,它可以帮助我为其他模块生成这个treeMap,因为这些模块也将使用这个特性,只要这个helper 带有一个treeMap。 categoryTreeMap 包含类别(Doctrine 2 ORM)对象的树形图。

这是我目前得到的:

namespace Application\View\Helper;

use Zend\View\Helper\AbstractHelper;

class CategoryTreeMapHelper extends AbstractHelper

    public function __invoke($categoryTreeMap)
    
        echo "<ol class=\"sortable\">";
        foreach ($categoryTreeMap as $category) 
            $this->showCategories($category);
        
        echo "</ol>";
    

    public function showCategories($category)
    
        echo "<li><div>" . $category->name . "</div>";
        if (isset($category->childs)) 
            echo "<ol>";
            foreach ($category->childs as $child_category) 
                $this->showCategories($child_category);
            
            echo "</ol>";
        
        echo "</li>";
    

有关如何解决此问题的任何建议,方法是将 HTML 与 PHP 回显分开。

【问题讨论】:

除了接受单个内容参数并循环遍历它之外,您的助手是否还在做其他事情?如果没有,使用部分模板可能会更好地解决这个问题 我只是构建一个字符串并将其返回以进行回显。一般来说,我不喜欢从助手/函数中呼应。 这个 viewhelper 没有做任何其他事情,除了打印带有对象名称的树形图列表,由参数接收。问题是我真的不知道如何使用部分,你能给他们一个参数来读取树图吗? @Crisp 那么请看下面我的回答 @Sam,我不同意你的前提,我只是提供一种替代方法来解决 OP 的要求。也就是说,当需要更改以迎合底层列表的某些特定显示时,覆盖模板可能比换出或以其他方式编辑帮助代码更容易。 【参考方案1】:

如果您的助手仅由这两种方法组成,您可以通过使用部分助手来复制模板中的功能

为您的树形图容器创建一个部分

// view/partial-treemap.phtml
<ol class="sortable">
    <?php foreach ($this->categoryTreeMap as $category) :
        echo $this->partial('partial-category', array('category' => $category));
     endforeach; ?>
</ol> 

为递归部分创建一个部分(它为孩子递归地调用自己)

// view/partial-category.phtml
<li>
    <div><?php echo $category->name; ?></div>
    <?php if (isset($category->childs)) : ?>
    <ol>
        <?php foreach ($category->childs as $child_category) :
            echo $this->partial('partial-category', array('category' => $child_category));
        endforeach; ?>
    </ol>
    <?php endif; ?>
</li>

那么在你的控制器动作视图中你只需要一行

<?php echo $this->partial('partial-treemap', array('categoryTreeMap' => $categoryTreeMap)); ?>

【讨论】:

感谢您的快速响应,对我帮助很大,效果很好! =) 正是我需要的。还有一个问题;它循环遍历所有对象并加载子对象。但是如何避免它再次将孩子加载为根类别? 在树形图中找出:&lt;?php if(!$category-&gt;getParent()): ?&gt;

以上是关于ZF2 从递归 PHP 函数中分离 HTML的主要内容,如果未能解决你的问题,请参考以下文章

将嵌套数组转换为嵌套 html 块的递归 php 函数

用php从mysql列数据中分离值

在 MySQL PHP 中从多行结果中分离行

php递归问题:

递归PHP函数写入外部数组

PHP之递归函数