0

首先是一些代码,我的帖子末尾的问题。我的代码从 DB 生成列表 li ul:

示例 SQL:

   CREATE TABLE IF NOT EXISTS  `gallery` (
  `idgallery` int(11) NOT NULL,
  `name` varchar(45) NOT NULL,
  `parent` varchar(45) DEFAULT '0',
  `type` varchar(45) DEFAULT 'category',
  `menu` varchar(45) NOT NULL,
  PRIMARY KEY (`idgallery`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `gallery` (`idgallery`, `name`, `parent`, `type`, `menu`) VALUES
(1, 'Gallery', '0', 'Gallery', ''),
(2, 'Name', '1', 'category', ''),
(3, 'Name2', '0', 'category', ''),
(4, 'Name3', '3', 'category', ''),
(5, 'qwerty', '4', 'category', ''),
(6, 'child', '3', 'category', ''),
(7, 'child', '1', 'category', '');

此代码在迁移到 ZendFW 之前运行良好:

$ro=mysql_query("SELECT * FROM gallery");
$rows=array();

while($rowek=mysql_fetch_object($ro))
{
 $rows[]=$rowek;
} 

echo mapTree($rows,0,"category");

function children($rows, $id) {
foreach ($rows as $row) {
if ($row->parent == $id)
return true;
}
return false;
}

function mapTree($rows, $parent = 0, $class = "none") {
$result = "<ul>";
foreach ($rows as $row) {
    if ($row->parent == $parent) {
    $result.= "<li class='$class'>$row->name";
        if (children($rows, $row->idgallery))
        $result.= mapTree($rows, $row->idgallery, "category");
    $result.= "</li> ";
    }
}
$result.= "</ul>";

return $result;
}

在 Zend FW 中,我使用的是 Action Helper。*所有对象数据库都传递给我的助手(error_log),但它只显示:*

Gallery
      Name

两条记录良好的秩序/样式......但是另外 5 条在哪里?

索引操作:

    //preDispatch()
    Zend_Controller_Action_HelperBroker::addPath(APPLICATION_PATH .'/controllers/helpers');
    //IndexAction()
    $gallery = new Application_Model_DbTable_Gallery;

    $request = $gallery->fetchAll($gallery->select()->order("parent"));

    $helper = $this->_helper->gallery->index($request);

    $this->view->gallery = $helper;

动作助手

class Zend_Controller_Action_Helper_Gallery extends Zend_Controller_Action_Helper_Abstract{

function index($rows){
    echo $this->mapTree($rows,0,"");
}

function children($rows, $id) {
foreach ($rows as $row) {
if ($row->parent == $id)
return true;
}
return false;
}

function mapTree($rows, $parent = 0, $class = "brak") {
$result = "<ul>";
foreach ($rows as $row) {
    if ($row->parent == $parent) {
    $result.= "<li class='$class'>$row->name";
        if ($this->children($rows, $row->idgallery))
        $result.= $this->mapTree($rows, $row->idgallery, "category");
    $result.= "</li> ";
    }
}
$result.= "</ul>";

return $result;
}

}

并且还查看...

<?php $this->gallery;?>

我的问题是 - 为什么我在 ZF 中的代码无法完成?

4

1 回答 1

0

两条记录良好的秩序/样式......但是另外 5 条在哪里?

你的函数做了你告诉它的事情,只处理了父级为“0”的那些行:
if ($row->parent == $parent)echo $this->mapTree($rows,0,"");

如果您打算将“0”表示为 false 或 null,就像您所做的那样,您可能希望重新考虑如何实现该功能。

与Zend Framework 中的View 助手一样, Action 助手似乎在返回值时工作得最好。在这种情况下,您可能还希望实现direct()这样您就不必->index()每次都调用:

class Zend_Controller_Action_Helper_Gallery extends Zend_Controller_Action_Helper_Abstract
{    
    //we're using php 5, visibility matters
    public function direct($rows){
        return $this->mapTree($rows,0,"");
    }
    protected function children($rows, $id) {
    //truncated
    }
    protected function mapTree($rows, $parent = 0, $class = "brak") {
    //truncated
    }
}

现在,当您调用此操作助手时:

 $helper = $this->_helper->gallery($request);

您的视图也需要修复:

<!-- remember to 'echo' everything in the view -->
<?php echo $this->gallery;?>

至于为什么您的旧代码有效而 ZF 无效,我不能说。然而,我怀疑大部分问题在于旧代码中的Mysql函数与 Zend Framework 中的MysqliPDO数据库适配器之间的差异。

于 2012-12-31T02:07:13.287 回答