PHP-Template-Engine: Menu mit 2x while erstellen

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Benutzeravatar
Wuppi
Mitglied
Beiträge: 734
Registriert: 14.05.2002 23:04
Wohnort: Köln
Kontaktdaten:

PHP-Template-Engine: Menu mit 2x while erstellen

Beitrag von Wuppi »

Hi

ich hab ein kleines Template-Problem. Ich nutze die php-eigene "Template-Engine".

Ich bastel aus 2 While-Schleifen ein dynamisches Menu:

Hauptmenu 1
* Untermenu 1
* Untermenu 3
* Untermenu 4

Hauptmenu 2
* Untermenu 1
* Untermenu 2

Hauptmenu 3
* Untermenu 3
* Untermenu 4

usw.
Kleine Detailinfo: die Menus sind eigentlich Gruppen; eine Untergruppe kann in jeder Hauptgruppe vorkommen, eine Untergruppe kann eine Hauptgruppe sein. Ich fülle eine Datenbank. Ich sage das der Datensatz in die Hauptgruppe "Webseiten" soll und in der Untergruppe "Windows". - jetzt hab ich ein Hauptmenu "Webseiten" und ein Untermenu "Windows"

Das ganze klappt recht gut - solang ich nicht mit Templates arbeite. Bei Template sieht das Ergebnis so aus:
Hauptmenu 1:
* Untermenu 1
* Untermenu 3
* Untermenu 4
* Untermenu 1
* Untermenu 2
* Untermenu 3
* Untermenu 4

Hauptmenu 2:
(wie Hauptmenu 1)

Folgenden Code (gekürzt) nutze ich:

menu.php

Code: Alles auswählen

$result = mysql_query .... // ich hole das "Hauptmenu"
$loop = array();
$loop2 = array();

while($row = mysql_fetch_array($result))
{
// Abfrage zum zählen der Datensätze fürs Hauptmenu (Hauptmenu 1 hat 3 Einträge, Hauptmenu 2 hat 2 usw.)

	array_push(
        $loop,
        array(
           'name' => $row['name']
        )
	);
// in der Templatelosenversion stehen hier jetzt entsprechende HTML-Ausgaben

$result2 = mysql_query(.... // ich hole jetzt die zum aktuellen Hauptmenu gehörigen Untermenus
while($row = mysql_fetch_array($result2))
{
// Abfrage zum zählen der Datensätze fürs Untermenu (Untermenu 1 unter Hauptmenu 1 hat x Einträge)

	array_push(
	$loop2,
	array(
		'name' => $row2['name']
	)
	);
// in der Templatelosenversion stehen hier jetzt entsprechende HTML-Ausgaben
}
}
require_once 'ausgabe.tpl';
ausgabe.tpl:

Code: Alles auswählen

	<?php foreach ($loop as $td_row): ?>
      <?=$td_row['name']?><br>
	  <?php foreach ($loop2 as $td_row2): ?>
	  <?=$td_row2['name']?>*<br>
     <?php endforeach; ?>
	 <br>
	    <?php endforeach; ?>
Warum die oben gezeigte falsche Ausgabe so kommt ist mir durchaus klar:
Ich bastel in der .php mehr oder weniger ja schon die komplette Ausgabe (array_push erweitert das array immer mehr) und hau die so ins tpl. Ich weiß nur nicht wie ich richtig machen kann :|

Eine Lösung wäre wenn ich in der php schon die komplette "ausgabe" erstelle. Dann ohne Array. Aber dann brauch ich auch kein template ;). Ich habe vor das ganze mit 2 Templates zu machen - normal und mobile - da kann ich im php-code kein html gebrauchen.

Gruß
Wuppi
P7BB
Mitglied
Beiträge: 383
Registriert: 15.07.2008 19:40

Re: PHP-Template-Engine: Menu mit 2x while erstellen

Beitrag von P7BB »

Ich versteh nicht so recht, was dein Problem ist.
Mit

Code: Alles auswählen

