SMFPortal.de

Willkommen !

Autor Thema: PHP-Problem im Simple Portal Block "Letzte Beiträge"  (Gelesen 2110 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Ruth

  • Spezialist
  • ****
  • Beiträge: 331
PHP-Problem im Simple Portal Block "Letzte Beiträge"
« am: 24. April 2014, 02:23:24 »
Hallo, miteinander!

Ich würde ja im Simple Portal nachfragen, aber mein Problem kann ich auf englisch nicht verständlich schildern. Vielleicht kann mir hier jemand helfen?

Ich verwende diesen PHP-Code in einem Portal Block, er zeigt die 20 letzten Beiträge/Themen und das Themen-Icon, das im ersten Beitrag des jeweiligen Themas erscheint:

Code
global $context, $settings, $scripturl, $txt;
global $user_info, $modSettings, $smcFunc, $posts;
global $color_profile;

$exclude_boards = null;
$num_recent = !empty($parameters[0]) ? $parameters[0] :  (isset($_GET['limit']) ? (int) $_GET['limit'] : 20);

if ($exclude_boards === null && !empty($modSettings['recycle_enable']) && $modSettings['recycle_board'] > 0)
$exclude_boards = array($modSettings['recycle_board']);
else
$exclude_boards = empty($exclude_boards) ? array() : $exclude_boards;

$stable_icons = array('xx', 'thumbup', 'thumbdown', 'exclamation', 'question', 'lamp', 'smiley', 'angry', 'cheesy', 'grin', 'sad', 'wink', 'moved', 'recycled', 'wireless');
$icon_sources = array();
foreach ($stable_icons as $icon)
$icon_sources[$icon] = 'images_url';

// Find all the posts in distinct topics.  Newer ones will have higher IDs.
$request = $smcFunc['db_query']('','
SELECT
m.poster_time, ms.subject, m.id_topic, m.id_member, m.id_msg, b.id_board, t.num_replies, t.num_views, b.name AS bName,
IFNULL(mem.real_name, m.poster_name) AS poster_name, ' . ($user_info['is_guest'] ? '1 AS is_read, 0 AS new_from' : '
IFNULL(lt.id_msg, IFNULL(lmr.ID_MSG, 0)) >= m.id_msg_modified AS is_read,
IFNULL(lt.id_msg, IFNULL(lmr.ID_MSG, -1)) + 1 AS new_from') . ', LEFT(m.body, 384) AS body, m.smileys_enabled, mf.icon
FROM ({db_prefix}messages AS m, {db_prefix}topics AS t, {db_prefix}boards AS b, {db_prefix}messages AS ms)
INNER JOIN {db_prefix}messages AS mf ON (mf.id_msg = t.id_first_msg)
LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = m.id_member)' . (!$user_info['is_guest'] ? '
LEFT JOIN {db_prefix}log_topics AS lt ON (lt.id_topic = t.id_topic AND lt.id_member = {int:id_member})
LEFT JOIN {db_prefix}log_mark_read AS lmr ON (lmr.id_board = b.id_board AND lmr.id_member = {int:id_member})' : '') . '
WHERE t.ID_LAST_MSG >= ' . ($modSettings['maxMsgID'] - 35 * min($num_recent, 5)) . '
AND t.id_last_msg = m.id_msg
AND b.id_board = t.id_board' . (empty($exclude_boards) ? '' : '
AND b.id_board NOT IN ({array_int:exclude_boards})'). '
AND {raw:query_see_board}
AND ms.id_msg = t.id_last_msg
ORDER BY t.id_last_msg DESC
LIMIT {int:limit}',
array(
'id_member' => $user_info['id'],
'exclude_boards' => $exclude_boards,
'query_see_board' => $user_info['query_wanna_see_board'],
'limit' => (int) $num_recent,
)
);
$posts = array();
$colorids = array();
while ($row = $smcFunc['db_fetch_assoc']($request))
{
$row['body'] = strip_tags(strtr(parse_bbc($row['body'], $row['smileys_enabled'], $row['id_msg']), array('<br />' => '')));
if ($smcFunc['strlen']($row['body']) > 128)
$row['body'] = $smcFunc['substr']($row['body'], 0, 128) . '...';

// Censor the subject.
                  $row['subject'] = preg_replace('/^' . preg_quote($txt['response_prefix']) . '/', '', $row['subject']);
censorText($row['subject']);
censorText($row['body']);

//Collect the color ids :)
$colorids[$row['id_member']] = $row['id_member'];

if (empty($modSettings['messageIconChecks_disable']) && !isset($icon_sources[$row['icon']]))
$icon_sources[$row['icon']] = file_exists($settings['theme_dir'] . '/images/post/' . $row['icon'] . '.gif') ? 'images_url' : 'default_images_url';

// Build the array.
$posts[] = array(
'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>'
),
'topic' => $row['id_topic'],
'poster' => array(
'id' => $row['id_member'],
'name' => $row['poster_name'],
'href' => empty($row['id_member']) ? '' : $scripturl . '?action=profile;u=' . $row['id_member'],
'link' => empty($row['id_member']) ? $row['poster_name'] : '<a href="' . $scripturl . '?action=profile;u=' . $row['id_member'] . '">' . $row['poster_name'] . '</a>'
),
'subject' => $row['subject'],
'short_subject' => shorten_subject($row['subject'], 25),
'preview' => $row['body'],
'time' => timeformat($row['poster_time']),
'timestamp' => forum_time(true, $row['poster_time']),
'href' => $scripturl . '?topic=' . $row['id_topic'] . '.msg' . $row['id_msg'] . ';topicseen#new',
'link' => '<a href="' . $scripturl . '?topic=' . $row['id_topic'] . '.msg' . $row['id_msg'] . '#new">' . $row['subject'] . '</a>',
'new' => !empty($row['is_read']),
'new_from' => $row['new_from'],
'icon' => '<img src="' . $settings[$icon_sources[$row['icon']]] . '/post/' . $row['icon'] . '.gif" align="middle" alt="' . $row['icon'] . '" border="0" />',
'views' => $row['num_views'],
'replies' => $row['num_replies'],
);
}
$smcFunc['db_free_result']($request);

