Почему эта функция PHP не передает все переменные данные? - PullRequest
0 голосов
/ 10 января 2012

Я снова сражаюсь с корзиной покупок 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 Ответ

1 голос
/ 10 января 2012

Очевидная проблема, которую я вижу со второй частью кода, заключается в том, как вы определили $ 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), вам, вероятно, следует его изменить.

...