"mehrere schleifen"

In diesem Forum kann man Fragen zur Programmierung stellen, die bei der Entwicklung von Mods für phpBB 3.0.x oder dem Modifizieren des eigenen Forums auftauchen.
Forumsregeln
phpBB 3.0 hat das Ende seiner Lebenszeit überschritten
phpBB 3.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 3.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf die neuste phpBB-Version, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
Antworten
mojito
Mitglied
Beiträge: 99
Registriert: 10.06.2010 11:07

"mehrere schleifen"

Beitrag von mojito »

Hi,
ich würde gerne eine tabelle auf grund 2er db-tabellen ausgeben.

diese sollen eigentlich wie folgt geschachtelt sein:

Code: Alles auswählen

<!-- BEGIN skillrow -->
<tr>
<td class="row1" align='center' rowspan='{skillrow.USERANZ}'>{skillrow.SKILL} / {skillrow.USERANZ}</td>

<!-- BEGIN userrow -->
<td class="row1" align='center'>{userrow.NAME}</td>
<td class="row1" align='center'>{userrow.LEVEL}</td>
<!-- END userrow -->
</tr>
<!-- END skillrow -->
</table>
mal om sinn der td/tr an den stellen abgesehen...

der code dahinter lautet:

Code: Alles auswählen

// get uis some skills ^^
		$sql = 'SELECT ID FROM phpbb_craftsman_skill';
		$result = $db->sql_query($sql);
		
		$skill_list = array();
		while ($row = $db->sql_fetchrow($result))
		{
			$skill_list[] = (int) $row['ID'];
		}
		$db->sql_freeresult($result);
		
		// So, did we get any users?
		if (sizeof($skill_list))
		{
			$sql = 'SELECT * 
FROM `phpbb_craftsman_skill` 
ORDER BY `phpbb_craftsman_skill`.`skill` ASC';
			$result = $db->sql_query($sql);

			$skill_cache = array();
			while ($row = $db->sql_fetchrow($result))
			{
				$skill_cache[$row['ID']] = $row;
			}
			$db->sql_freeresult($result);

			for ($i_skill = 0, $end = sizeof($skill_list); $i_skill < $end; ++$i_skill)
			{
				$skill_id = $skill_list[$i_skill];
				$row_skill =& $skill_cache[$skill_id];
				
				//------------ NAMES
					// get uis some names
					$sql = 'SELECT ID FROM phpbb_craftsman_data WHERE skill = '.$row_skill['ID'];
					$result = $db->sql_query($sql);
					
					$data_list = array();
					while ($row = $db->sql_fetchrow($result))
					{
						$data_list[] = (int) $row['ID'];
					}
					$db->sql_freeresult($result);
					
					// So, did we get any users?
					if (sizeof($data_list))
					{
						$sql = 'SELECT * FROM phpbb_craftsman_data';
						$result = $db->sql_query($sql);
			
						$data_cache = array();
						while ($row = $db->sql_fetchrow($result))
						{
							$data_cache[$row['ID']] = $row;
						}
						$db->sql_freeresult($result);
			
						for ($i_data = 0, $end = sizeof($data_list); $i_data < $end; ++$i_data)
						{
							$data_id = $data_list[$i_data];
							$row_data =& $data_cache[$data_id];
							
							$row_data['lv'] = $skill_lv_list[$row_data['lv']][2];
							
							$userrow = array_merge($arrays, array(
								'NAME' => $row_data['name'],
								'LEVEL' => $row_data['lv']
								));
							$template->assign_block_vars('userrow', $userrow);
						}
					}
					else
					{
						$userrow = array_merge($arrays, array(
							'NAME' => 'noname',
							'LEVEL' => 'n.A.'
							));
						$template->assign_block_vars('userrow', $userrow);
					//}
				$skillrow = array_merge($arrays, array(
					'SKILL' => $row_skill['skill'],
					'USERANZ' => sizeof($data_list)
					));
				$template->assign_block_vars('skillrow', $skillrow);
			}
		}
		$template_html = 'craftsman_body.html';
	}
das ganze ist quasi eine schleife in einer schleife.

und genau so soll er das auch ausgeben.

jedoch funzt das ganze nicht.

sobald in der craftsman_skill_data etwas drinsteht, wird ab der stelle die skills ncihtmehr ausgegeben.

was ist daran falsch?
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Re: "mehrere schleifen"

Beitrag von Pyramide »

Siehe http://wiki.phpbb.com/display/MODDOCS/T ... tax-Blocks

PS: Das Konzept mit dem Cache so wie es auch bei phpBB verwendet wird, macht logischerweise nur dann sinn, wenn du die große Datenmenge einmal ganz am Anfang abrufst und dann bis zum schluss immer darauf zugreifst. Wenn man - so wie in deinem Code - den "Cache" jedoch innerhalb der Schleife füllt, verdoppelst du die letztlich die Anzahl der Datenbankabfragen. Auch stellt sich die Frage, ob ein Cache in so einem Fall überhaupt Sinn macht, da du ja offenbar sowieso jedes mal die Datenbank nach den zugehörigen IDs fragen musst.
KB:knigge
mojito
Mitglied
Beiträge: 99
Registriert: 10.06.2010 11:07

Re: "mehrere schleifen"

Beitrag von mojito »

hmm,
der link ist zwar ganz nett...
aber bringt mir so gar nichts...

ist cniht meine erste modifikation für mein forum, jedoch die erste mit 2 schleifen.

hast du eine idee, wie ich das ganze besser gestelaten kann/überhaupt zum laufen bekomme?
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Re: "mehrere schleifen"

Beitrag von Pyramide »