template...<br  />
<?php for($i = 0;!empty($array[$i]);$i++): ?>
<?=$i;?><br />
<?php for($i2 = 0;!empty($array2[$i2]);$i2++): ?>
-<?=$i2;?><br />;
<?php endfor; ?>
<br />
<?php endfor; ?>
kommst du an das gewünschte ergebnis, solange du kein assoziatives Array benutzt. Falls du doch sowas machen willst, dann benutze doch sowas:
$array[0]['name']
Und jeder Datenbank-Eintrag wird dann in das erste Array geschrieben. ;)
Ein wenig unsauberer (meiner Meinung nach):

Code: Alles auswählen

$array_name[0];
$array_feld2[0];
...
Benutzeravatar
Wuppi
Mitglied
Beiträge: 734
Registriert: 14.05.2002 23:04
Wohnort: Köln
Kontaktdaten:

Re: PHP-Template-Engine: Menu mit 2x while erstellen

Beitrag von Wuppi »

Hi

mist ich dachte ich hätte es gut beschrieben :|

Das Problem ist halt das bei meinem Code das array $loop2 gefüllt wird, und gefüllt wird und gefüllt wird. Im template wird das komplette $loop2 ausgeben ... was natürlich nicht richtig ist. (Hauptmenu 1 -> untermenu 1, untermenu 2, untermenu 1, untermenu 2; Hauptmenu 1 hat aber nur 2 Untermenus, Hauptmenu 2 hat weitere 2 Untermenus)

Deine Hilfe versteh ich leider nicht :|
Was mir wohl einleuchtet -> ich muss beide Variablen von mir $row['name'] (1. while; hauptgruppe) und $row2['name'] (2. while; untergruppe) miteinander verknüpfen. Über die arrayfunktion. Mein Fehler bisher war das ich 2 von einander getrennte arrays gefüllt habe (eins in der 1. while, und eins in der 2. while) ... Also brauch ich EIN array wo beide Daten verknüpft sind:

Hauptgruppe 1 => Untergruppe 1
Hauptgruppe 1 => Untergruppe 2
Hauptgruppe 1 => Untergruppe 4

Jetzt gibt es keine Untergruppen mehr die zur Haupgruppe 1 gehören, also geht die 1. While in die nächste Runde usw.

Das Array befülle ich daher in der 2. WHILE-Schleife mit beiden Daten. Aber wie? Das leuchtet mir noch net so ein. (und wie ich die Daten aus dem array rausbekomme).

Edit: ich komme der sache näher ;)
<? print_r($array); ?> im template sagt mir: Array scheint richtig gefüllt zu sein

Code: Alles auswählen

Array ( [0] => Array ( [Hauptgruppe1] => Untergruppe1 ) [1] => Array ( [Hauptgruppe1] => Untergruppe2 ) [2] => Array ( [Hauptgruppe1] => Untergruppe4 ) [3] => Array ( [Haupgruppe2] => Untergruppe1 ) [4] => Array ( [Haupgruppe2] => Untergruppe3 ) [5] => Array ( [Haupgruppe2] => Untergruppe5 ) [6] => Array ( [Haupgruppe2] => Untergruppe6 ) ) 
oder? Jetzt muss ich das nur noch ausgeben.

Der Code zum befüllen (in der 2. While-Schleife [Untergruppe])

Code: Alles auswählen

					array_push(
					$array, array(
					$row[name] => $row2[name]
					));
$row[name] = Hauptgruppe
$row2[name] = Untergruppe


Gruß
P7BB
Mitglied
Beiträge: 383
Registriert: 15.07.2008 19:40

Re: PHP-Template-Engine: Menu mit 2x while erstellen

Beitrag von P7BB »

Wuppi hat geschrieben:<? print_r($array); ?> im template sagt mir: Array scheint richtig gefüllt zu sein

Code: Alles auswählen

Array ( [0] => Array ( [Hauptgruppe1] => Untergruppe1 ) [1] => Array ( [Hauptgruppe1] => Untergruppe2 ) [2] => Array ( [Hauptgruppe1] => Untergruppe4 ) [3] => Array ( [Haupgruppe2] => Untergruppe1 ) [4] => Array ( [Haupgruppe2] => Untergruppe3 ) [5] => Array ( [Haupgruppe2] => Untergruppe5 ) [6] => Array ( [Haupgruppe2] => Untergruppe6 ) ) 
oder? Jetzt muss ich das nur noch ausgeben.

