Seite 1 von 3

Brauche Hilfe bei Topic Anzeige

Verfasst: 08.10.2007 22:21
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

Verfasst: 09.10.2007 00:32
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 -->

Verfasst: 11.10.2007 13:40
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

Verfasst: 11.10.2007 16:17
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.

Verfasst: 12.10.2007 01:08
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

Verfasst: 12.10.2007 02:30
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. ;)

Verfasst: 12.10.2007 10:05
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

Verfasst: 12.10.2007 11:04
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.

Verfasst: 12.10.2007 11:12
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:

Verfasst: 12.10.2007 12:49
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