Я снова сражаюсь с корзиной покупок 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";
}
}
Если вы видите что-то сразу, я упустил из виду или думаю, что вы, возможно, знаете, в чем проблема, пожалуйста, укажите мне правильное направление. Я был в этом в течение нескольких дней. :)
Спасибо!