Der Code zum befüllen (in der 2. While-Schleife [Untergruppe])

Code: Alles auswählen

					array_push(
					$array, array(
					$row[name] => $row2[name]
					));
$row[name] = Hauptgruppe
$row2[name] = Untergruppe


Gruß
Joa, schon ein bisschen ;)
Ich persönlich würde es aber so machen:
$array[0][0] entspricht Hauptgruppe 1 und Untergruppe 1
$array[1][0] entspricht Hauptgruppe 2 und Untergruppe 1
$array[1][1] entspricht Hauptgruppe 2 und Untergruppe 2
Mit Nummern ist es später leichter auszulesen, nämlich so:

Code: Alles auswählen

template...<br  />
<?php for($i = 0;!empty($array[$i][0]);$i++): ?> // Sofern es mindestens eine Untergruppe in der Hauptgruppe $i gibt:
<?=$i;?><br />
<?php for($i2 = 0;!empty($array[$i][$i2]);$i2++): ?> // Alle Untergruppen der Hauptgruppe $i ausgeben
-<?=$i2;?><br />;
<?php endfor; ?>
<br />
<?php endfor; ?>
Eintragen lassen kannst du es so:

Code: Alles auswählen

$array = array();
while(...) { // Hauptgruppen auslesen
 $array[$hauptgruppe] = array(); // $hauptgruppe muss bei 0 beginnen... wenn nicht, dann musst du im template $i und $i2 bei 1 beginnen lassen ;)
 while(...) { // Untergruppen auslesen und in die entsprechende Hauptgruppe eintragen
  $array[$hauptgruppe][] = "Untergruppe 1";
 }
}
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Re: PHP-Template-Engine: Menu mit 2x while erstellen

Beitrag von gn#36 »

Wenn die Daten doch einfach übergeben werden, warum nicht einfach so eine Struktur wählen:

Code: Alles auswählen

daten => array(
	0 => array(
		'titel => 'Übergeordnetes Menü: Eintrag 1'
		'submenu' => array(
			0 => 'Eintrag 1'
			1 => 'Eintrag 2'
			2 => 'Eintrag 3'
			...
			)
		)
	1 => array(
		'titel' => 'Eintrag 2'
		'submenu' => array(
			0 => 'Eintrag 1'
			1 => 'Eintrag 2'
			2 => 'Eintrag 3'
			...
			)
		)
	)
Ist im Prinzip nichts anderes als das, was P7BB vorschlägt, ich find's aber übersichtlicher. Lässt sich auch verschachteln wenn du willst. Wenn du kein Submenü hast, dann kannst du einfach ein leeres Array benutzen.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Benutzeravatar
Wuppi
Mitglied
Beiträge: 734
Registriert: 14.05.2002 23:04
Wohnort: Köln
Kontaktdaten:

Re: PHP-Template-Engine: Menu mit 2x while erstellen

Beitrag von Wuppi »

Hi

@P7BB: danke!
Der php-Code (array-Aufbau) klappt. Das Array ist so gefüllt wie ich es gerne ausgeben würde ;)
Aber ich bekomme keine Ausgabe mit dem Code von dir hin:
<?php for($i = 0;!empty($array[$i][0]);$i++): ?>
test <br />
es wird nicht mal ein "test" ausgeben. Also greift die For-Schleife schon nicht.

Ist so ein Array eigentlich noch ausbaubar? Aktuell hab ich im Array Hauptgruppen-Name <-> Untergruppen-Name stehen. Es fehlt aber noch die ID (damit ich Links bauen kann => ?h=1&u=2) und es fehlt noch die Anzahl der Untergruppen je Hauptgrupp und die Anzahl der Einträge je Untergruppe. Würde der einfachheit halber einfach noch 2 weitere Arrays nach deinem Muster Aufbauen und parallel dazu ausgeben lassen - sollte ja kein Ding sein?

@gn#36
was du da meinst scheint etwas "statischer" zu sein? Ich kann zwar 'titel' über eine Variable fülle, auch das Submenu wäre variable. Aber 0, 1, 2, 3, 4 gibste im "äusseren" Array ja vor ... ich weiß ja gar nicht wieviele Hauptgruppen ich habe. Oder wie meinst du das?

