PDA

View Full Version : Accessing Database Value from a Template.


TransAmDan
10-26-2018, 08:19 AM
I want to access a database value from a VB template. The template is shown below. I have a new field in the 'attachment' table, called 'external_source' by default this will be zero, but if it is a 1, I want to produce different HTML code.

<li> <vb:if condition="$picture['hasthumbnail']">
<vb:if condition="$picture['external_source'] == 0">
<a href="album.php?{vb:raw session.sessionurl}albumid={vb:raw albuminfo.albumid}&amp;attachmentid={vb:raw picture.attachmentid}"><img src="http://www.solent-renegades.co.uk/attachment.php?{vb:raw session.sessionurl}attachmentid={vb:raw picture.attachmentid}&amp;thumb=1" alt="{vb:raw picture.caption}" title="{vb:raw picture.caption} from {vb:raw albuminfo.title}" border="0" {vb:raw picture.dimensions}/></a>
<table width="120" height="60"><tr><td>{vb:raw picture.caption} from {vb:raw albuminfo.title}</td></tr></table>
<vb:else />
--action if we have an external source.
</vb:if>

<vb:else />
<a class="picture" href="album.php?{vb:raw session.sessionurl}albumid={vb:raw albuminfo.albumid}&amp;attachmentid={vb:raw picture.attachmentid}"><vb:if condition="$picture['caption_preview']">{vb:raw picture.caption_preview}<vb:else />{vb:rawphrase picture}</vb:if></a>
</vb:if>
<vb:if condition="$show['moderation']"><span class="shade">{vb:rawphrase picture_moderated}</span></vb:if>
</li>


