TP-Docs
HTML5 Icon HTML5 Icon HTML5 Icon
TP on Social Media

Recent

Welcome to TinyPortal. Please login or sign up.

February 26, 2024, 03:47:09 PM

Login with username, password and session length

Recent posts

#1
Block Codes / Re: Recent Topics/Posts with P...
Last post by @rjen - February 25, 2024, 09:07:36 PM
Thanks, will check it out
#2
Block Codes / Recent Topics/Posts with Post ...
Last post by Greybrow - February 25, 2024, 09:01:14 PM
SimplePortal seem to be dead, but this block still works in TinyPortal:

I changed only one thing with displaying the 'new' icon as it was changed in SMF2.1
Below is a copy of the post:  https://simpleportal.net/index.php?topic=9138.0


Recent Topics/Posts with Post Preview
[Made by Blue][I hope you like it =D]


Description: A block that previews the recent topics or posts with or without scrolling.

Requirements:
- SMF 2.0 GOLD
- Simple Portal 2.3.5

SETUP INSIDE:
+ Latest Topics OR Latest Messages
+ Number of posts
+ Number of characters to output
+ Scrolling Enable/Disable
+ Set height of the block for Scrolling
+ Set speed for Scrolling
+ Vertical scrollbar visible if you want
+ You can translate it to your own language with $text inside
+ Exclude boards that you want
+ HTMLSPECIALCHARS for languages that use special characters

Author Notes:
I've made a block for an user in the Block Requests and here it is ;) Suggestions are welcome :D

NEW VERSION:
1.1 -> BBCode and Hidden Boards fix
1.2 -> "New" image in topics/posts not read
1.3 -> Exclude boards that you want to hide from guests
1.4 -> Internet Explorer 8 fix (disable vertical scrollbar)
1.5 -> Permissons fix! (User only see what he is allowed to); Exclude boards for everyone and HTMLSPECIALCHARS to languages like Greek and bugfix.
1.6 -> Added Scrollbar option
1.7 -> Tweaked to show display names instead of usernames within the block (thanks to Sayaka Maizono)
1.8 -> Tweaked by GeorG (1. Icon "NEW" disappears when the message has been read 2. Guests are shown author nick)
1.9 -> Tweaked by Greybrow (Icon "NEW" displays in SMF2.1)

/*
Block: Recent posts with post preview
Author: Blue @ Simple Portal.net
Version: 1.9
*/

/* [SETUP WHAT YOU WANT HERE] */

$topics_posts = 1; // TOPICS - 1 | MESSAGES - 2
$limit = 5; // How many recent posts do you want to output?
$number = 70; // How many characters do you want to output?
$exclude_boards = null; // IF null guests can see all boards | IF you want to hide some boards use: array( ID1, ID2, ID3) where ID is the board's ID
$htmlspecialcharacters = false; // Do you need to show html special characters like Greek characters?

// Scroll Enable? Height and Speed?
$scrolling = 0; // ENABLE - 1 | DISABLE - 2
$speed = 3; // SLOW - 1 | MEDIUM - 10 | FAST - 20
$height = "150px";
$scrollbar = 0; // ENABLE - 1 | DISABLE - 2

// Do you want to translate it to your own language? :P
$text['sportal_false'] = 'Simple Portal not found';

/* [STOP!] - THIS IS THE END OF SETUP */

//Only code from now on ;)
global $smcFunc, $scripturl, $sourcedir, $modSettings, $user_info, $settings, $context, $txt;

// Lets see if you are using Simple Portal. If not...well...go get them :D
if (!file_exists($sourcedir . '/PortalBlocks.php')) {
    echo $text['sportal_false'];
    return;
}

// Let's grab some database results
if ($topics_posts == 1) {

    if (is_array($exclude_boards) || (int) $exclude_boards === $exclude_boards) {
        $exclude_boards = is_array($exclude_boards) ? $exclude_boards : array($exclude_boards);
    } elseif ($exclude_boards != null) {
        $output_method = $exclude_boards;
        $exclude_boards = array();
    }

    $posts_result = $smcFunc['db_query'](
        '',
        '
SELECT m.poster_time, m.id_msg, t.id_member_updated, m.subject, m.body, m.id_topic, b.name, t.id_last_msg, IFNULL(u.real_name, m.poster_name) AS poster_name, u.avatar, g.online_color,' . ($user_info['is_guest'] ? '1 AS is_read, 0 AS new_from' : '
(IFNULL(lb.id_msg, 0) >= b.id_msg_updated) AS is_read,
IFNULL(lb.id_msg, -1) + 1 AS new_from') . '
FROM {db_prefix}topics AS t
LEFT JOIN {db_prefix}boards AS b ON (t.id_board = b.id_board)
LEFT JOIN {db_prefix}messages AS m ON (m.id_msg = t.id_last_msg)
LEFT JOIN {db_prefix}members AS u ON (t.id_member_updated = u.id_member)' . ($user_info['is_guest'] ? '' : '
LEFT JOIN {db_prefix}log_boards AS lb ON (lb.id_board = b.id_board AND lb.id_member = {int:current_member})') . '
LEFT JOIN {db_prefix}membergroups AS g ON (g.id_group = CASE WHEN u.id_group = 0 THEN u.id_post_group ELSE u.id_group END)
' . (!$user_info['is_guest'] ? '
LEFT JOIN {db_prefix}log_topics AS lt ON (lt.id_topic = m.id_topic AND lt.id_member = ' . $user_info['id'] . ')
LEFT JOIN {db_prefix}log_mark_read AS lmr ON (lmr.id_board = b.id_board AND lmr.id_member = ' . $user_info['id'] . ')' : '') . '
WHERE m.approved=1' . (empty($exclude_boards) ? '' : '
AND b.id_board NOT IN ({array_int:exclude_boards})') . ' AND {query_see_board}
ORDER BY t.id_last_msg DESC
LIMIT ' . $limit,
        array(
            'exclude_boards' => empty($exclude_boards) ? '' : $exclude_boards,
            'current_member' => $user_info['id'],
        )
    );
    $posts = array();
    while ($row_posts = $smcFunc['db_fetch_assoc']($posts_result)) {

        global $memberContext;
        loadMemberData($row_posts['id_member_updated']);
        loadMemberContext($row_posts['id_member_updated']);

        $posts[] = array(
            'id' => $row_posts['id_member_updated'],
            'username' => '<a style="color: ' . $row_posts['online_color'] . ';" href="' . $scripturl . '?action=profile;u=' . $row_posts['id_member_updated'] . '">' . $row_posts['poster_name'] . '</a>',
            'subject' => '<a style="font-weight: bold;" title="' . $txt['board'] . ':&nbsp;' . $row_posts['name'] . '" href="' . $scripturl . '?topic=' . $row_posts['id_topic'] . '.msg' . $row_posts['id_last_msg'] . ';topicseen#new">' . $row_posts['subject'] . '</a>',
            'body' => $row_posts['body'],
            'avatar' => $row_posts['avatar'] == '' ? $memberContext[$row_posts['id_member_updated']]['avatar']['href'] : (stristr($row_posts['avatar'], 'http://') ? $row_posts['avatar'] : $modSettings['avatar_url'] . '/' . $row_posts['avatar']),
            'board' => $row_posts['name'],
            'time' => timeformat($row_posts['poster_time']),
            'new' => !empty($row_posts['is_read']),
            'subject_new' => $scripturl . '?topic=' . $row_posts['id_topic'] . '.msg' . $row_posts['id_msg'] . ';topicseen#new'
        );
    }
    $smcFunc['db_free_result']($posts_result);
} else {

    if (is_array($exclude_boards) || (int) $exclude_boards === $exclude_boards) {
        $exclude_boards = is_array($exclude_boards) ? $exclude_boards : array($exclude_boards);
    } elseif ($exclude_boards != null) {
        $output_method = $exclude_boards;
        $exclude_boards = array();
    }

    $posts_result = $smcFunc['db_query'](
        '',
        '
SELECT m.poster_time, m.id_msg, m.id_member, m.subject, m.body, m.id_topic, b.name, b.id_board, IFNULL(u.real_name, m.poster_name) AS poster_name, u.avatar, g.online_color,' . ($user_info['is_guest'] ? '1 AS is_read, 0 AS new_from' : '
(IFNULL(lb.id_msg, 0) >= b.id_msg_updated) AS is_read,
IFNULL(lb.id_msg, -1) + 1 AS new_from') . '
FROM {db_prefix}messages AS m
LEFT JOIN {db_prefix}boards AS b ON (m.id_board = b.id_board)
LEFT JOIN {db_prefix}members AS u ON (m.id_member = u.id_member)' . ($user_info['is_guest'] ? '' : '
LEFT JOIN {db_prefix}log_boards AS lb ON (lb.id_board = b.id_board AND lb.id_member = {int:current_member})') . '
LEFT JOIN {db_prefix}membergroups AS g ON (g.id_group = CASE WHEN u.id_group = 0 THEN u.id_post_group ELSE u.id_group END)
' . (!$user_info['is_guest'] ? '
LEFT JOIN {db_prefix}log_topics AS lt ON (lt.id_topic = m.id_topic AND lt.id_member = ' . $user_info['id'] . ')
LEFT JOIN {db_prefix}log_mark_read AS lmr ON (lmr.id_board = b.id_board AND lmr.id_member = ' . $user_info['id'] . ')' : '') . '
WHERE m.approved=1' . (empty($exclude_boards) ? '' : '
AND b.id_board NOT IN ({array_int:exclude_boards})') . ' AND {query_see_board}
ORDER BY m.id_msg DESC
LIMIT ' . $limit,
        array(
            'exclude_boards' => empty($exclude_boards) ? '' : $exclude_boards,
            'current_member' => $user_info['id'],
        )
    );
    $posts = array();
    while ($row_posts = $smcFunc['db_fetch_assoc']($posts_result)) {

        global $memberContext;
        loadMemberData($row_posts['id_member']);
        loadMemberContext($row_posts['id_member']);

        $posts[] = array(
            'id' => $row_posts['id_member'],
            'username' => '<a style="color: ' . $row_posts['online_color'] . ';" href="' . $scripturl . '?action=profile;u=' . $row_posts['id_member'] . '">' . $row_posts['poster_name'] . '</a>',
            'subject' => '<a style="font-weight: bold;" title="' . $txt['board'] . ':&nbsp;' . $row_posts['name'] . '" href="' . $scripturl . '?topic=' . $row_posts['id_topic'] . '.msg' . $row_posts['id_msg'] . ';topicseen#new">' . $row_posts['subject'] . '</a>',
            'body' => $row_posts['body'],
            'avatar' => $row_posts['avatar'] == '' ? $memberContext[$row_posts['id_member']]['avatar']['href'] : (stristr($row_posts['avatar'], 'http://') ? $row_posts['avatar'] : $modSettings['avatar_url'] . '/' . $row_posts['avatar']),
            'board' => $row_posts['name'],
            'time' => timeformat($row_posts['poster_time']),
            'new' => !empty($row_posts['is_read']),
            'subject_new' => $scripturl . '?topic=' . $row_posts['id_topic'] . '.msg' . $row_posts['id_msg'] . ';topicseen#new'
        );
    }
    $smcFunc['db_free_result']($posts_result);
}

