[gelöst] Anzeige der Themen der letzten 24 Stunden

Started by MaikSiebel, April 12, 2005, 08:57:23 AM

Previous topic - Next topic

MaikSiebel

Ist es möglich über einen Link alle Themen der letzten 24 Stunden anzeigen zu lassen? Wäre toll wenn mir jemand in dieser Richtung helfen könnte. Ich würde das auch gerne anpassen können, also für die letzten 12, 24 und 48 Stunden und die letzten 7 Tage.

Bin gespannt auf eure Antworten.

Viele Grüße
Maik



MaikSiebel

Nein bisher nicht.

Bekomme die Meldung " The topic or board you are looking for appears to be either missing or off limits to you." wenn ich auf den Link klicke.

Daniel D.

Änderungen in Recent.php:

Quote from: [Unknown] on April 14, 2005, 10:27:08 AM
Find this:

// Find the 10 most recent messages they can *view*.
$request = db_query("
SELECT m.ID_MSG
FROM {$db_prefix}messages AS m, {$db_prefix}boards AS b
WHERE b.ID_BOARD = m.ID_BOARD" . (!empty($modSettings['recycle_enable']) && $modSettings['recycle_board'] > 0 ? "
AND b.ID_BOARD != $modSettings[recycle_board]" : '') . "
AND $user_info[query_see_board]
ORDER BY m.ID_MSG DESC
LIMIT 10", __FILE__, __LINE__);
$messages = array();
while ($row = mysql_fetch_assoc($request))
$messages[] = $row['ID_MSG'];
mysql_free_result($request);


Replace:

// Find the 10 most recent messages they can *view*.
$request = db_query("
SELECT m.ID_MSG
FROM {$db_prefix}messages AS m, {$db_prefix}boards AS b
WHERE b.ID_BOARD = m.ID_BOARD" . (!empty($modSettings['recycle_enable']) && $modSettings['recycle_board'] > 0 ? "
AND b.ID_BOARD != $modSettings[recycle_board]" : '') . "
AND $user_info[query_see_board]
AND m.posterTime > " . (time() - 86400) . "
ORDER BY m.ID_MSG DESC
LIMIT ##", __FILE__, __LINE__);
$messages = array();
while ($row = mysql_fetch_assoc($request))
$messages[] = $row['ID_MSG'];
mysql_free_result($request);


Replace ## with the maximum number of posts you want to display.  Even if you want a lot, I recommend limiting it to at least 100.

I should note that the above will not be "today's posts" but rather "posts made in the last twenty-four hours".  It's roughly the same.  You'll also have to edit this:

WHERE m2.ID_MSG = t.ID_FIRST_MSG
AND t.ID_TOPIC = m.ID_TOPIC
AND b.ID_BOARD = t.ID_BOARD
AND c.ID_CAT = b.ID_CAT
AND m.ID_MSG IN (" . implode(', ', $messages) . ")
ORDER BY m.ID_MSG DESC
LIMIT 0, 10", __FILE__, __LINE__);


And replace the "10" there with the same number above.

-[Unknown]

MaikSiebel

Das klappt schon toll, danke. Jetzt müsste ich nur noch wissen wie ich ausschließlich die Topics ausgebe. Ich möchte nicht jeden Beitrag eines Themas angezeigt bekommen.

Daniel D.

#6
Quote from: MaikSiebel on April 15, 2005, 02:40:48 AM
Das klappt schon toll, danke. Jetzt müsste ich nur noch wissen wie ich ausschließlich die Topics ausgebe. Ich möchte nicht jeden Beitrag eines Themas angezeigt bekommen.
Hehe, das hatte auch der User gefragt. ;D (Ich Blödmann :-[)

Am besten über ein neues Template. Ich denke, du kannst damit die Änderungen in Recent.php wieder rückgängig machen, aber probiere es erst aus. Ich habe mich noch nicht damit beschäftigt.

Quote from: [Unknown] on April 14, 2005, 12:51:56 PM
I would use, as a template, UnreadTopics then... but that'd be a bit more complicated to work out... here's a rough idea:

function TodaysTopics()
{
global $board, $txt, $scripturl, $db_prefix, $sourcedir;
global $ID_MEMBER, $user_info, $context, $modSettings;

////////////////////////////////////////////////////////// You'll want to create this sub template as well, based on the unread one.
$context['sub_template'] = 'today';
$context['page_title'] = 'Today\'s Topics';

$context['linktree'][] = array(
'url' => $scripturl . '?action=today',
'name' => $context['page_title']
);

loadTemplate('Recent');

$select_clause = '
ms.subject AS firstSubject, ms.posterTime AS firstPosterTime, ms.ID_TOPIC, t.ID_BOARD, b.name AS bname,
t.numReplies, t.numViews, ms.ID_MEMBER AS ID_FIRST_MEMBER, ml.ID_MEMBER AS ID_LAST_MEMBER,
ml.posterTime AS lastPosterTime, IFNULL(mems.realName, ms.posterName) AS firstPosterName,
IFNULL(meml.realName, ml.posterName) AS lastPosterName, ml.subject AS lastSubject,
ml.icon AS lastIcon, ms.icon AS firstIcon, t.ID_POLL, t.isSticky, t.locked, ml.modifiedTime AS lastModifiedTime,
IFNULL(lt.logTime, IFNULL(lmr.logTime, 0)) AS isRead, LEFT(ml.body, 384) AS lastBody, LEFT(ms.body, 384) AS firstBody,
ml.smileysEnabled AS lastSmileys, ms.smileysEnabled AS firstSmileys, t.ID_FIRST_MSG, t.ID_LAST_MSG';

$request = db_query("
SELECT COUNT(DISTINCT t.ID_TOPIC), MIN(t.ID_LAST_MSG)
FROM {$db_prefix}messages AS ml, {$db_prefix}topics AS t, {$db_prefix}boards AS b
LEFT JOIN {$db_prefix}log_topics AS lt ON (lt.ID_TOPIC = t.ID_TOPIC AND lt.ID_MEMBER = $ID_MEMBER)
LEFT JOIN {$db_prefix}log_mark_read AS lmr ON (lmr.ID_BOARD = t.ID_BOARD AND lmr.ID_MEMBER = $ID_MEMBER)
WHERE b.ID_BOARD = t.ID_BOARD
AND $user_info[query_see_board]
AND ml.posterTime >= " . (time() - 86400) . "
AND ml.ID_MSG = t.ID_LAST_MSG
AND IFNULL(lt.logTime, IFNULL(lmr.logTime, 0)) < ml.posterTime", __FILE__, __LINE__);
list ($num_topics, $min_message) = mysql_fetch_row($request);
mysql_free_result($request);

$context['page_index'] = constructPageIndex($scripturl . '?action=today', $_REQUEST['start'], $num_topics, $modSettings['defaultMaxTopics']);
$context['current_page'] = (int) $_REQUEST['start'] / $modSettings['defaultMaxTopics'];

if ($num_topics == 0)
{
$context['topics'] = array();
return;
}
else
$min_message = (int) $min_message;

$request = db_query("
SELECT $select_clause
FROM {$db_prefix}messages AS ms, {$db_prefix}messages AS ml, {$db_prefix}topics AS t, {$db_prefix}boards AS b
LEFT JOIN {$db_prefix}members AS mems ON (mems.ID_MEMBER = ms.ID_MEMBER)
LEFT JOIN {$db_prefix}members AS meml ON (meml.ID_MEMBER = ml.ID_MEMBER)
LEFT JOIN {$db_prefix}log_topics AS lt ON (lt.ID_TOPIC = t.ID_TOPIC AND lt.ID_MEMBER = $ID_MEMBER)
LEFT JOIN {$db_prefix}log_mark_read AS lmr ON (lmr.ID_BOARD = t.ID_BOARD AND lmr.ID_MEMBER = $ID_MEMBER)
WHERE t.ID_TOPIC = ms.ID_TOPIC
AND b.ID_BOARD = t.ID_BOARD
AND $user_info[query_see_board]
AND ms.ID_MSG = t.ID_FIRST_MSG
AND ml.ID_MSG = t.ID_LAST_MSG
AND t.ID_LAST_MSG >= $min_message
AND IFNULL(lt.logTime, IFNULL(lmr.logTime, 0)) < ml.posterTime
ORDER BY ml.ID_MSG DESC
LIMIT $_REQUEST[start], $modSettings[defaultMaxTopics]", __FILE__, __LINE__);
$context['topics'] = array();
$topic_ids = array();
while ($row = mysql_fetch_assoc($request))
{
if ($row['ID_POLL'] > 0 && $modSettings['pollMode'] == '0')
continue;

$topic_ids[] = $row['ID_TOPIC'];

// Clip the strings first because censoring is slow :/. (for some reason?)
$row['firstBody'] = strip_tags(strtr(doUBBC($row['firstBody'], $row['firstSmileys']), array('<br />' => '&#10;')));
if (strlen($row['firstBody']) > 128)
$row['firstBody'] = substr($row['firstBody'], 0, 128) . '...';
$row['lastBody'] = strip_tags(strtr(doUBBC($row['lastBody'], $row['lastSmileys']), array('<br />' => '&#10;')));
if (strlen($row['lastBody']) > 128)
$row['lastBody'] = substr($row['lastBody'], 0, 128) . '...';

// Do a bit of censoring...
censorText($row['firstSubject']);
censorText($row['firstBody']);

// But don't do it twice, it can be a slow ordeal!
if ($row['ID_FIRST_MSG'] == $row['ID_LAST_MSG'])
{
$row['lastSubject'] = $row['firstSubject'];
$row['lastBody'] = $row['firstBody'];
}
else
{
censorText($row['lastSubject']);
censorText($row['lastBody']);
}

// Decide how many pages the topic should have.
$topic_length = $row['numReplies'] + 1;
if ($topic_length > $modSettings['defaultMaxMessages'])
{
$tmppages = array();
$tmpa = 1;
for ($tmpb = 0; $tmpb < $topic_length; $tmpb += $modSettings['defaultMaxMessages'])
{
$tmppages[] = '<a href="' . $scripturl . '?topic=' . $row['ID_TOPIC'] . '.' . $tmpb . ';topicseen">' . $tmpa . '</a>';
$tmpa++;
}
// Show links to all the pages?
if (count($tmppages) <= 5)
$pages = '« ' . implode(' ', $tmppages);
// Or skip a few?
else
$pages = '« ' . $tmppages[0] . ' ' . $tmppages[1] . ' ... ' . $tmppages[count($tmppages) - 2] . ' ' . $tmppages[count($tmppages) - 1];

if (!empty($modSettings['enableAllMessages']) && $topic_length < $modSettings['enableAllMessages'])
$pages .= ' &nbsp;<a href="' . $scripturl . '?topic=' . $row['ID_TOPIC'] . '.0;all">' . $txt[190] . '</a>';
$pages .= ' »';
}
else
$pages = '';

// And build the array.
$context['topics'][$row['ID_TOPIC']] = array(
'id' => $row['ID_TOPIC'],
'first_post' => array(
'member' => array(
'name' => $row['firstPosterName'],
'id' => $row['ID_FIRST_MEMBER'],
'href' => $scripturl . '?action=profile;u=' . $row['ID_FIRST_MEMBER'],
'link' => !empty($row['ID_FIRST_MEMBER']) ? '<a href="' . $scripturl . '?action=profile;u=' . $row['ID_FIRST_MEMBER'] . '" title="' . $txt[92] . ' ' . $row['firstPosterName'] . '">' . $row['firstPosterName'] . '</a>' : $row['firstPosterName']
),
'time' => timeformat($row['firstPosterTime']),
'timestamp' => $row['firstPosterTime'],
'subject' => $row['firstSubject'],
'preview' => $row['firstBody'],
'icon' => $row['firstIcon'],
'href' => $scripturl . '?topic=' . $row['ID_TOPIC'] . '.0;topicseen',
'link' => '<a href="' . $scripturl . '?topic=' . $row['ID_TOPIC'] . '.0;topicseen">' . $row['firstSubject'] . '</a>'
),
'last_post' => array(
'member' => array(
'name' => $row['lastPosterName'],
'id' => $row['ID_LAST_MEMBER'],
'href' => $scripturl . '?action=profile;u=' . $row['ID_LAST_MEMBER'],
'link' => !empty($row['ID_LAST_MEMBER']) ? '<a href="' . $scripturl . '?action=profile;u=' . $row['ID_LAST_MEMBER'] . '">' . $row['lastPosterName'] . '</a>' : $row['lastPosterName']
),
'time' => timeformat($row['lastPosterTime']),
'timestamp' => $row['lastPosterTime'],
'subject' => $row['lastSubject'],
'preview' => $row['lastBody'],
'icon' => $row['lastIcon'],
'href' => $scripturl . '?topic=' . $row['ID_TOPIC'] . ($row['numReplies'] == 0 ? '.0' : '.msg' . $row['ID_LAST_MSG']) . ';topicseen#msg' . $row['ID_LAST_MSG'],
'link' => '<a href="' . $scripturl . '?topic=' . $row['ID_TOPIC'] . ($row['numReplies'] == 0 ? '.0' : '.msg' . $row['ID_LAST_MSG']) . ';topicseen#msg' . $row['ID_LAST_MSG'] . '">' . $row['lastSubject'] . '</a>'
),
'newtime' => $row['isRead'],
'new_href' => $scripturl . '?topic=' . $row['ID_TOPIC'] . '.from' . $row['isRead'] . ';topicseen#new',
'href' => $scripturl . '?topic=' . $row['ID_TOPIC'] . ($row['numReplies'] == 0 ? '.0' : '.from' . $row['isRead']) . ';topicseen#new',
'link' => '<a href="' . $scripturl . '?topic=' . $row['ID_TOPIC'] . ($row['numReplies'] == 0 ? '.0' : '.from' . $row['isRead']) . ';topicseen#new">' . $row['firstSubject'] . '</a>',
'is_sticky' => !empty($modSettings['enableStickyTopics']) && !empty($row['isSticky']),
'is_locked' => !empty($row['locked']),
'is_poll' => $modSettings['pollMode'] == '1' && $row['ID_POLL'] > 0,
'is_hot' => $row['numReplies'] >= $modSettings['hotTopicPosts'],
'is_very_hot' => $row['numReplies'] >= $modSettings['hotTopicVeryPosts'],
'is_posted_in' => false,
'icon' => $row['firstIcon'],
'subject' => $row['firstSubject'],
'pages' => $pages,
'replies' => $row['numReplies'],
'views' => $row['numViews'],
'board' => array(
'id' => $row['ID_BOARD'],
'name' => $row['bname'],
'href' => $scripturl . '?board=' . $row['ID_BOARD'] . '.0',
'link' => '<a href="' . $scripturl . '?board=' . $row['ID_BOARD'] . '.0">' . $row['bname'] . '</a>'
)
);

determineTopicClass($context['topics'][$row['ID_TOPIC']]);
}
mysql_free_result($request);

if (!empty($modSettings['enableParticipation']) && !empty($topic_ids))
{
$result = db_query("
SELECT ID_TOPIC
FROM {$db_prefix}messages
WHERE ID_TOPIC IN (" . implode(', ', $topic_ids) . ")
AND ID_MEMBER = $ID_MEMBER", __FILE__, __LINE__);
while ($row = mysql_fetch_assoc($result))
{
if (empty($context['topics'][$row['ID_TOPIC']]['is_posted_in']))
{
$context['topics'][$row['ID_TOPIC']]['is_posted_in'] = true;
$context['topics'][$row['ID_TOPIC']]['class'] = 'my_' . $context['topics'][$row['ID_TOPIC']]['class'];
}
}
mysql_free_result($result);
}

$context['topics_to_mark'] = implode('-', $topic_ids);
}


-[Unknown]

MaikSiebel

Und wie erstelle ich ein neues Template für today?

MaikSiebel

Wenn ich die Funktion TodaysTopics() ausführe, dann wird mir gesagt, dass das Template today nicht gefunden wird. Wie muss ich weitermachen?

Spanko

Hallo,
wenn ich die recent.php so geändert habe wie oben beschrieben, welchen Link muß ich dann klicken um die letzten 24 Stunden anzuzeigen? Und wie kann ich den Linknamen ändern?

Und wie kann ich es ändern, daß beim Klick auf "ungelesene Beiträge seit ihrem letzten Besuch" nicht die Topics angezeigt werden, sondern die Posts (oder was noch besser wäre: wenn ich auf ungelesene Beiträge seit dem letzten Besuch klicke, daß dann wie jetzt die Topics kommen und ich die wenn ich will einzeln durchklicken kann - oder wenn ich dann auf "alle als gelesen markieren" klicke, daß dann alle als gelesen markiert werden [logisch  ;D] aber dann zusätzlich alle Posts kommen, die auch als gelesen markiert wurden)?

Hoffe mir kann jemand helfen  :-\

Danke

dieter4


Spanko


dieter4

Der Code von oben könnte vllt nicht passen, da er etwas älter ist. D.h. für SMF 1.0.2 oder so.
Oder hast du es schon ausprobiert?

Spanko

nein, hab ich noch nicht - ich dachte ich frag erst mal nach bevor ich was ändere  :D

dieter4

Backup amchen -> ändern -> ausprobieren -> wenn was schiefläuft backup wieder zurückspielen

Spanko

#15
OK, hab den Code geändert - und es hat (mehr oder weniger) geklappt.

Also wie ich vermutet habe kommen jetzt die letzten Posts der letzten 24 Stunden, wenn ich auf der Hauptseite unten auf "Anzeigen der neuesten Beiträge" klicke.

Allerdings gibt es da noch 2 Probleme: wie änder ich den Linknamen von "Anzeigen der neuesten Beiträge" auf "Beiträge der letzten 24 Stunden"?
Und: warum kommen da dann zwar auf der ersten Seite alle Beiträge der letzten 24 Stunden, aber es gibt noch Seite 2,3,4,... - kann man irgendwo einstellen, daß dann nur diese Beiträge der letzten 24 Stunden kommen?


Und dann noch zu meinem anderen oben geposteten Problem mit den ungelesenen Beiträgen seit meinem letzten Besuch - hat da vielleicht auch jemand ne Lösung?

Danke

Edit: also wie ich den Linknamen ändere habe ich jetzt rausgefunden - einfach in der Language-Datei des Templates. Aber wie bekomme ich die Seitenanzahl nich weg, denn es werden zwar die Postings der letzten 24 Stunden angezeigt, aber dann kann ich auch auf Seite 2, 3, 4 usw klicken, wobei dort auch nur die gleichen Postings wieder kommen.

dieter4

Die Beiträge werden nur auf einer Seite dargestellt, wenn es nicht zu viele sind.

Den Text kannst in den Sprachdateien ändern.

Spanko

das ist ja das komische - wenn ich das Limit z.B. auf 500 setze und draufklicke, dann kommen auf der ersten Seite ca. 300 Beiträge (das sind alle der letzten 24 Stunden). Allerdings gibt es trotzdem Seite 2,3,4,... und wenn ich dort dann draufklicke kommen genau die gleichen Beiträge nochmal.

Wenn ich das Limit z.B. auf 100 stelle kommen auf der ersten Seite 100 Beiträge, wenn ich dann auf Seite 2 klicke kommen wieder 100 Beiträge beginnend ab Beitrag 10 (als Link-adresse ist bei Seite 2 das hier: http://forum.nofx.de/index.php?action=recent;start=10 und bei Seite 3: http://forum.nofx.de/index.php?action=recent;start=20)

Da muß ich sicherlich noch sonstwo was ändern, oder?

dieter4

Schau einmal im Template nach. Ich glaube das war Recent.template.php

Spanko

ok, ich sollte vielleicht mal sagen, daß ich mit mit PHP fast gar nicht auskenne.

Hab jetzt mal das Template angeschaut aber nichts gefunden, was evtl. die Seitenanzeige aufruft.

Wie müsste das heißen?

noex

Die Funktion müsste entweder create_pageIndex oder construct_pageIndex heißen.

lg
noex

"Jetzt, wo ich weiß wie es geht, versteh ich auch die Gebrauchsanleitung"

Spanko

hallo

leider gibt es diese funktion in keiner einzigen Datei des Templates (ist das default Template)

noex

so, habs jetzt gerade zufällig gefunden, die funktion heißt constructPageIndex

lg
noex
"Jetzt, wo ich weiß wie es geht, versteh ich auch die Gebrauchsanleitung"

Spanko

Hallo,

vielen Dank - jetzt sind die Seitenzahlen weg, und alles wird auf einer Seite angezeigt  :)

Advertisement: