Seite 1 von 1

"mehrere schleifen"

Verfasst: 20.12.2010 19:29
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?

Re: "mehrere schleifen"

Verfasst: 20.12.2010 20:15
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.

Re: "mehrere schleifen"

Verfasst: 20.12.2010 23:16
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?

Re: "mehrere schleifen"

Verfasst: 20.12.2010 23:52
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

Re: "mehrere schleifen"

Verfasst: 21.12.2010 00:23
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

Re: "mehrere schleifen"

Verfasst: 22.12.2010 23:42
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....

Re: "mehrere schleifen"

Verfasst: 23.12.2010 02:05
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.

Re: "mehrere schleifen"

Verfasst: 23.12.2010 18:10
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

Re: "mehrere schleifen"

Verfasst: 05.01.2011 23:54
von mojito
hmm, klasse, wenn hier niemand helfen kann....

Re: "mehrere schleifen"

Verfasst: 05.02.2011 20:13
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