Working with smarty template engine for WHMCS. Need to use php function from external php file in .tpl file

1.2k views Asked by At

Trying to fetch output in A.tpl but not getting any output. I think i'm doing something wrong to call php function in tpl file.

A.tpl

{myModifier}

B.php

class Geolocation{
    public function sm_loc($params, Smarty_Internal_Template $template)
    {
        return "100.70";
    }
}

$smarty1 = new Smarty();

$smarty1->registerPlugin('modifier', 'myModifier', array('Geolocation', 'sm_loc'));

I 've already used this code. And this doesn't seem to work. It also breaks my existing working code in A.tpl post this use.

My Need here is to get output from the php function in A.tpl from an external php file.

Thanks in Advance. Sorry for being noob.

1

There are 1 answers

0
brendonofficial On

To add this modifier to Smarty and use it in your template, you're best to use a WHMCS hook.

If you create a new PHP file under the '~/includes/hooks/' directory (you can name it anything - in this case, let's use 'myhook.php'), WHMCS will automatically inject this hook on each request.

For this, you're going to want to use the ClientAreaPage hook. Inside your hook, you can then access the global $smarty variable.

Example:

function MySmartyModifierHook(array $vars) {
    global $smarty;

    // I recommend putting your Geolocation class in a separate PHP file,
    // and using 'include()' here instead.
    class Geolocation{
        public function sm_loc($params, Smarty_Internal_Template $template) {
            return "100.70";
        }
    }

    // Register the Smarty plugin
    $smarty->registerPlugin('modifier', 'myModifier', array('Geolocation', 'sm_loc'));
}

// Assign the hook
add_hook('ClientAreaPage', 1, 'MySmartyModifierHook');

That should do the trick. If you want to explore with other hooks, you can take a look at the Hook Index in the WHMCS documentation.

The function names in each of your hook files must be unique.

As a side note, if you're only wanting to run this hook on specific pages, you can check the templatefile key in the passed $vars array. For example, say you only wanted this hook to run on the 'View Cart' page on the order form:

function MySmartyModifierHook(array $vars) {
    global $smarty;

    // If the current template is not 'viewcart', then return
    if ($vars['templatefile'] != 'viewcart')
        return;

    // ... your code here ...
}

Also, note that with hooks like the 'ClientAreaPage' hook, returning an array of keys and values will automatically add them as Smarty variables. So if your hook function ended with return ['currentTime' => time()];, you could then use {$currentTime} in your Smarty template to output its value.