// Load recent topic posts colors =)
if(!empty($colorids) && sp_loadColors($colorids) !== false)
foreach($posts as $k => $p)
if(!empty($color_profile[$p['poster']['id']]['link']))
$posts[$k]['poster']['link'] = $color_profile[$p['poster']['id']]['link'];

$context['recent_topics']=$posts;

// Just return it.
if (empty($posts))
return $posts;

echo '
<div class="tborder">
<table cellspacing="0" width="100%">
<tr class="catbg">

</tr>
<tr>
<td style="padding: 5px;">
</td> ';
foreach ($posts as $post)
echo '
<tr>
<td align="center" valign="middle" nowrap="nowrap">
', $post['icon'], '
</td>
<td valign="middle" width="%100">
<div style="font-size: 12px;"><b>
<a href="', $post['href'], '">', $post['subject'], '</a>
', $post['new'] ? '' : '<a href="' . $scripturl . '?topic=' . $post['topic'] . '.msg' . $post['new_from'] . ';topicseen#new"><img src="' . $settings['images_url'] . '/' . $context['user']['language'] . '/new.gif" alt="' . $txt['new'] . '" border="0" /></a>', '</b></div><div style="font-size: 9px;">in ', $post['board']['link'], ' von ', $post['poster']['link'], '  am ', $post['time'], '
</font><hr>
</td>
</tr>';
echo '
</table></div>';



Es sollten immer 20 Beiträge angezeigt werden. Das funktioniert auch perfekt, wenn man eingeloggt ist. Die User sehen auch nur die Beiträge aus Boards, auf die sie Zugriff haben.

Wenn man jedoch als Gast diesen Block betrachtet, sieht man bloß noch ca. 8 Beiträge, die Anzahl schwankt, es waren auch schon weniger.

Ich verstehe das gar nicht. Gäste sollten da doch auch immer 20 Beiträge sehen, nur eben tw. andere, ältere Beiträge, da sie nicht auf alle Boards Zugriff haben, die eingeloggte User sehen können.

Habe es auch schon mit zwei verschiedenen Blocks versucht, einen, den nur Gäste sehen können und einen, den nur Mitglieder sehen können. Aber das Phänomen bleibt das gleiche. Die Anzahl der Beiträge reduziert sich für Gäste auf 8.

Ist da vielleicht ein Fehler im Code? Oder liegt es daran, worauf dieser Code basiert?

Wenn man beispielsweise im Forum als Gast diesen Link "Anzeigen der neuesten Beiträge" benutzt, sieht man ja auch nur eine Seite mit Posts von eigentlich 10 Seiten, Seite 2 bis 10 sind für Gäste leer. Als eingeloggter User sieht man alle Seiten.

Ist da eine Limitierung für Gäste eingebaut, die auch in diesem Block-Code zum tragen kommt?

Ruth

  • Spezialist
  • ****
  • Beiträge: 331
Re: PHP-Problem im Simple Portal Block "Letzte Beiträge"
« Antwort #1 am: 11. März 2016, 09:36:09 »
Hallo, miteinander!

Das neue Styling hier ist für mich etwas verwirrend. Ich wollte gerade in den Forenregeln nachlesen, ob das "Pushen von Themen" erlaubt ist, habe die diesbezüglichen Regeln aber nicht gefunden. Wo sind sie denn?

Den ersten Beitrag im Thema hier hatte ich vor fast zwei Jahren geschrieben. Eine Lösung für das Problem habe ich noch nicht.

Es ist z.B. auch so, dass wenn im Team-Bereich mal eine Weile viel geschrieben wird, sich die Liste der aktuellen Themen im Portal für die Mitglieder stark verkürzt. Den Fall hatten wir neulich. Eingeloggte Mitglieder sahen statt 20 Themen nur noch 9 Themen in diesem Portalblock.  Das sollte so nicht sein.

