PDA

View Full Version : Why won't this plugin work?


Mark.B
12-23-2010, 08:59 PM
This is me attempting to convert a "thread of the day" hack from 3.8.

I've read the article on variable registeringand have converted quite a few hacks, so I've *sort* of got my head round that.

However, the below (at search_start) simply doesn't work. the contents of the template are output fine, but the variable $devebd['whatever'] does not output at all.

I think I have done the registration of the variable right, because if I add this line to the plugin:

$devebd['test'] = ""Something";

...then I can make that print in the template just fine.

So, I think there is something wrong with how that query is being handled. I know it's being executed, because if I add a rogue character to any of the table names it throws a database error at me.

Yet, the query is identical to how it was in vB3 and it worked.

Any suggestions on what's wrong? Here is the plug in:
$exforums1 = $vbulletin->options['btwexfor'];
$exthreads1 = $vbulletin->options['btwexthr'];
if($vbulletin->options['enbwt'])
if($vbulletin->options['enbt'])
if($vbulletin->options['encolbt1'])
$devebds = $db->query_read("
SELECT thread.postusername,
thread.postuserid,
thread.title AS fth,
thread.lastposter,
thread.replycount,
thread.views,
thread.lastpostid,
thread.threadid,
thread.forumid tid,
forum.forumid AS fid,
forum.title AS ft
FROM " . TABLE_PREFIX . "thread AS thread, " . TABLE_PREFIX . "forum AS forum
WHERE forum.forumid = thread.forumid
AND dateline BETWEEN " . (TIMENOW - 86400) . " AND " . (TIMENOW + 86400) . "
AND thread.forumid NOT IN ($exforums1)
AND thread.threadid NOT IN ($exthreads1)
AND thread.threadid != 90094
AND thread.postuserid NOT IN (2501,2087)
ORDER BY thread.replycount DESC LIMIT 1
");

while ($devebd = $db->fetch_array($devebds))
{
$devebd['trimmed'] = fetch_trimmed_title($devebd['fth'], 43);

}

$templater = vB_Template::create('threadoftheday_day2');
$templater->register('devebd', $devebd);
$dev .= $templater->render();
$template_hook['totd'] .= $dev;
I then call this plugin in template search_resultlist using {vb:raw template_hook.totd}. It outputs the content of the template threadoftheday_day2 ok, but does not output the results of the query.

kh99
12-24-2010, 01:51 AM
I don't know much about vB4 and I usually stay in the vB3 section, but: I think the stuff at the bottom needs to be inside the while loop. I think the reason you never see anything in $devebd is because it's undefined when the loop finally exits.

Mark.B
12-24-2010, 05:42 AM
I don't know much about vB4 and I usually stay in the vB3 section, but: I think the stuff at the bottom needs to be inside the while loop. I think the reason you never see anything in $devebd is because it's undefined when the loop finally exits.
Thanks...yes I thought that too...(as that's where the old eval template call was in vB3) yet if I do so, the template doesn't output at all. Which also has me baffled.

kh99
12-24-2010, 11:30 AM
I see...yeah, that does sound like maybe the query isn't returning anything. Do you have a way to execute SQL? I would probably try that query myself and see what happens.

Mark.B
12-24-2010, 11:44 AM
I see...yeah, that does sound like maybe the query isn't returning anything. Do you have a way to execute SQL? I would probably try that query myself and see what happens.
Yep query returns ok but I think the "while" clause isn't returning anything, it seems to be linked to that in some way. Anything within the while clause is returning nothing, which I suppose means the while clause is false.

kh99
12-24-2010, 11:59 AM
Given that it has "LIMIT 1" in the query, I think I would have used query_first instead like

$devebd = $db->query_first("

(I know that was the original dev and not you),

and then I think the rest would just be

$devebd['trimmed'] = fetch_trimmed_title($devebd['fth'], 43);
$templater = vB_Template::create('threadoftheday_day2');
$templater->register('devebd', $devebd);
$template_hook['totd'] .= $templater->render();

without the "while". Or, if you wanted the entire template to disappear in the event that the query returned nothing you could enclose it all in an "if".

Anyway, I guess it's been kind of slow during the holidays, but there's got to be someone around who knows vB4.

Mark.B
12-24-2010, 03:24 PM
Thanks that does seem to be the issue...there is no "while" clause required as there's only 1 in the query.

Odd that should be the case seeing as it wasn't like that in vb3 and, to my knowledge, the database structures involved are identical.

Oh well...the joys of coding. :) Especially for vB4 which appears to write its own rules as it goes along.