mojito hat geschrieben:hmm,
der link ist zwar ganz nett...
aber bringt mir so gar nichts...
Wie bringt er dir denn was? Vielleicht so: Klicke hier und finde dort in Form von Beispielcode die Antwort auf deine Frage, wie man beim Template-System von phpBB mit verschachtelten Schleifen arbeitet
KB:knigge
mojito
Mitglied
Beiträge: 99
Registriert: 10.06.2010 11:07

Re: "mehrere schleifen"

Beitrag von mojito »

k, nach 20min intensiven studium ahbe ich gefunden was du meinst...

ich denke mal du meinst das beispieloben mit topic/topic.post

nur wie soll ich das einbauen?

vor allem würde es mcih interessieren, wie cih so ein konstrukt dann im Template verwende.

mfg
mojito
Mitglied
Beiträge: 99
Registriert: 10.06.2010 11:07

Re: "mehrere schleifen"

Beitrag von mojito »

So,
habe mir alles nochmal angeschaut.

beispiele, wie man eine schleife einbaut, okay.

auch wie man im php-teil 2 schleifen ineinaderpackt, okay..

aber wie das jetzt mit dem schleife in schleife im Template ist, das wird in dem text mal gewissentlich ignoriert.
und ich finde es auch wirklich schade, das man hier literaturhinweise bekommt, aber keine nützliche hilfe....

weil wie man schleifen schreibt ist mir gut bekannt.
nur will das einfach cniht funktionieren....
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Re: "mehrere schleifen"

Beitrag von Pyramide »

mojito hat geschrieben:und ich finde es auch wirklich schade, das man hier literaturhinweise bekommt, aber keine nützliche hilfe....
Der Link ist ja die Hilfe, immerhin ist dort ein Beispiel für verschachtelte Schleifen. Wenn du genauere Hilfe benötigst, solltest du auch dein Problem genauer beschreiben - zum Beispiel den neuen Quellcode (mit den Änderungen wie im verlinkten Beispiel) posten und beschreiben, was genau nicht funktioniert bzw. was stattdessen passiert. Mit der Beschreibung "nur will das einfach cniht funktionieren" ist nämlich keine wirkliche Fehlerdiagnose möglich.

Und wenn du laut eigener Aussage schon 20 Minuten intensives Studium benötigst, um in dem Absatz, auf den ich explizit verlinkt habe, den mit "nested loops" betitelten Beispielcode zu finden, dann motiviert das auch nicht gerade dazu, dir sämtliche Details aus der Nase zu ziehen. Siehe auch KB:programmierfragen

PS: Falls nicht bereits getan, solltest du auf jeden Fall mit Debugausgaben überprüfen, ob deine Schleifen/Datenbankzugriffe überhaupt wie gewünscht funktionieren. Wäre nicht das erste mal, dass das Template schlicht deswegen nichts anzeigt, weil die Datenbankabfrage 0 Zeilen zurückgibt.
KB:knigge
mojito
Mitglied
Beiträge: 99
Registriert: 10.06.2010 11:07

Re: "mehrere schleifen"

Beitrag von mojito »

also,
die richtigen werte gibt er zumindest aus.

habe mal testweise die anzahl der jeweiligen _data einträge mit ausgeben lassen.

er zeigt mir bei dem obigen beispiele einfach nur an:

Aktion leer leer
Angeln leer leer
Axt leer leer
...
Zubehör leer leer

das ist ja soweit schon richtig, wenn die _data leer ist.

wenn ich nun für den skill Angeln dort werte in der _data hinterlege, dann bricht er die tabelle nach Angeln einfach ab und macht nicht weiter.
da steht also dann:

Aktion leer leer
Angeln leer leer


den rest ignoriert er einfach und auch die eingegebenen worte/zahlen etc. in der data verschwinden einfach.

also außer das er nach angeln abbricht ändert sich nix.

wenn ich jedoch den template-quelltext so verändere, das er beide sachen seperat ausgeben soll.

also

Code: Alles auswählen

<!-- BEGIN skillrow -->
<tr>
<td class="row1" align='center' rowspan='{skillrow.USERANZ}'>{skillrow.SKILL} / {skillrow.USERANZ}</td>

</tr>
<!-- END skillrow -->
<!-- BEGIN userrow -->
<td class="row1" align='center'>{userrow.NAME}</td>
<td class="row1" align='center'>{userrow.LEVEL}</td>
<!-- END userrow -->

</table>
dann gibt er mir 2 tabellen aus.

einmal eine auflistung der skills, jedoch auch wieder nur bis angeln

und jeweils eine tabelle am ende mit exakt dem eintrag, der sich in der _data befindet.

das heißt dieses ineinanderscachteln hebelt die userrow komplett aus.

ich hoffe ich konnte das verdeutlichen.

sonst muss ich mal paar screens machen.

mfg
mojito
Mitglied
Beiträge: 99
Registriert: 10.06.2010 11:07

Re: "mehrere schleifen"

Beitrag von mojito »

hmm, klasse, wenn hier niemand helfen kann....
Benutzeravatar
Unimatrix_0
Mitglied
Beiträge: 392
Registriert: 03.11.2007 10:50
Kontaktdaten:

Re: "mehrere schleifen"

Beitrag von Unimatrix_0 »

Hi,

da ich heute auch vor dem Problem kurz stand, möchte ich dir den Hilfshinweis (welchen mir Tante Google geliefert hat) nicht vorenthalten:

http://startrekguide.com/community/view ... 560#p52226
unter Beachtung des letzen Beitrages das im Code nicht VAR1.LOOP1 sondern VAR1_LOOP1 gemeint ist
Antworten

Zurück zu „[3.0.x] Mod Bastelstube“