vb.org Archive

vb.org Archive (https://vborg.vbsupport.ru/index.php)
-   vB5 Programming Discussions (https://vborg.vbsupport.ru/forumdisplay.php?f=263)
-   -   Make array usable in template (https://vborg.vbsupport.ru/showthread.php?t=326943)

BulliM 12-05-2018 02:03 PM

Make array usable in template
 
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:

Code:

<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:
Code:

{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:

Code:

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) ?

shka 12-06-2018 09:30 AM

You have to register your variable for your template (or register global)

In vB4 you can
PHP Code:

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/...ethod_register

BulliM 12-06-2018 09:35 AM

Here: https://www.vbulletin.com/docs/html/..._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}

shka 12-06-2018 10:08 AM

Try {vb:debugvardump $arrayofuserids}

BulliM 12-06-2018 10:10 AM

Result: NULL

shka 12-06-2018 12:00 PM

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 Code:

<?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

Code:

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
PHP Code:

{vb:data userIdsarrgetArray}
{
vb:debugvardump $userIds


BulliM 12-06-2018 12:03 PM

I'll try that tomorrow. Thank you.

noypiscripter 12-07-2018 12:22 AM

Quote:

Originally Posted by BulliM (Post 2597678)
Here: https://www.vbulletin.com/docs/html/..._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 Code:

 <?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];
    }
}

HTML Code:

{vb:data userIds, testimportarray:arr, getArray}
{vb:debugvardump $userIds}

There is a working example-mod here: https://vbulletin.org/forum/showthre...light=skeleton

BulliM 12-07-2018 03:55 AM

Quote:

Originally Posted by shka (Post 2597682)
...

It works like a charm. Thank you shka! Thank to all!

--------------- Added [DATE]1544164891[/DATE] at [TIME]1544164891[/TIME] ---------------

One problem left. Why I cannot use that array in a condition?

Code:

{vb:data arrayofuserids, arr, getArray}
{vb:debugvardump $arrayofuserids}

Result:

HTML Code:

var_dump: $arrayofuserids

array(4) {
  [0]=>
  string(2) "1
"
  [1]=>
  string(4) "2
"
  [2]=>
  string(2) "3
"
  [3]=>
  string(1) "4"
}


But...

Code:

{vb:data arrayofuserids, arr, getArray}
<vb:if condition="in_array($conversation['userid'], $arrayofuserids)">...</vb:if>

...works not.

Solved. My solution:

PHP Code:

return "1,2,3,4"

Code:

{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.

shka 12-07-2018 05:06 AM

Von hinten durch die Brust :D

BulliM 12-07-2018 05:08 AM

Quote:

Originally Posted by shka (Post 2597693)
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.

PHP Code:

return array(1,2,3,4); 

liefert mir

HTML Code:

var_dump: $array

array(3) {
  [0]=>
  int(2)
  [1]=>
  int(3)
  [2]=>
  int(4)
}

und dann funktioniert es.

HTML Code:

<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

Quote:

Originally Posted by delicjous (Post 2597695)
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.

shka 12-07-2018 07:00 AM

I think the problem with his first try is - his strings are two chars (with \n ?)

He wrotes

PHP Code:

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

Quote:

Originally Posted by BulliM (Post 2597696)
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.


All times are GMT. The time now is 01:01 PM.

Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2025, vBulletin Solutions Inc.

X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.01353 seconds
  • Memory Usage 1,786KB
  • Queries Executed 10 (?)
More Information
Template Usage:
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (7)bbcode_code_printable
  • (4)bbcode_html_printable
  • (7)bbcode_php_printable
  • (5)bbcode_quote_printable
  • (1)footer
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (6)option
  • (1)post_thanks_navbar_search
  • (1)printthread
  • (18)printthreadbit
  • (1)spacer_close
  • (1)spacer_open 

Phrase Groups Available:
  • global
  • postbit
  • showthread
Included Files:
  • ./printthread.php
  • ./global.php
  • ./includes/init.php
  • ./includes/class_core.php
  • ./includes/config.php
  • ./includes/functions.php
  • ./includes/class_hook.php
  • ./includes/modsystem_functions.php
  • ./includes/class_bbcode_alt.php
  • ./includes/class_bbcode.php
  • ./includes/functions_bigthree.php 

Hooks Called:
  • init_startup
  • init_startup_session_setup_start
  • init_startup_session_setup_complete
  • cache_permissions
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • style_fetch
  • cache_templates
  • global_start
  • parse_templates
  • global_setup_complete
  • printthread_start
  • bbcode_fetch_tags
  • bbcode_create
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • printthread_post
  • printthread_complete