Es handelt sich bei mir nicht um ein klassisches Menu. Theoretisch weiß icht nichtmal wie es ausschaut wenn ich es aufrufe. Ich selber baue kein Menu auf - ich sag einfach nur das ein Eintrag zur Haupgruppe 1 und Untergruppe 2 gehört - und schon hab ich einen Menupunkt + Untermenu. Ist nen Bissel wirr - ich weiß ;)

Gruß
P7BB
Mitglied
Beiträge: 383
Registriert: 15.07.2008 19:40

Re: PHP-Template-Engine: Menu mit 2x while erstellen

Beitrag von P7BB »

Wuppi hat geschrieben:Ist so ein Array eigentlich noch ausbaubar? Aktuell hab ich im Array Hauptgruppen-Name <-> Untergruppen-Name stehen. Es fehlt aber noch die ID (damit ich Links bauen kann => ?h=1&u=2) und es fehlt noch die Anzahl der Untergruppen je Hauptgrupp und die Anzahl der Einträge je Untergruppe. Würde der einfachheit halber einfach noch 2 weitere Arrays nach deinem Muster Aufbauen und parallel dazu ausgeben lassen - sollte ja kein Ding sein?
Ich weiß nicht genau, ob ich es richtig verstanden habe, aber ich denke nicht, dass es ein Problem ist.

Warum das nicht funktioniert weiß ich nicht. Du hast $array entsprechend auch an den Namen deines Arrays angepasst, oder? Außerdem kanns du eben keine Arrays mehr mit $array['hauptgruppe1'] definieren, sondern mit $array[0] und $array[1],... Aber das hast du vermutlich ja bereits gemacht, wenn du meinen Code benutzt hast ;)
Benutzeravatar
Wuppi
Mitglied
Beiträge: 734
Registriert: 14.05.2002 23:04
Wohnort: Köln
Kontaktdaten:

Re: PHP-Template-Engine: Menu mit 2x while erstellen

Beitrag von Wuppi »

Hi

ich brauche im Menu folgende Infos:

1. NAME der Hauptgruppe
2. NAME der Untergruppe
3. ID der Hauptgruppe (für den Link)
4. ID der Untergruppe (für den Link)
5&6. just for Info: Anzahl der Einträge in Hauptgruppe (wieviele Einträge gesamt) und Anzahl der Einträge in Untergruppe.

Die Informationen hol ich an gleicher Stelle. Nachdem ich die Hauptgruppen in der ersten Schleife auslese, zähle ich auch mit mysql_num_rows auch gleich die Anzahl der Datensätze die gleiche Hauptgruppe haben. In der 2. Schleife mach ich das mit Untergruppe zusätzlich.

Aber wie gesagt: mach das mit weiteren Arrays und guck mal ;)

So aber zum eigentlichen Problem der Ausgabe:
vor der ersten Schleife:
$array = array();
1. Schleife ... (Hauptgruppe)
$array[$row[name]] = array();
2. Schleife ... (Untergruppe zur aktuellen Hauptgruppe)
$array[$row[name]] [] = $row2[name];

$row[name] / $row2[name] enthält den NAMEN der Haupt- bzw. Untergruppe ... also "Privat", "Windows"
$row[hauptgruppe] enthält die ID ... 1,2,3,4 usw. ... kommt hier aber nicht vor.

=> mehr steht zum Thema "array" nicht in dieser .php-Dateien. Die so erfassten Daten gehen dann via
require_once 'test.tpl';
ins Template ....

In der template-Ausgabe lass ich mir erstmal

Code: Alles auswählen

<pre><? print_r($array); ?>
</pre> 
Anzeigen. Das ist absolut richtig gefüllt ...

Code: Alles auswählen

Array
(
    [Arbeit] => Array  <<<<<- Hauptgruppe
        (
            [0] => Arbeit <<<<<- Untergruppe
            [1] => Codecs
            [2] => Windows
        )

    [Privat] => Array
        (
            [0] => Privat
            [1] => Webserver
        )

    [Kennungen] => Array
        (
            [0] => Arbeit
        )

    [Codecs] => Array
        (
            [0] => Privat
        )

)
(ist nur sinnlos gefüllt *G*)

