Pagina 1 van 2

Recent topics afbreken

Geplaatst: 24 feb 2004, 15:11
door Inward
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 :)

Geplaatst: 24 feb 2004, 15:47
door mosymuis
Als je een beetje handig bent in PHP kan je je script combineren met dit exemplaar:

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

Geplaatst: 24 feb 2004, 16:06
door Inspiration
Er is overigens een kant en klaar recente topics mod te vinden op phpbbhacks.com :idea:

Geplaatst: 24 feb 2004, 18:45
door Inward
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?

Geplaatst: 24 feb 2004, 19:39
door mosymuis
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:

Geplaatst: 24 feb 2004, 22:38
door Inward
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?

Geplaatst: 24 feb 2004, 23:05
door mosymuis
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)) . '...';

Geplaatst: 25 feb 2004, 00:21
door Inspiration
Bij deze mod werkte wat je aangeeft bij mij in ieder geval direct. Je moet iets gewijzigd hebben lijkt me.

Geplaatst: 25 feb 2004, 12:25
door Inward
Bij mij toch echter niet..
Ook als ik alle andere veranderingen eruit laat :?

Geplaatst: 25 feb 2004, 13:07
door mosymuis
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'];

Geplaatst: 25 feb 2004, 14:06
door Inward
Nouw geeft hij geen topic`s meer weer :?

Geplaatst: 25 feb 2004, 14:10
door mosymuis
Wat is nu je script? Wat zie je in je browser (url)? En krijg je errors?

Geplaatst: 25 feb 2004, 14:17
door Inward

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

Geplaatst: 25 feb 2004, 14:22
door mosymuis
Logisch, achter 'L_TITLE' => $topic_title moet een komma. ;)

Geplaatst: 25 feb 2004, 14:35
door Inward
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)

Geplaatst: 25 feb 2004, 14:37
door mosymuis
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?

Geplaatst: 25 feb 2004, 14:40
door Inward
http://www.inward.nl/index.php
Recente Topics kolom

Geplaatst: 25 feb 2004, 18:44
door mosymuis

Code: Selecteer alles

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

Geplaatst: 25 feb 2004, 18:47
door Inward
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.

Geplaatst: 25 feb 2004, 18:54
door mosymuis
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++)
{
. ;)