Looking inside album.php I have modified the call to the database to include this field too.
$pictures = $db->query_read("
SELECT
a.attachmentid, a.userid, a.caption, a.dateline, a.state, a.filename, a.external_source,
fd.filesize, IF(fd.thumbnail_filesize > 0, 1, 0) AS hasthumbnail, fd.thumbnail_dateline, fd.thumbnail_width, fd.thumbnail_height
$hook_query_fields
FROM " . TABLE_PREFIX . "attachment AS a
INNER JOIN " . TABLE_PREFIX . "filedata AS fd ON (fd.filedataid = a.filedataid)
$hook_query_joins
WHERE
a.contentid = $albuminfo[albumid]
AND
a.contenttypeid = " . intval($contenttypeid) . "
" . ((!can_moderate(0, 'canmoderatepictures') AND $albuminfo['userid'] != $vbulletin->userinfo['userid']) ? "AND a.state = 'visible'" : "") . "
$hook_query_where
ORDER BY a.dateline DESC
LIMIT $start, $perpage
");

So now $pictures contains the information from that database query.

Each individual pictures is fetched from
while ($picture = $db->fetch_array($pictures))

So in the template code I would expect pictures.external_source to contain the data from the database. Something isn't working right.

Is there some other process it goes through to pass data from album.php to the 'album_picturebit' template?

x iJailBreak x
10-29-2018, 11:18 AM
I want to access a database value from a VB template. The template is shown below. I have a new field in the 'attachment' table, called 'external_source' by default this will be zero, but if it is a 1, I want to produce different HTML code.

<li> <vb:if condition="$picture['hasthumbnail']">
<vb:if condition="$picture['external_source'] == 0">
<a href="album.php?{vb:raw session.sessionurl}albumid={vb:raw albuminfo.albumid}&amp;attachmentid={vb:raw picture.attachmentid}"><img src="http://www.solent-renegades.co.uk/attachment.php?{vb:raw session.sessionurl}attachmentid={vb:raw picture.attachmentid}&amp;thumb=1" alt="{vb:raw picture.caption}" title="{vb:raw picture.caption} from {vb:raw albuminfo.title}" border="0" {vb:raw picture.dimensions}/></a>
<table width="120" height="60"><tr><td>{vb:raw picture.caption} from {vb:raw albuminfo.title}</td></tr></table>
<vb:else />
--action if we have an external source.
</vb:if>

<vb:else />
<a class="picture" href="album.php?{vb:raw session.sessionurl}albumid={vb:raw albuminfo.albumid}&amp;attachmentid={vb:raw picture.attachmentid}"><vb:if condition="$picture['caption_preview']">{vb:raw picture.caption_preview}<vb:else />{vb:rawphrase picture}</vb:if></a>
</vb:if>
<vb:if condition="$show['moderation']"><span class="shade">{vb:rawphrase picture_moderated}</span></vb:if>
</li>


Looking inside album.php I have modified the call to the database to include this field too.
$pictures = $db->query_read("
SELECT
a.attachmentid, a.userid, a.caption, a.dateline, a.state, a.filename, a.external_source,
fd.filesize, IF(fd.thumbnail_filesize > 0, 1, 0) AS hasthumbnail, fd.thumbnail_dateline, fd.thumbnail_width, fd.thumbnail_height
$hook_query_fields
FROM " . TABLE_PREFIX . "attachment AS a
INNER JOIN " . TABLE_PREFIX . "filedata AS fd ON (fd.filedataid = a.filedataid)
$hook_query_joins
WHERE
a.contentid = $albuminfo[albumid]
AND
a.contenttypeid = " . intval($contenttypeid) . "
" . ((!can_moderate(0, 'canmoderatepictures') AND $albuminfo['userid'] != $vbulletin->userinfo['userid']) ? "AND a.state = 'visible'" : "") . "
$hook_query_where
ORDER BY a.dateline DESC
LIMIT $start, $perpage
");

So now $pictures contains the information from that database query.

Each individual pictures is fetched from
while ($picture = $db->fetch_array($pictures))

So in the template code I would expect pictures.external_source to contain the data from the database. Something isn't working right.

Is there some other process it goes through to pass data from album.php to the 'album_picturebit' template?

If you do var_dump($pictures), what is the output?

Also, as a rule of thumb, it's best not to modify the core files - you should be able to utilize $hook_query_fields with the nearest hook to avoid making core changes to the code. Making core changes to the vB codebase is inadvisable as it can make it more difficult to upgrade, and usually means after upgrading the same changes need to be carried out again.

TransAmDan
10-29-2018, 12:20 PM
Thanks for the response, much appreciated.

Where would i put the var_dump? in the Template? I have tried a few different formats, but either get an error or no output.

{vb:raw var_dump($pictures)}

{vb:var_dump($pictures)}

x iJailBreak x
11-02-2018, 09:01 PM
Thanks for the response, much appreciated.

Where would i put the var_dump? in the Template? I have tried a few different formats, but either get an error or no output.

{vb:raw var_dump($pictures)}

{vb:var_dump($pictures)}

Put it in album.php just after you run the query associated with $pictures.

Might also be worth putting exit after it too, so the var_dump is the only output.

$pictures = $db->query_read("
SELECT
a.attachmentid, a.userid, a.caption, a.dateline, a.state, a.filename, a.external_source,
fd.filesize, IF(fd.thumbnail_filesize > 0, 1, 0) AS hasthumbnail, fd.thumbnail_dateline, fd.thumbnail_width, fd.thumbnail_height
$hook_query_fields
FROM " . TABLE_PREFIX . "attachment AS a
INNER JOIN " . TABLE_PREFIX . "filedata AS fd ON (fd.filedataid = a.filedataid)
$hook_query_joins
WHERE
a.contentid = $albuminfo[albumid]
AND
a.contenttypeid = " . intval($contenttypeid) . "
" . ((!can_moderate(0, 'canmoderatepictures') AND $albuminfo['userid'] != $vbulletin->userinfo['userid']) ? "AND a.state = 'visible'" : "") . "
$hook_query_where
ORDER BY a.dateline DESC
LIMIT $start, $perpage
");

echo "<pre>";
var_dump($pictures);
echo "</pre>";
exit;

I assume you are testing this on a different environment than live?