Recent topics afbreken

Installatie lukt niet? Plotseling een foutmelding. Of weet je niet hoe iets werkt. Problemen met phpBB2 kun je in dit archief opzoeken.
Forumregels

Sinds 1 januari 2009 wordt phpBB2 niet meer ondersteund.
Onderstaande informatie is verouderd en dient uitsluitend als archief.
phpBB2.0.x
Inward
Berichten: 99
Lid geworden op: 07 feb 2004, 13:46

Recent topics afbreken

Bericht door Inward » 24 feb 2004, 15:11

Hoi,
Ik heb het volgende script om de laatst topics uit het forum te halen:

Code: Selecteer alles

//
// Recent Topics
//
$sql = "SELECT * FROM ". FORUMS_TABLE . " ORDER BY forum_id";
if (!$result = $db->sql_query($sql))
{
	message_die(GENERAL_ERROR, 'Could not query forums information', '', __LINE__, __FILE__, $sql);
}
$forum_data = array();
while( $row = $db->sql_fetchrow($result) )
{
	$forum_data[] = $row;
}

$is_auth_ary = array();
$is_auth_ary = auth(AUTH_ALL, AUTH_LIST_ALL, $userdata, $forum_data);

if( $CFG['hexceptional_forums'] == '' )
{
	$except_forum_id = '\'start\'';
}
else
{
	$except_forum_id = $CFG['exceptional_forums'];
}

for ($i = 0; $i < count($forum_data); $i++)
{
	if ((!$is_auth_ary[$forum_data[$i]['forum_id']]['auth_read']) or (!$is_auth_ary[$forum_data[$i]['forum_id']]['auth_view']))
	{
		if ($except_forum_id == '\'start\'')
		{
			$except_forum_id = $forum_data[$i]['forum_id'];
		}
		else
		{
			$except_forum_id .= ',' . $forum_data[$i]['forum_id'];
		}
	}
}
$sql = "SELECT t.topic_id, t.topic_title, t.topic_last_post_id, t.forum_id, p.post_id, p.poster_id, p.post_time, u.user_id, u.username
		FROM " . TOPICS_TABLE . " AS t, " . POSTS_TABLE . " AS p, " . USERS_TABLE . " AS u
		WHERE t.forum_id NOT IN (" . $except_forum_id . ")
			AND t.topic_status <> 2
			AND p.post_id = t.topic_last_post_id
			AND p.poster_id = u.user_id
		ORDER BY p.post_id DESC
		LIMIT " . $CFG['number_recent_topics'];
if (!$result = $db->sql_query($sql))
{
	message_die(GENERAL_ERROR, 'Could not query recent topics information', '', __LINE__, __FILE__, $sql);
}
$number_recent_topics = $db->sql_numrows($result);
$recent_topic_row = array();
while ($row = $db->sql_fetchrow($result))
{
	$recent_topic_row[] = $row;
}
for ($i = 0; $i < $number_recent_topics; $i++)
{
	$template->assign_block_vars('recent_topic_row', array(
		'U_TITLE' => append_sid("viewtopic.$phpEx?" . POST_POST_URL . '=' . $recent_topic_row[$i]['post_id']) . '#' .$recent_topic_row[$i]['post_id'],
		'L_TITLE' => $recent_topic_row[$i]['topic_title'],
		'U_POSTER' => append_sid("profile.$phpEx?mode=viewprofile&" . POST_USERS_URL . "=" . $recent_topic_row[$i]['user_id']),
		'S_POSTER' => $recent_topic_row[$i]['username'],
		'S_POSTTIME' => create_date("d/m" , $recent_topic_row[$i]['post_time'], $board_config['board_timezone'])
		)
	);
}
//
// END - Recent Topics
//
Nouw is mijn vraag:
Hoe kan ik ervoor zorgen dat namen van zn onderwerp als ze langer dan 20 tekens hebben ze die 20 tekens behouden maar dat er dat 3 puntjes (OnderwerpLLLLLLLLLLL...) achter komen?

Alvast bedankt :)

Gebruikersavatar
mosymuis
Berichten: 6940
Lid geworden op: 05 feb 2003, 14:00
Locatie: Amsterdam
Contacteer:

Bericht door mosymuis » 24 feb 2004, 15:47

Als je een beetje handig bent in PHP kan je je script combineren met dit exemplaar:

http://www.phpfreakz.nl/library.php?sid=12906

Inspiration
Berichten: 279
Lid geworden op: 27 jun 2003, 16:27

Bericht door Inspiration » 24 feb 2004, 16:06

Er is overigens een kant en klaar recente topics mod te vinden op phpbbhacks.com :idea:

Inward
Berichten: 99
Lid geworden op: 07 feb 2004, 13:46

Bericht door Inward » 24 feb 2004, 18:45

Ja ik weet het, maar deze is goed in gebruikt hij mist alleen die eene functie.

Maar mosymuis kun je me een beetje opweg helpen?

Gebruikersavatar
mosymuis
Berichten: 6940
Lid geworden op: 05 feb 2003, 14:00
Locatie: Amsterdam
Contacteer:

Bericht door mosymuis » 24 feb 2004, 19:39

Inward schreef:Maar mosymuis kun je me een beetje opweg helpen?
Zoek

Code: Selecteer alles

for ($i = 0; $i < $number_recent_topics; $i++) 
Plaats erna

Code: Selecteer alles

$topic_title = (strlen($recent_topic_row[$i]['topic_title']) > 20) ? rtrim(substr($recent_topic_row[$i]['topic_title'], 0, 17)) . '...' : $recent_topic_row[$i]['topic_title'];
Zoek

Code: Selecteer alles

'L_TITLE' => $recent_topic_row[$i]['topic_title'],
Vervang

Code: Selecteer alles

'L_TITLE' => $topic_title,
Dit zou wel eens kunnen werken. :bier:
Laatst gewijzigd door mosymuis op 25 feb 2004, 18:58, 2 keer totaal gewijzigd.

Inward
Berichten: 99
Lid geworden op: 07 feb 2004, 13:46

Bericht door Inward » 24 feb 2004, 22:38

Nee,
Maar ik vond dit:

Code: Selecteer alles

if(strlen($tekst) > 20) { 
$tekst = substr($tekst,0,17)."..."; 
}
En hier moest het al mee lukken..
Maar hoe?

Gebruikersavatar
mosymuis
Berichten: 6940
Lid geworden op: 05 feb 2003, 14:00
Locatie: Amsterdam
Contacteer:

Bericht door mosymuis » 24 feb 2004, 23:05

Dat is het stukje uit dat script van phpfreakz en dat heb ik ook verwerkt in de aanpassing hierboven: :roll:

Code: Selecteer alles

if (strlen($recent_topic_row[$i]['topic_title']) > 20) $topic_title = rtrim(substr($recent_topic_row[$i]['topic_title'], 0, 17)) . '...';

Inspiration
Berichten: 279
Lid geworden op: 27 jun 2003, 16:27

Bericht door Inspiration » 25 feb 2004, 00:21

Bij deze mod werkte wat je aangeeft bij mij in ieder geval direct. Je moet iets gewijzigd hebben lijkt me.

Inward
Berichten: 99
Lid geworden op: 07 feb 2004, 13:46

Bericht door Inward » 25 feb 2004, 12:25

Bij mij toch echter niet..
Ook als ik alle andere veranderingen eruit laat :?

Gebruikersavatar
mosymuis
Berichten: 6940
Lid geworden op: 05 feb 2003, 14:00
Locatie: Amsterdam
Contacteer:

Bericht door mosymuis » 25 feb 2004, 13:07

Aah, ik was nog iets vergeten. Hij gaf $topic_title alleen door wanneer deze langer was dan 20 tekens. ;)

Code: Selecteer alles

$topic_title = (strlen($recent_topic_row[$i]['topic_title']) > 20) ? rtrim(substr($recent_topic_row[$i]['topic_title'], 0, 17)) . '...' : $recent_topic_row[$i]['topic_title'];

Inward
Berichten: 99
Lid geworden op: 07 feb 2004, 13:46

Bericht door Inward » 25 feb 2004, 14:06

