View Full Version : Make array usable in template
BulliM
12-05-2018, 02:03 PM
I need an array of userids in template "conversation_userinfo". This array is written in a html or php file.
HTML-File: 1,2,3,4....
PHP-File:echo array(1,2,3,4...);
It should be used like:
<vb:if condition="in_array($conversation['userid'], $arrayofuserids)">...</vb:if>
How can I get and set that array as $arrayofuserids in template "conversation_userinfo" ?
noypiscripter
12-05-2018, 07:40 PM
Try this:
{vb:set arrayofuserids, {vb:php array, 1, 2, 3, 4}}
BulliM
12-06-2018, 09:20 AM
Hey noypiscripter,
thanks, but this is not, what I ask for. I ask for an example, how to get the array from file into a variable in template. I set a hook:
ob_start();
include('path/arrayofuserids.php');
$arrayofuserids=ob_get_contents();
ob_end_clean();
Normally, I would expect variable $arrayofuserids is available in template, but is not. Don't know why. May I use the wrong hook (conversation_before_display_controls) ?
You have to register your variable for your template (or register global)
In vB4 you can
ob_start();
include('path/arrayofuserids.php');
$arrayofuserids=ob_get_contents();
ob_end_clean();
vB_Template::preRegister('templateUsingYourArray', array('arrayofuserids' => $arrayofuserids));
Is vB5 the same syntax?
http://vb5support.com/resources/api/vB5_Template.html#method_register
BulliM
12-06-2018, 09:35 AM
Here: https://www.vbulletin.com/docs/html/templates_externalfiles they say it is needed on 4+. Logic, 5>4.
I'll try.
EDIT: I get no result. Neither for {vb:raw $arrayofuserids} nor {vb:raw arrayofuserids}
Try {vb:debugvardump $arrayofuserids}
BulliM
12-06-2018, 10:10 AM
Result: NULL
Ok, my mistake. It seems that vB5 doesn't have a plugin/hook system like vB4. The hooks you see are template hooks, you need php hooks.
For my addons I use only api extensions
Simple example:
- create in /forum/core/packages a subdir /testimportarray/api
- create a file arr.php
<?php
if (!defined('VB_ENTRY')) {
die('Access denied.');
}
class TestImportArray_Api_Arr extends vB_Api_Extensions
{
public $product = 'testimportarray';
public $developer = 'testdev';
public $minver = '5.0.0';
public $maxver = '6.0.0 Alpha 1';
public $infourl = '';
public $checkurl = '';
public $AutoInstall = 1;
public $title = 'TestImportArray';
public $version = '1.0.0';
public $extensionOrder = 5;
public static function getArray($prevResult)
{
return [1,2,3,4];
}
}
The subdir name /testimportarray has to be the same as in class TestImportArray_Api_Arr and public $product = 'testimportarray';
The subsubdir name /api is repeated in class TestImportArray_Api_Arr
The filename arr.php has to be the same like in class TestImportArray_Api_Arr
Then check in AdminCP/Add-ons & Hooks/Api Extensions and PHP Hooks if your Api is listed without error
Add-on: testimportarray
TestImportArray (1.0.0) TestImportArray_Api_Arr Ja 5.0.0 6.0.0 Alpha 1 Ja 5
Then you can use the api function getArray in each template
{vb:data userIds, arr, getArray}
{vb:debugvardump $userIds}
BulliM
12-06-2018, 12:03 PM
I'll try that tomorrow. Thank you.
noypiscripter
12-07-2018, 12:22 AM
Here: https://www.vbulletin.com/docs/html/templates_externalfiles they say it is needed on 4+. Logic, 5>4.
vB4 mod system != vB5 mod system, so that isn't logically always true.
Anyway, follow what @shka suggested which is using API extensions. An alternative is to use frontend controller. Frontend controller functions are also accessible from the template. But using API extensions is cleaner and more elegant.
delicjous
12-07-2018, 03:40 AM
If you use a new API like ARR, make it your own API and don't extend it.
You could extend API like Page, Node, User... but why your own?!
<?php
if (!defined('VB_ENTRY')) {
die('Access denied.');
}
class TestImportArray_Api_Arr extends vB_Api
{
public static function getArray($prevResult)
{
return [1,2,3,4];
}
}
{vb:data userIds, testimportarray:arr, getArray}
{vb:debugvardump $userIds}
There is a working example-mod here: https://vbulletin.org/forum/showthread.php?t=323006&highlight=skeleton
BulliM
12-07-2018, 03:55 AM
...
It works like a charm. Thank you shka! Thank to all!
--------------- Added 1544164891 at 1544164891 ---------------
One problem left. Why I cannot use that array in a condition?
{vb:data arrayofuserids, arr, getArray}
{vb:debugvardump $arrayofuserids}
Result:
var_dump: $arrayofuserids
array(4) {
[0]=>
string(2) "1
"
[1]=>
string(4) "2
"
[2]=>
string(2) "3
"
[3]=>
string(1) "4"
}
But...
{vb:data arrayofuserids, arr, getArray}
<vb:if condition="in_array($conversation['userid'], $arrayofuserids)">...</vb:if>
...works not.
Solved. My solution:
return "1,2,3,4";
{vb:data arrayofuserids, arr, getArray}
{vb:set userIds, {vb:php explode, ',', {vb:raw arrayofuserids.0}}}
<vb:if condition="in_array($conversation['userid'], $userIds)">...</vb:if>
Works, but isn't quite elegant. If there is a better way, I would be interested in. I want that array of userids also global. No need, to load on every post.
Von hinten durch die Brust :D
BulliM
12-07-2018, 05:08 AM
Von hinten durch die Brust :D
Ja, voll. Die vB-Templates nerven ganz sch?n. Das dauert noch, bis ich das kann.
delicjous
12-07-2018, 06:53 AM
Dein Array-Inhalt sind strings. Du ben?tigst aber int.
return array(1,2,3,4);
liefert mir
var_dump: $array
array(3) {
[0]=>
int(2)
[1]=>
int(3)
[2]=>
int(4)
}
und dann funktioniert es.
<vb:if condition="in_array($user['userid'], $array)">
Yes
<vb:else />
No
</vb:if>
Deine Funktion sollte public function und nicht public static function sein.
BulliM
12-07-2018, 06:57 AM
Dein Array-Inhalt sind strings. Du ben?tigst aber int.
Die Vermutung hatte ich auch. Ich lade das Array aber aus einer Datei. Will nicht jedesmal neu aus der DB laden. Bei mir lautet die Zeile also return file('path/file'); wo vorher die userids untereinander standen und jetzt als eine Zeile, durch Kommas getrennt. Diesen ganzen Aufwand k?nnte ich mir sparen, wenn ich die Tabelle in der Foren-DB anlegen w?rde. Da ?berlege ich noch, weil ich Sicherheitsbedenken habe.
I think the problem with his first try is - his strings are two chars (with \n ?)
He wrotes
array(4) {
[0]=>
string(2) "1
"
[1]=>
string(4) "2
"
[2]=>
string(2) "3
"
[3]=>
string(1) "4"
}
String 0..2 are incorrect so in_array results false, only last strinf is of correct length string(1)
delicjous
12-07-2018, 07:35 AM
Die Vermutung hatte ich auch. Ich lade das Array aber aus einer Datei. Will nicht jedesmal neu aus der DB laden. Bei mir lautet die Zeile also return file('path/file'); wo vorher die userids untereinander standen und jetzt als eine Zeile, durch Kommas getrennt. Diesen ganzen Aufwand k?nnte ich mir sparen, wenn ich die Tabelle in der Foren-DB anlegen w?rde. Da ?berlege ich noch, weil ich Sicherheitsbedenken habe.
Naja, wenn die IDs aus einer Datei kommen werden diese wohl weniger oft gewechselt. Dann solltest Du die wie aufgezeigt ?ber eine API ziehen. Ich glaube nicht, das es sicherer ist die IDs in einer Datei zu "generieren" (woher auch immer) und diese Datei dann in die API einzubinden. Warum sollte ein Datenbankzugriff unsicher sein? Wenn dieser korrekt eingerichtet ist, sollte das definitiv die bessere L?sung sein.
vBulletin® v3.8.12 by vBS, Copyright ©2000-2025, vBulletin Solutions Inc.