//Finally the Output

//Scrolling xD
if ($scrolling == 1)
    echo '<div style="overflow: hidden;">
    <marquee height=' . $height . ' behavior="scroll" direction="up" scrollamount="' . $speed . '" onmouseover="this.stop()" onmouseout="this.start()">';

if ($scrollbar == 1)
    echo '<div style="height:' . $height . '; overflow-y: scroll; overflow-x: hidden;">';

foreach ($posts as $post) {

    // Lets fix the BBCode bug and Strip the Text
    $content1 = str_replace("[", "<", $post['body']);
    $content2 = str_replace("]", ">", $content1);
    $content3 = strip_tags($content2);
    $preview = substr($content3, 0, $number);
    echo '<table>
                <tr>
                    <td style="width: 40px;">
                        <img src="' . $post['avatar'] . '" alt="" width="40px" height="40px" />
                    </td>
                    <td>
                        ' . $post['subject'];

    if (!$post['new'] && $context['user']['is_logged'])
        echo '&nbsp;<a href="' . $post['subject_new'] . '" rel="nofollow" class="new_posts" style="margin:0px;">New</a>';
    echo '<br />
                        <small>' . $txt['by'] . '&nbsp;' . $post['username'] . '&nbsp;|&nbsp;' . $post['time'] . '</small>
                    </td>
                </tr>
                </table>';

    if ($htmlspecialcharacters) {
        echo htmlspecialchars($preview, ENT_NOQUOTES, "UTF-8") . '...';
    } else {
        echo $preview . '...';
    }

    echo '
                <hr />';
}

//Scrolling xD
if ($scrollbar == 1)
    echo '</div>';

if ($scrolling == 1)
    echo '</marquee>
