Почему эта функция PHP не передает все переменные данные?
Я борюсь с этим с корзиной покупок 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. Я просто не знаю, куда еще пойти с этим. Ошибка, которую я получаю с кодом ниже: Примечание: неопределенная переменная: childrenTree в /include/display/HomeCategoryList.php в строке 31
Но childrenTree определяется в функции _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";
}
}
Если вы видите что-то сразу, я упустил из виду или думаю, что вы знаете, в чем проблема, пожалуйста, укажите мне правильное направление. Я был в этом в течение нескольких дней.:)
Спасибо!
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
}
}
Кстати, если приведенный выше фрагмент кода является вашим стилем кодирования (а не проблемой при вставке кода в stackru), вы, вероятно, должны изменить его.