Autor Zpráva
jakubroz
Profil
Zdravim,
dělam takový eshop a právě řešim výpis menu.

Našel jsem něco na intervalu a upravil si to.
takto:
<?php
class Menu
{
  var $id = 0;
  var $name ='';
  var $level = 0;
  var $childNodes = array();

  function __construct($id,$name,$level,$mysqli)
  {
	$this->mysqli = $mysqli;
    $this->id=$id;
    $this->name=$name;
    $this->level=$level;
    $result = $this->mysqli->query("SELECT * FROM products_category WHERE parent_id=$id");
     while ($r = $result->fetch_assoc()) {
      $this->childNodes[] = new Menu($r['id'], $r['category'], $level++, $mysqli);
    }
		$row_t = $this->childNodes[];
		return $row_t;
  }

}
?>


pak to vkladam do šablony kde $row_t procházim jako pole.
momentálně nevim proč mi to nejde, píše mi to chybu:Fatal error: Cannot use [] for reading.

Předem děkuju za rady.
Mastodont
Profil
Tohle je blbě:
$row_t = $this->childNodes[]

Při čtení prvku pole musíš určit jeho index.
jakubroz
Profil
? muzes Napsat jak si to myslel?
Alphard
Profil
? muzes Napsat jak si to myslel?
máte zkušenosti s poli? každý prvek musí být určen indexem, např
$pole = array (1 => "Ahoj", 2 => "Nazdar");

Nazdar má index 2
zápis
$this->childNodes[] = new Menu ...

PHP si automaticky doplní index (o 1 vyšší než současný nejvyšší), ale
$row_t = $this->childNodes[];

selže, PHP neví, který prvek pole má číst
Alphard
Profil
teď se dívám na původní kód, vy asi chcete tohle
$row_t = $this->childNodes;


můžete napsat rovnou
return $this->childNodes;
jakubroz
Profil
jo, pravda. diky

ale ted nevim, jak vložit vrácený výsledek do template systemu, protože je to v konstruktoru a instance objektu se dělá rovnou v tom whilu.

vždycky to dělam nějak takto
$menu = new Menu();
$row = $menu->load()
//pak do tempatu to vkladam takto:
TPL::assignAsLoop('menu',$row);


tady u toho nevim jak to tam vložim, mužete prosím poradit?
BetaCam
Profil
jakubroz

TPL::assignAsLoop('menu', new Menu())


nebo tam stejně tak můžeš dát :


$menu = new Menu();
TPL::assignAsLoop('menu', $menu);
jakubroz
Profil
tak sem to nakonec udělal jinak. pomocí zásobníku a už to chodí.

function getTree($nodeId)
{
	global $mysqli;
	$stack = array();
	$level = 0;
	$query = "SELECT id, category FROM products_category";
	if ($nodeId != "") { $query.= " WHERE id = $nodeId"; } else { $query.= " WHERE id = 0"; }
	$result = $mysqli->query($query);
	if ($mysqli->errno) { throw new Exception($mysqli->error."\nQuery:$query"); }
	$row = $result->fetch_assoc();
	$row['LEVEL'] = 0;
	array_push($stack, $row);
	while (count($stack) > 0) {
	    $r = array_pop($stack);
		$row_c[] = $r;
		$query = "SELECT id, category FROM products_category WHERE parent_id=".$r['id']."";
		$result = $mysqli->query($query);
		if ($mysqli->errno) { throw new Exception($mysqli->error."\nQuery:$query"); }
		if ($mysqli->num_rows > 0) {
			$level = $r['LEVEL'] + 1;
		}
		while ($row = $result->fetch_assoc()) {
			$row['LEVEL'] = $level;
	        array_push($stack, $row);
		}
	}
	return $row_c;	
}


akorad to vypisuje pouze to co je v tý větvy. a potřeboval bych aby byl pořád zobrazen strom hlavních kategorii(to jsou ty co mají parent_id 0). a když na nakou kliknu aby se zobrazily i ty pod větve.

prosim o rady. diky
Pitr
Profil *
a z hlediska poctu sql dotazu jsi na to dival? :)) nebude lepsi jednim sql dotazem hodit vse do pole a pak si si pohrat s urovnemi?
jakubroz
Profil
ja vim no, ale zvolil jsem toto. ted mi jde o to, co sem psal v minulem postu.
tj. akorad to vypisuje pouze to co je v tý větvy. a potřeboval bych aby byl pořád zobrazen strom hlavních kategorii(to jsou ty co mají parent_id 0). a když na nakou kliknu aby se zobrazily i ty pod větve.
jakubroz
Profil
tak tohle už jsem vyřešil, ale nějak blbě se mi počítá $level a ve výsledném poli je u každé položky level 0.
nevíte čim to je?

předem dik za rady

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0