</div>';
#3
Support / Re: Current Topics in an artic...
Last post by tino - February 11, 2024, 07:27:19 PM
Quote from: Arminus on February 11, 2024, 03:10:00 PM
Quote from: tino on February 11, 2024, 10:53:17 AMthe functions we supply were never intended to just be called.
I can see that, but that was suggested by rjen above and I figured that since we are calling this from within a TP Article, the context might be implicitly there - but I really don't have any understanding on how the bits and pieces play together there.

At any rate, seems that setting these 3 vars is sufficient:
$context['TPortal']['recentboxnum'] = 5;
$context['TPortal']['recentlength'] = 25;
$context['TPortal']['useavatar'] = 0;

So we're fine here for now.

That should work, but you might have unintended results if you have other blocks on the same page.

It was never built to be shown in an article box. The safer option is to copy the logic across and amend as needed.
#4
Support / Re: Current Topics in an artic...
Last post by @rjen - February 11, 2024, 03:32:33 PM
For the record: I did not suggest anything. OP asked where to find the code. That's what I answered
#5
Support / Re: Current Topics in an artic...
Last post by Arminus - February 11, 2024, 03:10:00 PM
Quote from: tino on February 11, 2024, 10:53:17 AMthe functions we supply were never intended to just be called.
I can see that, but that was suggested by rjen above and I figured that since we are calling this from within a TP Article, the context might be implicitly there - but I really don't have any understanding on how the bits and pieces play together there.

At any rate, seems that setting these 3 vars is sufficient:
$context['TPortal']['recentboxnum'] = 5;
$context['TPortal']['recentlength'] = 25;
$context['TPortal']['useavatar'] = 0;

So we're fine here for now.
#6
Support / Re: Current Topics in an artic...
Last post by tino - February 11, 2024, 10:53:17 AM
Did you initialise all the variables used inside that function? TinyPortal passes most of its information around in the $context['TPortal'] global. This is historic but quite embedded in the logic, the functions we supply were never intended to just be called. If you look in TPortal.php and TPBlocks.php you can see where they are initialised.
#7
Support / Re: Current Topics in an artic...
Last post by Arminus - February 11, 2024, 09:35:20 AM
Calling

TPortal_recentbox();
in a PHP article results in an error:

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 10
File: <base>/SSI.php
Line: 652

Using the recent article box as block renders without problems, so it's apparently not enough to just call the block's function from an article?

Looks like ssi_recentTopics is being called with some uninitialized vars here...?

If I call the PHP script in a devenv like so

require_once("C:/xampp/htdocs/SSI.php");

require_once("C:/xampp/htdocs/Themes/default/TPsubs.template.php");
require_once("C:/xampp/htdocs/Themes/default/languages/TPortal.german_informal.php");

TPortal_recentbox();

I get this


Notice: Undefined index: TPortal in C:\xampp\htdocs\Themes\default\TPsubs.template.php on line 669

Notice: Trying to access array offset on value of type null in C:\xampp\htdocs\Themes\default\TPsubs.template.php on line 669

Notice: Undefined index: TPortal in C:\xampp\htdocs\Themes\default\TPsubs.template.php on line 674

Notice: Trying to access array offset on value of type null in C:\xampp\htdocs\Themes\default\TPsubs.template.php on line 674

Notice: Undefined index: TPortal in C:\xampp\htdocs\Themes\default\TPsubs.template.php on line 694

Notice: Trying to access array offset on value of type null in C:\xampp\htdocs\Themes\default\TPsubs.template.php on line 694
#8
Support / Re: Current Topics in an artic...
Last post by @rjen - February 10, 2024, 11:48:23 AM
Quote from: rrolle on February 10, 2024, 09:04:01 AMThere is no code in the block itself, I only selected the "Current Topics" type at the time.
It would be enough for me if I knew in which file the code for "Current Topics" is located.

TPsubs.template.php

