Brauche Hilfe bei Topic Anzeige

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.
Helmut
Mitglied
Beiträge: 2048
Registriert: 27.12.2002 20:35
Wohnort: Augsburg

Brauche Hilfe bei Topic Anzeige

Beitrag von Helmut »

Hallo,

ich bin gerade dabei, eine Nachrichtenseite zu machen. Dazu habe ich jetzt ein Skript gemacht, welches mir ein Thema mit allen Antworten anzeigt. Da es aber viele Antworten sind, möchte ich es so machen wie in der Forenanzeige, dass nur eine bestimmte Anzahl von Beiträgen pro Seite angezeigt werden.

[ externes Bild ]

Ich würde gerne die Funktion vom Forum dazu nutzen, weis aber nicht, wie ich das umsetzen kann, bzw. was alles von der viewtopic.php und ggf. von anderen Dateien benötigt wird. Mein Code schaut jetzt so aus:

Code: Alles auswählen

....
$sql = 'SELECT p.post_subject, p.post_text, p.post_id, bbcode_uid, bbcode_bitfield, enable_bbcode, enable_smilies, enable_magic_url
	FROM ' . POSTS_TABLE . ' p
	WHERE p.topic_id = 21
	ORDER BY p.post_id DESC';

$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{

	$row['bbcode_options'] = (($row['enable_bbcode']) ? OPTION_FLAG_BBCODE : 0) + (($row['enable_smilies']) ? OPTION_FLAG_SMILIES : 0) + (($row['enable_magic_url']) ? OPTION_FLAG_LINKS : 0);	
	$row['post_text'] = generate_text_for_display($row['post_text'], $row['bbcode_uid'], $row['bbcode_bitfield'], $row['bbcode_options']);		

	$template->assign_block_vars('recenttopic3row', array(
			'POST_TITLE'		=> censor_text($row['post_subject']),
			'POST_TEXT'			=> censor_text($row['post_text']),
			'U_NEWS_POST'		=> append_sid("{$phpbb_root_path}svisuite/nachrichten.$phpEx", 'n=' . $row['post_id']),
	));
}
$db->sql_freeresult($result);
....
Es wird nur ein einziges Thema eines bestimmten Forums verwendet, daher kann die Abfrage auch sehr einfach gehalten werden. Die Sortierung ist immer gleich, dabei wird der neuste Beitrag immer ganz oben angezeigt.

Da ich mich in php nicht so gut auskenne, bin ich für jede Hilfe dankbar.

Gruß Helmut
Ich bin nicht ganz dicht.... na und.
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag von gn#36 »

Für diese Anwendung gibt es bereits eine vorgefertigte Funktion. Sie findet sich in der functions.php (steht also bei Einbindung der üblichen Foren-Dateien zur Verfügung) und heißt generate_pagination. Um die aktuelle Seite zu bestimmen kann die Funktion on_page benutzt werden.
Du brauchst nur die URL an die die Daten angehängt werden sollen, die Anzahl der insgesamt vorhandenen Einträge, die Anzahl die auf eine Seite soll und den Punkt des aktuellen Elements (Startpunkt), der Rest wird automatisch berechnet. Die grafische Darstellung musst du über das Template realisieren, in der viewtopic.html läuft das beispielsweise so:

Code: Alles auswählen

<!-- IF PAGINATION or TOTAL_POSTS -->
		<div class="pagination">
			<!-- IF U_VIEW_UNREAD_POST and not S_IS_BOT --><a href="{U_VIEW_UNREAD_POST}">{L_VIEW_UNREAD_POST}</a> &bull; <!-- ENDIF -->{TOTAL_POSTS}
			<!-- IF PAGE_NUMBER --><!-- IF PAGINATION --> &bull; <a href="#" onclick="jumpto(); return false;" title="{L_JUMP_TO_PAGE}">{PAGE_NUMBER}</a> &bull; <span>{PAGINATION}</span><!-- ELSE --> &bull; {PAGE_NUMBER}<!-- ENDIF --><!-- ENDIF -->
		</div>
	<!-- ENDIF -->
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.
Helmut
Mitglied
Beiträge: 2048
Registriert: 27.12.2002 20:35
Wohnort: Augsburg

Beitrag von Helmut »