Nouw geeft hij geen topic`s meer weer :?

Gebruikersavatar
mosymuis
Berichten: 6940
Lid geworden op: 05 feb 2003, 14:00
Locatie: Amsterdam
Contacteer:

Bericht door mosymuis » 25 feb 2004, 14:10

Wat is nu je script? Wat zie je in je browser (url)? En krijg je errors?

Inward
Berichten: 99
Lid geworden op: 07 feb 2004, 13:46

Bericht door Inward » 25 feb 2004, 14:17

Code: Selecteer alles

$sql = "SELECT * FROM ". FORUMS_TABLE . " ORDER BY forum_id";
if (!$result = $db->sql_query($sql))
{
	message_die(GENERAL_ERROR, 'Could not query forums information', '', __LINE__, __FILE__, $sql);
}
$forum_data = array();
while( $row = $db->sql_fetchrow($result) )
{
	$forum_data[] = $row;
}

$is_auth_ary = array();
$is_auth_ary = auth(AUTH_ALL, AUTH_LIST_ALL, $userdata, $forum_data);

if( $CFG['exceptional_forums'] == '' )
{
	$except_forum_id = '\'start\'';
}
else
{
	$except_forum_id = $CFG['exceptional_forums'];
}

for ($i = 0; $i < count($forum_data); $i++)
{
	if ((!$is_auth_ary[$forum_data[$i]['forum_id']]['auth_read']) or (!$is_auth_ary[$forum_data[$i]['forum_id']]['auth_view']))
	{
		if ($except_forum_id == '\'start\'')
		{
			$except_forum_id = $forum_data[$i]['forum_id'];
		}
		else
		{
			$except_forum_id .= ',' . $forum_data[$i]['forum_id'];
		}
	}
}
$sql = "SELECT t.topic_id, t.topic_title, t.topic_last_post_id, t.forum_id, p.post_id, p.poster_id, p.post_time, u.user_id, u.username
		FROM " . TOPICS_TABLE . " AS t, " . POSTS_TABLE . " AS p, " . USERS_TABLE . " AS u
		WHERE t.forum_id NOT IN (" . $except_forum_id . ")
			AND t.topic_status <> 2
			AND p.post_id = t.topic_last_post_id
			AND p.poster_id = u.user_id
		ORDER BY p.post_id DESC
		LIMIT " . $CFG['number_recent_topics'];
if (!$result = $db->sql_query($sql))
{
	message_die(GENERAL_ERROR, 'Could not query recent topics information', '', __LINE__, __FILE__, $sql);
}
$number_recent_topics = $db->sql_numrows($result);
$recent_topic_row = array();
while ($row = $db->sql_fetchrow($result))
{
	$recent_topic_row[] = $row;
}
$topic_title = (strlen($recent_topic_row[$i]['topic_title']) > 20) ? rtrim(substr($recent_topic_row[$i]['topic_title'], 0, 17)) . '...' : $recent_topic_row[$i]['topic_title'];
for ($i = 0; $i < $number_recent_topics; $i++)
{
	$template->assign_block_vars('recent_topic_row', array(
		'U_TITLE' => append_sid("viewtopic.$phpEx?" . POST_POST_URL . '=' . $recent_topic_row[$i]['post_id']) . '#' .$recent_topic_row[$i]['post_id'],
		'L_TITLE' => $topic_title
                'U_POSTER' => append_sid("profile.$phpEx?mode=viewprofile&" . POST_USERS_URL . "=" . $recent_topic_row[$i]['user_id']),
		'S_POSTER' => $recent_topic_row[$i]['username'],
		'S_POSTTIME' => create_date("d/m", $recent_topic_row[$i]['post_time'], $board_config['board_timezone']),
		)
	);
}
Zo krijg je: Parse error: parse error, expecting `')'' in /home/inward/public_html/index.php on line 185

Maar zet je 'L_TITLE' => $topic_title naar onder zijn de topic gewoon weg.

Code: Selecteer alles

		'U_TITLE' => append_sid("viewtopic.$phpEx?" . POST_POST_URL . '=' . $recent_topic_row[$i]['post_id']) . '#' .$recent_topic_row[$i]['post_id'],
                'U_POSTER' => append_sid("profile.$phpEx?mode=viewprofile&" . POST_USERS_URL . "=" . $recent_topic_row[$i]['user_id']),
		'S_POSTER' => $recent_topic_row[$i]['username'],
		'S_POSTTIME' => create_date("d/m", $recent_topic_row[$i]['post_time'], $board_config['board_timezone']),
		'L_TITLE' => $topic_title

