我将再次使用Interspire购物车和狡猾的编码技巧来与之抗衡。 :)
我的目标是创建一个类似于BHphotovideo.com首页上的类别栏的类别列表(高高吗?)。 :)我相信这是免费购物车附带的功能,但不是ISC中预先内置的功能。我只想要所有顶级类别的可单击列表,其父类别下有子类别。当我将其粘贴到空白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
但是children_tree是在_getcats函数中定义的,而$ categorynames是在脚本中没有抱怨的,因此我认为它将$ categorynames的数据而不是$ childrenTress传递给renderTree函数。它是否正确?
同样对于原始代码,功能_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";
}
}
如果您立即发现任何问题,那么我已经忽略了或认为您可能知道问题出在哪里,请向我指出正确的方向。我已经待了好几天了。 :)
谢谢!
最佳答案
我在代码的第二部分看到的明显问题是您定义$ 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上的问题),则可能应该更改它。