Hallo gn#36,

danke dir für die Antwort. Es hat soweit geklappt, nur bekomme ich bei der Ausgabe keine Anzeige bei:

Code: Alles auswählen

'TOTAL_POSTS'	=> ($total_posts == 1) ? $user->lang['VIEW_TOPIC_POST'] : sprintf($user->lang['VIEW_TOPIC_POSTS'], $total_posts),
In $total_posts steht der richtige Wert drinnen und wenn ich nur 'TOTAL_POSTS' => $total_posts, schreibe, dann wird der Wert auch angezeigt. Hast du eine Idee woran das liegen kann?

Gruß Helmut
Ich bin nicht ganz dicht.... na und.
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag von gn#36 »

Ich weiß gerade nicht in welcher Sprachdatei diese Variable geladen wird. Es könnte sein, dass du noch ein zusätzliches Sprachpaket laden musst, sowas wie $user->setup('viewtopic'); oder so.
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.
Helmut
Mitglied
Beiträge: 2048
Registriert: 27.12.2002 20:35
Wohnort: Augsburg

Beitrag von Helmut »

Hallo gn#36,

ja das wars, ich habe das hier $user->setup('viewtopic'); noch zugefügt, dann wurde auch der Text (257 Beiträge ...) richtig angezeigt.

Jetzt habe ich aber ein weiteres Problem, ich bekomme den Postingtext nicht angezeigt. Kannst du dir mal den Code anschauen, ob da wo ein Fehler ist, der vielleicht die Ursache für das Verhalten ist?

Code: Alles auswählen

$forum_id = 21;
$topic_id =21;

$start		= request_var('start', 0);
$post_id		= request_var('p', 0);

........
					
	));

	$store_reverse = false;
	$sql_limit = $config['topics_per_page'];
	if ($start > $total_posts / 2)
	{
		$store_reverse = true;

		if ($start + $config['posts_per_page'] > $total_posts)
		{
			$sql_limit = min($config['posts_per_page'], max(1, $total_posts - $start));
		}

		// Select the sort order
		$sql_start = max(0, $total_posts - $sql_limit - $start);
	}
	else
	{
		$sql_start = $start;
	}

//Textausgabe der Nachrichtenseite
$post_list = array();
$i = $i_total = 0;
$sql = 'SELECT p.post_subject, p.post_text, p.post_id, poster_id, u.user_id, u.username, post_time, bbcode_uid, bbcode_bitfield, enable_bbcode, enable_smilies, enable_magic_url
	FROM ' . POSTS_TABLE . " p
	LEFT JOIN " . USERS_TABLE . " u
		ON u.user_id = p.poster_id
	WHERE p.topic_id = $topic_id
	ORDER BY p.post_id DESC";	