Danach ungeändert deinen Code. (+ das Test um zu gucken ob die Schleifen überhaupt greift)

Statt [name] hab ich auch [hauptgruppe], [untergruppe] probiert. Hier stehen dann nur die entsprechend Gruppen-IDs drin - aber auch hier greift die Ausgabeschleife nicht.
P7BB
Mitglied
Beiträge: 383
Registriert: 15.07.2008 19:40

Re: PHP-Template-Engine: Menu mit 2x while erstellen

Beitrag von P7BB »

Hm, vielleicht würd ich dein Script mal ein wenig auf den Kopf stellen... Ich würd da vielleicht mit Klassen arbeiten, denn das wäre an der Stelle sicherlich hilfreich.
Wir könnten jetzt sauber und unsauber arbeiten, aber ich mach es einfach mal unsauber, indem ich alle Elemente in als public deklariere ;)

Code: Alles auswählen

class Menu {
    public $menu_id;
    public $menu_name;
    public $submenu_array_id;
}; // Ja, es ist tatsächlich }; und nicht } :D

class Submenu {
    public $menu_id;
    public $menu_name;
}



// Kategorien erstellen (0 steht im Beispiel nur für einen Index, bzw. du solltest dort
// $kategorie_array[] = new Menu; verwenden und den Rest so ansprechen:
// $kategorie_array[sizeof($kategorie_array)-1]->menu_id = 1;
// Denn so wird immer der letzte Eintrag zum schreiben benutzt. An der Stelle wäre
// es nicht verkehrt, wenn man dann doch sauberer mit Klassen arbeitet und Funktionen
// zum Eintragen benutzen würde, aber darauf verzichte ich jetzt mal ;)
// ALTERNATIV:
// Du kannst auch selbst einen Wert (bspw. $i) hochzählen und dann 0 durch $i ersetzten.
// Das wäre vermutlich ein wenig nachvollziehbarer ;)

$kategorie_array[0] = new Menu;
$kategorie_array[0]->menu_id = 1;
$kategorie_array[0]->menu_name = "Kategorie...";
$kategorie_array[0]->submenu_array_id = 0;


// Die Untermenüs packen wird dann wieder in ein neues Array. Dabei wird
// $kategorie_array[0]->submenu_array_id als Index verwendet. Entsprechend
// muss auch oben schon die 0 durch einen gültigen Wert ersetzt werden, der
// kein 2. mal vorkommt, also am besten zählst du einfach rauf oder so...

$submenu_array[$kategorie_array[0]->submenu_array_id] = new Submenu;
$submenu_array[$kategorie_array[0]->submenu_array_id]->menu_id = ...;
$submenu_array[$kategorie_array[0]->submenu_array_id]->menu_name = "Hier steht der Name";
Brauchst du für das auslesen dann auch noch Hilfe? Ähnelt im Prinzip der schon geschriebenen Möglichkeit von mir ;)
Benutzeravatar
mad-manne
Ehemaliges Teammitglied
Beiträge: 5403
Registriert: 18.03.2005 10:00
Wohnort: Marl im Ruhrgebiet

Re: PHP-Template-Engine: Menu mit 2x while erstellen

Beitrag von mad-manne »

*räusper* @P7BB:
Du solltest evtl. mal einen Blick auf die von dir weiter oben vorgeschlagene "Auslese-Schleife" werfen, anstatt hier diese total überflüssige(und ehrlich gesagt auch sinnlose) Klassenlösung vorzuschlagen :roll:

Das Array ist doch soweit ich das erkennen kann bereits korrekt gefüllt ... und es hapert immer noch am Auslesen/ausgeben des Ganzen!

Habe grade selber keine Zeit da eine korrekte Lösung vorzuschlagen, aber das Problem liegt IMHO(soweit ich das beim Überfliegen erkennen konnte) an der for-Schleife, da diese so scheinbar nie zur Ausführung kommt.

So viel erstmal ... eigener Lösungsvorschlag evtl. später.

My 2 cents,
Manne.
Try not. Do or do not. There is no try. (YODA)
Supportanfragen via E-Mail oder PN werden ignoriert
Antworten

Zurück zu „Coding & Technik“