Avatar billede steven Nybegynder
20. maj 2005 - 13:58 Der er 9 kommentarer og
1 løsning

Variable eller referencer?

Hej,

Jeg er i gang med at lave en grundstruktur til en hjemmeside, og har lidt problemer med at finde ud af hvordan jeg skal håndtere objekter. Primært er der to class'er: tree og node, de kommer her i en kort udgave:

TREE............................................................
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::


class Tree {
  var $start;  //Reference to the first element
  var $cursor;  //Reference to the current element
 
  //Constructor
  //Pre:  Nothing
  //Post: The tree is loaded, $this->start and $this->cursor contains a references to the first element.
  //      If the tree is loaded correctly, the function returns true, otherwise it returns false
  function Tree()
  {
    $temp_start = $this->LoadTree("");
    if(is_object($temp_start))
    {
      $bool1 = $this->SetStart($temp_start);
      $bool2 = $this->GoToFirst();
     
      if($bool1 && $bool2)
      {
        return true;
      }
      else
      {
        echo "class_tree.inc - Tree: Something went wrong, SetStart: $bool1, GoToFirst: $bool2.";
        return false;
      }
    }
    else
    {
      return false;
    }
  }
 
  //Function LoadTree
  //Pre:  A node is created and set as reference to this function
  //Post: The subtree is created and the first element in the sequense is returned.
  function LoadTree($NodeObj)
  {
    if(is_object($NodeObj))
    {
      $temp_nodeid = $NodeObj->GetNodeId();
    }
    else
    {
      $temp_nodeid = 0;
    }
   
    $first = NULL;
    $temp_cursor = NULL;
     
    $SQL = "SELECT NodeId FROM Node WHERE ParentNode='" . $temp_nodeid . "' ORDER BY NodePriority";
    $RS = sql_forespoerg($SQL);
   
    for($j=0; $j<sizeof($RS); $j++)
    {
      extract($RS[$j]);
      //Create new page
      $temp_node = new Node($NodeId);
     
      //Load the submenu for this new item...
      $temp_node->SetChild($this->LoadTree($temp_node));
     
      if($j==0)
      {
        //... and assign to the variable first (only first object)
        $first = $temp_node;
        $temp_cursor = $temp_node;
      }
      else
      {
        //... or assign to the end of the row of pages
        $temp_cursor->SetNext($temp_node);
       
        //Move to the new item
        $temp_cursor = $temp_cursor->GetNext();
      }
    }
    //Returns the first item, and NULL if there isn't any item
    return $first;
  }
}

NODE............................................................
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

class Node {
  var $nodeid;
  var $level;
  var $nextNode;
  var $previousNode;
  var $childNode;
  var $parentNode;
  var $content;
 
  //Constructor
  function Node($id)
  {
    $this->SetNodeId($id);
   
    //Loading content into Node
    $this->content = Array();
    $SQL = "SELECT NodeInstanceId FROM NodeInstance WHERE NodeId = '" . $this->GetNodeId() . "' ORDER BY LanguageId";
    $RS = sql_forespoerg($SQL);
   
    for($i=0; $i<sizeof($RS);$i++)
    {
      extract($RS[$i]);     
      $this->SetContent(new NodeInstance($NodeInstanceId));
    }
   
    //Saving the parent-info into the pageobject
    $SQL = "SELECT ParentNode FROM Node WHERE NodeId = '" . $this->GetNodeId() . "'";
    $RS = sql_forespoerg($SQL);
    extract($RS[0]);
    $this->SetParent($ParentNode);
     
    //Setting Level
    $this->SetLevel();
  }
 
 
  //////////////////////////////////////////////////////////////////////////////
  //                              SET FUNCTIONS                              //
  //////////////////////////////////////////////////////////////////////////////
 
  function SetNodeId($var)
  {
    $this->nodeid = $var;
  }
 
  function SetNext(&$NodeObj)
  {
    $this->nextNode = $NodeObj;                                                    //Der skal muligvis tilføjes mere til denne funktion?!
  }
 
  function SetPrevious(&$NodeObj)
  {
    $this->previousNode = $NodeObj;                                                //Der skal muligvis tilføjes mere til denne funktion?!
  }
 
  function SetChild(&$NodeObj)
  {
    if($NodeObj != "")
    {
      //If this already has a child, then this is put as 'next' to new child
      if(is_object($this->GetChild()))
      {
        $NodeObj->SetNext($this->GetChild());
      }
     
      $this->childNode = $NodeObj;          //Assign NodeObj to this->child
      $this->childNode->SetParent($this);    //Set parent for the new child
      $this->childNode->SetLevel();          //Set level for the new child
      return true;
    }
    else
    {
      return false;
    }
  }
 
