TinyPortal

Development => Support => Topic started by: rrolle on February 08, 2024, 02:49:00 PM

Title: Current Topics in an article
Post by: rrolle on February 08, 2024, 02:49:00 PM
I created a block containing the latest posts.
The type of block is "Current Topics".
I would like to present the latest contributions in an article. Is this possible?

SMF 2.1.4
PHP 8.2.15
TinyPortal
Title: Re: Current Topics in an article
Post by: @rjen on February 08, 2024, 03:46:25 PM
You can create a php article and put you block code in it...
Title: Re: Current Topics in an article
Post by: rrolle on February 08, 2024, 04:00:55 PM
Thanks. I don't know it well. RockLee, who previously helped me, is no longer available.
In which file can I find the code for the "Current Topics" type?
Title: Re: Current Topics in an article
Post by: @rjen on February 08, 2024, 05:49:24 PM
What?

You stated you have a block with code.

Please explain more clearly what you are trying to do? I am confused now
Title: Re: Current Topics in an article
Post by: rrolle on February 08, 2024, 09:01:55 PM
The code is not included in the block, but reference is made to the "Current Topics" block type. See Appendix.
The code is therefore not directly in the block, but in another place.
If I know where the code is, I can try to incorporate it into an article.

block.png
Title: Re: Current Topics in an article
Post by: rrolle on 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.
Title: Re: Current Topics in an article
Post by: @rjen on February 10, 2024, 09:21:40 AM
I'll give you some details later today. On my phone now
Title: Re: Current Topics in an article
Post by: @rjen on 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>';
}
}
}
Title: Re: Current Topics in an article
Post by: Arminus on 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
Title: Re: Current Topics in an article
Post by: tino on 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.
Title: Re: Current Topics in an article
Post by: 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.
Title: Re: Current Topics in an article
Post by: @rjen on 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
Title: Re: Current Topics in an article
Post by: tino on 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.