// blocktype 12: Recent Topics
function TPortal_recentbox()
{
global $scripturl, $context, $settings, $txt, $modSettings, $user_info;

// if no guest access to forum, then no recent topics
if(empty($modSettings['allow_guestAccess']) && $user_info['is_guest']) {
echo '' .$txt['tp-noguest_access'] .'';
return;
}
else {
// set variable
if(is_numeric($context['TPortal']['minmessagetopics']))
$context['min_message_topics'] = $context['TPortal']['minmessagetopics'];
else
$context['min_message_topics'] = 350;
// is it a number?
if(is_numeric($context['TPortal']['recentlength']))
$recentlength = $context['TPortal']['recentlength'];
else
$recentlength = '25';
// exclude boards
if (isset($context['TPortal']['recentboards']) && $context['TPortal']['boardmode'] == 0)
$exclude_boards = $context['TPortal']['recentboards'];
else {
// leave out the recycle board, if any
if(isset($modSettings['recycle_board']) && $modSettings['recycle_enable'] = 1 )
$bb = array($modSettings['recycle_board']);
$exclude_boards = $bb;
}

// include boards
if (isset($context['TPortal']['recentboards']) && !$context['TPortal']['boardmode'] == 0)
$include_boards = $context['TPortal']['recentboards'];
else
$include_boards = null;

$what = ssi_recentTopics($num_recent = $context['TPortal']['recentboxnum'] , $exclude_boards,  $include_boards, $output_method = 'array');
if($context['TPortal']['useavatar'] == 0)
{
// Output the topics
echo '
<ul class="tp_recenttopics" style="' , isset($context['TPortal']['recentboxscroll']) && $context['TPortal']['recentboxscroll'] == 1 ? 'overflow: auto; height: 20ex;' : '' , 'margin: 0; padding: 0;">';
$coun = 1;
foreach($what as $wi => $w)
{
$tpshortsubject = $w['subject'];
$w['readmore'] = '';
if(TPUtil::shortenString($tpshortsubject, $recentlength)) {
$w['readmore'] = '...';
}
echo '
<li' , $coun<count($what) ? '' : ' style="border: none; margin-bottom: 0;padding-bottom: 0;"'  , '>';
if ($w['is_new'])
echo '
<a href="' . $scripturl . '?topic=' . $w['topic'] . '.msg' . $w['new_from'] . ';topicseen#new" rel="nofollow" class="new_posts" style="margin:0px;">' . $txt['new'] . '</a> ';
echo '
<a href="' . $w['href'] . '" title="' . $w['subject'] . '">'. $tpshortsubject .''. $w['readmore'] .'</a>
', $txt['by'], ' <b>', $w['poster']['link'],'</b>
<br><span class="smalltext">['.$w['time'].']</span>
</li>';
$coun++;
}
echo '
</ul>';
}
else
{
$member_ids = array();
foreach($what as $wi => $w)
{
$member_ids[] = $w['poster']['id'];
}

if(!empty($member_ids))
$avatars = progetAvatars($member_ids);
else
$avatars = array();

// Output the topics
$coun = 1;
echo '
<ul class="tp_recenttopics" style="' , isset($context['TPortal']['recentboxscroll']) && $context['TPortal']['recentboxscroll']==1 ? 'overflow: auto; height: 20ex;' : '' , 'margin: 0; padding: 0;">';

foreach($what as $wi => $w)
{
$tpshortsubject = $w['subject'];
$w['readmore'] = '';
if(TPUtil::shortenString($tpshortsubject, $recentlength)) {
$w['readmore'] = '...';
}
echo '
<li' , $coun<count($what) ? '' : ' style="border: none; margin-bottom: 0;padding-bottom: 0;"'  , '>';
if ($w['is_new'])
echo '
<a href="' . $scripturl . '?topic=' . $w['topic'] . '.msg' . $w['new_from'] . ';topicseen#new" rel="nofollow" class="new_posts" style="margin:0px;">' . $txt['new'] . '</a> ';
echo '
<span class="tp_avatar"><a href="' . $scripturl. '?action=profile;u=' . $w['poster']['id'] . '">' , empty($avatars[$w['poster']['id']]) ? '<img class="avatar" src="' . $settings['tp_images_url'] . '/TPguest.png" alt="" />' : $avatars[$w['poster']['id']] , '</a></span><a href="'.$w['href'].'" title="' . $w['subject'] . '">'. $tpshortsubject .''. $w['readmore'] .'</a>
', $txt['by'], ' <b>', $w['poster']['link'],'</b>
<br><span class="smalltext">['.$w['time'].']</span>
</li>';
$coun++;
}
echo '
</ul>';
}
}
}
#9
Support / Re: Current Topics in an artic...
Last post by @rjen - February 10, 2024, 09:21:40 AM
I'll give you some details later today. On my phone now
#10
Support / Re: Current Topics in an artic...
Last post by rrolle - February 10, 2024, 09:04:01 AM
There is no code in the block itself, I only selected the "Current Topics" type at the time.
It would be enough for me if I knew in which file the code for "Current Topics" is located.