Ich hatte damals dann doch auf Englisch im SimplePortal nachgefragt, aber eine Antwort erhalten, die schon alleine meine Englisch-Kenntnisse übersteigt. Es hängt wohl mit irgendeiner Veränderung bezüglich der Datenbankabfrage zusammen? 

Ich setze hier mal die Antwort rein, die ich damals im SimplePortal erhalten habe:

The SimplePortal recent post / topic block uses SMF's SSI recent posts and recent topics functions.

If
1) You display recent posts/topics from only SOME boards and
2) These boards are much less active than the rest of the forum,

You will often see fewer posts than you want to see in recent posts and topics.
This is because, to save CPU use, the SSI function only searches back a small number of posts --  (125 or 175)
If you search in SSI.php, you will find
Code
* min($num_recent, 5)
And you will find this in two places -- ssi_recentPosts and ssi_recentTopics

In the most recent version of SMF, the number before the "*" is a 25 in recentPosts and 35 in recentTopics.
If you are not getting enough posts in your recentposts/topics block, you can raise this number.  Depending on your forum, you might use 50 in both cases, or 100.  It all depends on your forum.

When you make this change in SSI.php, you will wind up with something like the following:
Code
'min_message_id' => $modSettings['maxMsgID'] - 50 * min($num_recent, 5),

---------
When you look at  http://simpleportal.net/index.php?action=recent, you are seeing the results of a COMPLETELY different section of SMF code.  When I do this as guest, I see all 10 pages here at simpleportal.net.


Vielleicht kann mir hier doch noch jemand helfen? Ich wäre sehr dankbar dafür.
« Letzte Änderung: 11. März 2016, 12:55:21 von Ruth »

Parmaster

  • Isomorpher Algorithmus
  • Administration
  • *****
  • Beiträge: 1205
  • Geschlecht: Männlich
Re: PHP-Problem im Simple Portal Block "Letzte Beiträge"
« Antwort #2 am: 11. März 2016, 10:29:46 »
Hallo,

also das Problem ist 1., dass die SSI nur 125 (oder 175) letzte Beiträge nimmt. Wenn da jetzt z.B. 175 nur im Teambereich geschrieben wurden, sehen die normalen Mitglieder halt nichts.

Dann ist noch das Problem, die Anzeige wie viele der letzten Beiträge angezeigt werden. Ich glaub voreingestellt sind 25 oder so.

Setze mal die Werte hoch, also sowohl in der SSI.php als auch in den Boards selbst.

Wenn das alles nichts hilft, kann ich mir mal den Code genauer anschauen. Muss zugeben, dass ich PHP schon seit Jahren nicht mehr mache.
Eine digitale Welt zur Neugestaltung des menschlichen Daseins

Ruediger

  • Administration
  • *****
  • Beiträge: 1170
  • Geschlecht: Männlich
Re: PHP-Problem im Simple Portal Block "Letzte Beiträge"
« Antwort #3 am: 11. März 2016, 11:33:52 »
Hallo, miteinander!

Das neue Styling hier ist für mich etwas verwirrend. Ich wollte gerade in den Forenregeln nachlesen, ob das "Pushen von Themen" erlaubt ist, habe die diesbezüglichen Regeln aber nicht gefunden. Wo sind sie denn?

Hallo Ruth, schön das du hierher gefunden hast.

Schau mal ganz unten, da findest du was du gesucht hattest.

Ruth

  • Spezialist
  • ****
  • Beiträge: 331
Re: PHP-Problem im Simple Portal Block "Letzte Beiträge"
« Antwort #4 am: 11. März 2016, 12:54:38 »
Vielen Dank, hatte den Link dann vorher doch noch gesehen, Rüdiger.

also das Problem ist 1., dass die SSI nur 125 (oder 175) letzte Beiträge nimmt. Wenn da jetzt z.B. 175 nur im Teambereich geschrieben wurden, sehen die normalen Mitglieder halt nichts.

Setze mal die Werte hoch, also sowohl in der SSI.php als auch in den Boards selbst.


Wo und was genau ist die SSI.php, Parmaster? Wie oder wo soll ich in den Boards Werte erhöhen? Ich weiß leider nicht, wie das gehen sollte.


Dann ist noch das Problem, die Anzeige wie viele der letzten Beiträge angezeigt werden. Ich glaub voreingestellt sind 25 oder so.



Die Anzahl der gelisteten Themen wird hier eingetragen. Steht hier auf 20. Es bringt nichts, wenn ich dort die Anzahl erhöhe. Das hatte ich auch schon versucht:

Code
$num_recent = !empty($parameters[0]) ? $parameters[0] :  (isset($_GET['limit']) ? (int) $_GET['limit'] : 20);

 

Internes

Nutzungsbedingungen Impressum

Wissenswertes

Hilfe Knowledge Base

Nützliches

Downloads Socialmedia