为什么这个PHP函数没有传递所有可变数据?

时间:2012-01-10 18:20:17

标签: php mysql categories interspire-shopping-cart

我正在与Interspire购物车和我狡猾的编码技巧再次斗争。 :)

我的目标是创建一个类似于BHphotovideo.com首页上类别块的类别列表(lofty huh?)。 :)我相信这是一个功能,即使是免费的购物车,但不是预先建在国际学习中心。我只想要一个可点击的列表,其中包含父类别下的子类别的所有顶级类别。当我将它粘贴到一个空白的php文件中时,下面的代码很有用,但是我需要将它集成到ISC中,这样链接就可以点击了,而且列表是一个面板:

<?php
// Make a MySQL Connection
$cn = mysql_connect("localhost", "mydbuser", "password") or die(mysql_error());
mysql_select_db("mydb") or die(mysql_error());

$rs = mysql_query("SELECT categoryid, catparentid, catname FROM isc_categories", $cn) 
or die(mysql_error());

  $childrenTree = array(); //Will store an array of children for each parent
  $categoryNames = array(); //Will store category name for each id

//We fill $childrenTree and  $categoryNames from database
 while($row = mysql_fetch_array($rs)){
 list($id, $parent_id, $category) = $row;     
 $categoryNames[(string)$id] = $category;
 $parent_id = (string)$parent_id;
 if(!array_key_exists($parent_id, $childrenTree)) 
     $childrenTree[$parent_id] = array();
 $childrenTree[$parent_id][] = (string)$id;
}


//Main recursive function. I'll asume '0' id is the root node
 function renderTree($parent = "0"){
global $categoryNames;
global $childrenTree;
if($parent != "0") echo "<li> ", $categoryNames[$parent], "\n";
$children = $childrenTree[$parent];
if(count($children) > 0){ //If node has children
   echo "<ul>\n";
   foreach($children as $child)
      renderTree($child);
   echo "</ul>\n";
 }
 if($parent != "0") echo "</li>\n";
 }
 renderTree();  //This renders the hierarchical tree
?>

以下是我最后(很多)尝试将此代码集成为独立的ISC面板。我只是不知道还有什么可以用的。我在下面的代码中得到的错误是:注意:未定义的变量:第31行的/includes/display/HomeCategoryList.php中的childrenTree

但是childTree在_getcats函数中定义为$ categorynames,脚本没有抱怨,因此我认为它将$ categoriesnames的数据传递给了renderTree函数而不是$ childrenTress。这是对的吗?

同样对于原始代码,函数_getcats不存在并且不是必需的,但是下面的脚本将它添加到面板迫使我将该位代码放入函数中。此外,如果我更改数据库查询语法以匹配其他ISC文件中通常使用的语法,则脚本会抱怨此行的未定义变量:list($ id,$ parent_id,$ category)= $ row。我不知道为什么在查询返回相同结果时会出现这种情况。

<?php

CLASS ISC_HOMECATEGORYLIST_PANEL extends PANEL
{
    public function SetPanelSettings()
    {
    $GLOBALS['SideCategoryListTypeClass'] = 'SideCategoryListClassic';
    $GLOBALS['SNIPPETS']['HomeCategoryList'] = $this->renderTree();
    }

    function _getcats(){
    $rs = mysql_query("SELECT categoryid, catparentid, catname FROM isc_categories") 
            or die(mysql_error());

      $childrenTree = array(); //Will store an array of children for each parent
      $categoryNames = array(); //Will store category name for each id

       while($row = mysql_fetch_array($rs)){
               list($id, $parent_id, $category) = $row;     
               $categoryNames[(string)$id] = $category;
               $parent_id = (string)$parent_id;
               if(!array_key_exists($parent_id, $childrenTree)) 
               $childrenTree[$parent_id] = array();
               $childrenTree[$parent_id][] = (string)$id;
                }
              }

     function renderTree($parent = "0"){
           $this->_getcats();
        if($parent != "0")echo "<li> ", $categoryNames[$parent], "\n";
        $children = $childrenTree[$parent];
        if(count($children) > 0){ //If node has children
           echo "<ul>\n";
           foreach($children as $child)
              renderTree($child);
           echo "</ul>\n";
        }
        if($parent != "0") echo "</li>\n";
        }

        }

如果你发现任何事情,我会忽略或认为你可能知道问题是什么,请指出我正确的方向。我已经好几天了。 :)

谢谢!

1 个答案:

答案 0 :(得分:1)

我在代码的第二部分看到的明显问题是你定义$ childrenTree和$ categoryNames的方式。您可以在本地_getcats()中定义它们,然后从renderTree()中调用它们。您应该更改_getcats()以返回包含两个(树/名称)的新数组,或者在类中声明它们是私有的并像这样调用它们。

CLASS ISC_HOMECATEGORYLIST_PANEL extends PANEL
{
    private $categoryNames = array();
    private $categoryTree = array();

    private function _getCats() {
       ...
       $this->categoryNames[(string)$id] = $category;
       ...
       if(!array_key_exists($parent_id, $this->childrenTree)) 
         $this->childrenTree[$parent_id] = array();

       $this->childrenTree[$parent_id][] = (string)$id;
       ...
    }

    public function renderTree($parent = "0") {
       // Call childrenTree/categoryNames by using the $this directive again
    }
}

如果上面的代码片段是你的编码风格(而不是在stackoverflow上粘贴你的代码的问题),你应该改变它。