$result = $db->sql_query_limit($sql, $sql_limit, $sql_start);
$i = ($store_reverse) ? $sql_limit - 1 : 0;
while ($row = $db->sql_fetchrow($result))
{
	$post_list[$i] = $row['post_id'];
	($store_reverse) ? $i-- : $i++;
}
$db->sql_freeresult($result);
{
	//set some default vars
	$post_id = $row['post_id'];
	$poster_id = $row['poster_id'];
	$username = $row['username'];

	$row['bbcode_options'] = (($row['enable_bbcode']) ? OPTION_FLAG_BBCODE : 0) + (($row['enable_smilies']) ? OPTION_FLAG_SMILIES : 0) + (($row['enable_magic_url']) ? OPTION_FLAG_LINKS : 0);	
	$row['post_text'] = generate_text_for_display($row['post_text'], $row['bbcode_uid'], $row['bbcode_bitfield'], $row['bbcode_options']);		
$template->assign_block_vars('news1', array(
...........
Ich hab mir schon die viewtopic.php etwas angeschaut, aber so richtig blicke ich da nicht durch.

Gruß Helmut
Zuletzt geändert von Helmut am 12.10.2007 10:07, insgesamt 1-mal geändert.
Ich bin nicht ganz dicht.... na und.
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag von gn#36 »

Diese Stelle ist ein wenig seltsam, das würde ich glaube ich ganz weglassen:

Code: Alles auswählen

}
$db->sql_freeresult($result);
{
Hierdurch wird in der while Schleife nur in der Variable "post_list" etwas ergänzt und dann war es das, die Texte gehen verloren. Lässt du es weg, dann solltest du im unteren Teil des Codes auch noch darauf zugreifen können.


Außerdem ist in der SQL Abfrage nicht an allen Feldern eine Tabelle als Quelle angegeben. Das funktioniert, solange es in den anderen Tabellen kein gleichnamiges Feld gibt. Besser wäre es wenn du die Namen ergänzen würdest, also p.post_time ... Für den Fehler verantwortlich wird das aber nicht sein.

Den Teil, der funktioniert (pagination) hättest du aber ruhig auch noch weglassen können, das zieht das Thema nicht so in die Länge. ;)
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.
Helmut
Mitglied
Beiträge: 2048
Registriert: 27.12.2002 20:35
Wohnort: Augsburg

Beitrag von Helmut »

Hallo gn#36,

danke hat geklappt, aber jetzt ist mir noch eine Unstimmigkeit aufgefallen. Im ACP ist eingestellt, dass 10 Beiträge und 20 Themen pro Seite angezeigt werden, bei mir werden aber 20 Beiträge angezeigt obwohl ich nur 10 Beiträge pro Seite will. Kannst du dir das nochmal anschauen ob ich mich da irgendwo im Code vertan habe?

Ok, ich scheide den Teil vom Code aus dem Beitrag raus (pagination).

[EDIT]
Ich hab den Fehler gefunden, hab einmal statt $config['posts_per_page'] nicht aufgepasst und $config['topics_per_page'] geschrieben, jetzt klappts aber.


Abertrotzdem bräuchte ich nochmal deine Hilfe. Ich möchte die Beiträge auch nach Jahrgängen ausgeben, so dass z.B. nur alle Beiträge von 2006 angezeigt werden, wie muss ich das genau machen?


Gruß Helmut
Ich bin nicht ganz dicht.... na und.
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag von gn#36 »

Du musst dir die SQL Abfrage ansehen:

Code: Alles auswählen

ORDER BY p.post_id DESC";
Das sortiert beispielsweise nach post_id. Hier kannst du jedes beliebige Feld angeben, also z.b. auch p.post_time
Wenn du nur ein einziges Jahr haben willst, dann musst du hierzu auch den WHERE Teil modifizieren und mit AND weitere Bedingungen anhängen, die etwa so aussehen:

Code: Alles auswählen

p.post_time > $year_begin AND p.post_time < $year_end
Die beiden Variablen $year_begin und $year_end kannst du z.b. mit [php:mktime] füllen der du geeignete Parameter übergibst.
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.
Helmut
Mitglied
Beiträge: 2048
Registriert: 27.12.2002 20:35
Wohnort: Augsburg

Beitrag von Helmut »

Hallo gn#36,

danke dir, das werde ich mal testen. Mir war schon klar dass ich auch nach Datum und sonst was sortieren lassen kann, aber wie ich mir einen bestimmten Zeitraum ausgeben lasse, das war mir nicht ganz klar.

Gruß Helmut :wink:
Ich bin nicht ganz dicht.... na und.
Helmut
Mitglied
Beiträge: 2048
Registriert: 27.12.2002 20:35
Wohnort: Augsburg

Beitrag von Helmut »

Hallo gn#36,

ich habe doch noch einen Fehler gefunden bei der Seitenauswertung.

Bis zur Seite 13 macht er alles richtig letzter Post der Seite ist $post_id 4574 vom 22.05.2005 und wenn ich auf Seite 14 gehe, dann ist der erste Post oben $post_id 4990 vom 14.06.2005.

Von da an zählt er die Beiträge wieder nach oben und wenn ich auf die letzte Seite (26) klicke, dann bin ich wieder beim ersten Post ganz oben.

Kannst du dir den Code nochmal anschauen?

[EDIT]
Dann habe ich nochmal eine Frage zu generate_forum_rules. Ich möchte gerne die Forenregeln mit anzeigen lassen, weis aber nicht genau, was für Tabellen/Spalten ich noch abfragen muss bzw. was ich genau da übergeben muss.

Gruß Helmut
Ich bin nicht ganz dicht.... na und.
Antworten

Zurück zu „Coding & Technik“