Gebruikersavatar
mosymuis
Berichten: 6940
Lid geworden op: 05 feb 2003, 14:00
Locatie: Amsterdam
Contacteer:

Bericht door mosymuis » 25 feb 2004, 14:22

Logisch, achter 'L_TITLE' => $topic_title moet een komma. ;)

Inward
Berichten: 99
Lid geworden op: 07 feb 2004, 13:46

Bericht door Inward » 25 feb 2004, 14:35

Ja ok,
dan krijg ik geen errors meer,
maar ook geen lijstje met topic`s..
(er zouden topic's die langer dan 20 tekens en korter zijn moeten komen)

Gebruikersavatar
mosymuis
Berichten: 6940
Lid geworden op: 05 feb 2003, 14:00
Locatie: Amsterdam
Contacteer:

Bericht door mosymuis » 25 feb 2004, 14:37

Inward schreef:(er zouden topic's die langer dan 20 tekens en korter zijn moeten komen)
Dat snap ik, en ik zie ook niet waarom het niet zou werken. Mag ik je URL?

Inward
Berichten: 99
Lid geworden op: 07 feb 2004, 13:46

Bericht door Inward » 25 feb 2004, 14:40

http://www.inward.nl/index.php
Recente Topics kolom

Gebruikersavatar
mosymuis
Berichten: 6940
Lid geworden op: 05 feb 2003, 14:00
Locatie: Amsterdam
Contacteer:

Bericht door mosymuis » 25 feb 2004, 18:44

Code: Selecteer alles

Parse error: parse error in /home/inward/public_html/index.php on line 179
:shock:

Inward
Berichten: 99
Lid geworden op: 07 feb 2004, 13:46

Bericht door Inward » 25 feb 2004, 18:47

Ja ben effe wat ana het proberen.

Code: Selecteer alles

$string = ['topic_title']; 
echo substr($string,0,20);
Zo moest hij de eerste 20 letter`s pakken...
En het resultaat heb je al :P

Ik zal wel wer effe neerzetten waar we waren gebleven.

Gebruikersavatar
mosymuis
Berichten: 6940
Lid geworden op: 05 feb 2003, 14:00
Locatie: Amsterdam
Contacteer:

Bericht door mosymuis » 25 feb 2004, 18:54

Ik zal je uitleggen wat mijn code deed, dan kan jij daarmee verder.

Code: Selecteer alles

$topic_title = (strlen($recent_topic_row[$i]['topic_title']) > 20) ? rtrim(substr($recent_topic_row[$i]['topic_title'], 0, 17)) . '...' : $recent_topic_row[$i]['topic_title'];
strlen()
Tel "$recent_topic_row[$i]['topic_title']".

$topic_title = () ? '' : '';
$recent_topic_row[$i]['topic_title']) > 20

Is deze langer dan 20 tekens? Zoja, voer dan het volgende uit en sla de uitkomst op in $topic_title. Als deze korter is dan 20 tekens pakt hij het standaard "$recent_topic_row[$i]['topic_title']" als waarde voor "$topic_title".

rtrim()
Haal alle whitespace op het einde weg

substr($recent_topic_row[$i]['topic_title'], 0, 17)
Laat het begin van de string met rust en crop hem tot 17 tekens.

. '...'
Voeg er drie tekens aan toe.

'L_TITLE' => $topic_title,
Sla de uitkomsten van dit bovenste op in {L_TITLE}


---

//edit
Ik zie nu waar het fout gaat, de extra code staat voor de lus en omdat $i dus niet bestaat is de string telkens leeg. Dit verklaart de lege plaatsen zonder errors.

Plaats

Code: Selecteer alles

$topic_title = (strlen($recent_topic_row[$i]['topic_title']) > 20) ? rtrim(substr($recent_topic_row[$i]['topic_title'], 0, 17)) . '...' : $recent_topic_row[$i]['topic_title'];
dus áchter

Code: Selecteer alles

for ($i = 0; $i < $number_recent_topics; $i++)
{
. ;)

Gesloten