  function SetParent(&$NodeObj)
  {
    $this->parentNode = $NodeObj;
  }

  //////////////////////////////////////////////////////////////////////////////
  //                              GET FUNCTIONS                              //
  //////////////////////////////////////////////////////////////////////////////
 
  function GetNodeId()
  {
    return $this->nodeid;
  }
 
  function GetNext()
  {
    return $this->nextNode;
  }
 
  function GetPrevious()
  {
    return $this->previousNode;
  }
 
  function GetChild()
  {
    return $this->childNode;
  }
}

Der hvor jeg har brug for hjælp er: når jeg opretter et tree object, så loader den alt in fra db, men mit tree består kun af den første node. Det lader til, at der er nogle problemer med mine referencer - er lidt i tvivl om jeg skal gøre følgende:
$temp_cursor = $this->GetCursor()

eller...
$temp_cursor = &$this->GetCursor()

Dette vil jeg gerne have hjælp til + alt andet der har relevans. Jeg hæver gerne pointantallet hvis dette ønskes.

Mvh, Steven
www.mountfield.dk
Avatar billede horsmark Nybegynder
20. maj 2005 - 16:27 #1
<tanke>
Han skal vel i grunden bruge 2 klasser. Class Tree {} og Class Node Extends Tree{}
</tanke>
Avatar billede horsmark Nybegynder
20. maj 2005 - 16:39 #2
fuck der var allerede 2 klasser *DOH!*
Avatar billede steven Nybegynder
20. maj 2005 - 17:31 #3
Hej Horsmark,

Jep, der er 2 klasser :-)
I den mellemligende periode har jeg læst en masse i manualen omkring referencer mm., og fandt løsningen der, ellers tak for tankerne.

Mvh, Steven
Avatar billede horsmark Nybegynder
20. maj 2005 - 19:41 #4
<?

    class Tree {
      var $aNodes = array();
      var $name;

        function Tree($name){
            $this->name    = $name;
        }

        function &addNode( $sNodeName ){
            $iNodeId    = count($this->aNodes);
            $oNode = new TreeNode( $iNodeId, $sNodeName );
            $this->aNodes[] =& $oNode;
            return $oNode;
        }
    }

    class TreeNode extends Tree {
        var $iNodeId;
        var $sNodeName;

        function TreeNode($iNodeId, $sNodeName){
            $this->iNodeId        = $iNodeId;
            $this->sNodeName    = $sNodeName;
        }

        function setName( $sName ){
            $this->sNodeName = $sName;
        }
    }

    $oTree = new Tree("juletræ");
    $oGren                =& $oTree->addNode("første gren");
    $oJulestjerne    =& $oTree->addNode("julestjerne");
    $oGren->setName("hallo!");
    print "<pre>";
    print_r($oTree);
?>
Avatar billede horsmark Nybegynder
20. maj 2005 - 19:43 #5
måske det kan give noget insp :-)
Avatar billede horsmark Nybegynder
20. maj 2005 - 19:44 #6
foriøvrigt kan du have alt data i én tabel (det gør jeg)

node_id //noden id ;-)
node_par_id //nodens forældre
node_seq_id //nodens position på forældren
node_name //nodens navn
node_desc //nopdens beskrivelse
node_content //node indhold
Avatar billede horsmark Nybegynder
20. maj 2005 - 19:48 #7
med lidt snilde kan du ombygge addNode på Tree så der laves et check for om der er et node_id med, hvis ja indsæt noden på den medsendte node_id.
Avatar billede horsmark Nybegynder
20. maj 2005 - 19:51 #8
derigennem extender du Tree rigtigt med TreeNode klassen og kan lave følgende:
$oTree = new Tree("juletræ");
$oGren        =& $oTree->addNode("første gren");
$oJulestjerne =& $oTree->addNode("julestjerne");
$oGrenPaaGren =& $oGren->addNode("grenpågrenen");
$oGrenPaaGrenPaaGren =& $oGrenPaaGren->addNode("grenpågrenenPÅgrenenenenenenHAHA");
Avatar billede horsmark Nybegynder
20. maj 2005 - 19:54 #9
OG for at gøre dit liv surt så laver du opslag i basen for hver enkelt node det behøver du ikke med ovenstående db model der kan du loade alle noder på én gang ind i et arrya og derigennem lave et rekursivt loop der add´er noderne ;-)
Avatar billede steven Nybegynder
21. maj 2005 - 17:28 #10
Hej horsmark,

Har stadig lidt probs med mine classer - er dog ikke interesserede i at slå dem sammen som du foreslår. Hvormange points vil du afkræve mig for at kigge filerne igennem og komme med nogle forbedringsforslag/rette fejl? :-)

Mvh, Steven
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester