如何在WHMCS的服务列表中包含自定义字段?

时间:2017-11-05 13:08:29

标签: php smarty whmcs

我正在使用WHMCS 7.x并且Smarty PHP已经启用。

我希望在产品名称下方的客户区产品(clientareaproducts.tpl)中显示一个已存在的自定义字段,并且其中填充了IP地址(该自定义字段的智能PHP代码为 {$ service_custom_fields.4} )而不是 $ service.domain

以下是 clientareaproducts.tpl 文件:

{include file="$template/includes/tablelist.tpl" tableName="ServicesList" filterColumn="3"}
<script type="text/javascript">
    {if $orderby == 'product'}
        table.order([0, '{$sort}'], [3, 'asc']);
    {elseif $orderby == 'amount' || $orderby == 'billingcycle'}
        table.order(1, '{$sort}');
    {elseif $orderby == 'nextduedate'}
        table.order(2, '{$sort}');
    {elseif $orderby == 'domainstatus'}
        table.order(3, '{$sort}');
    {/if}
    table.draw();
    jQuery('#tableLoading').addClass('hidden');
});
</script>
    <div class="table-container clearfix">
<table id="tableServicesList" class="table table-list hidden">
    <thead>
        <tr>
            <th>{$LANG.orderproduct}</th>
            <th>{$LANG.clientareaaddonpricing}</th>
            <th>{$LANG.clientareahostingnextduedate}</th>
            <th>{$LANG.clientareastatus}</th>
            <th class="responsive-edit-button" style="display: none;"></th>
        </tr>
    </thead>
    <tbody>
        {foreach key=num item=service from=$services}
            <tr onclick="clickableSafeRedirect(event, 'clientarea.php?action=productdetails&amp;id={$service.id}', false)">
                <td><strong>{$service.product}</strong>{if $service.domain}<br /><a href="http://{$service.domain}" target="_blank">{$service.domain}</a>{/if}</td>
                <td class="text-center" data-order="{$service.amountnum}">{$service.amount}<br />{$service.billingcycle}</td>
                <td class="text-center"><span class="hidden">{$service.normalisedNextDueDate}</span>{$service.nextduedate}</td>
                <td class="text-center"><span class="label status status-{$service.status|strtolower}">{$service.statustext}</span></td>
                <td class="responsive-edit-button" style="display: none;">
                    <a href="clientarea.php?action=productdetails&amp;id={$service.id}" class="btn btn-block btn-info">
                        {$LANG.manageproduct}
                    </a>
                </td>
            </tr>
        {/foreach}
    </tbody>
</table>
<div class="text-center" id="tableLoading">
    <p><i class="fa fa-spinner fa-spin"></i> {$LANG.loading}</p>
</div>

我尝试更换以下行:

 <td><strong>{$service.product}</strong>{if $service.domain}<br /><a href="http://{$service.domain}" target="_blank">{$service.domain}</a>{/if}</td>

 <td><strong>{$service.product}</strong>{if $service_custom_fields.4}<br /><a href="http://{$service_custom_fields.4}" target="_blank">{$service_custom_fields.4}</a>{/if}</td>

但不幸的是,它不起作用。

smarty php代码适用于电子邮件模板,但不适用于此。

我还尝试通过向产品中添加域来使用以下行,但它也没有显示自定义字段。

 <td><strong>{$service.product}</strong>{if $service.domain}<br /><a href="http://{$service_custom_fields.4}" target="_blank">{$service_custom_fields.4}</a>{/if}</td>

我这样做是因为我认为 domainstatus

{elseif $orderby == 'domainstatus'}
如果域为空,

将被设置为false,并且通过添加域,它将被设置为true,并且它将显示自定义字段,但它不起作用。

如果有人能帮助我,我真的很感激。

问候。

1 个答案:

答案 0 :(得分:0)

WHMCS不会填充此页面中服务的自定义字段。 通常,您可以使用tpl文件中的smarty函数debug_print_var来检查可用的内容:

{$service|@debug_print_var}

现在,您需要注意填充所需的自定义字段。这可以使用钩子来完成。

访问clientareaproducts页面时将调用钩子ClientAreaPageProductsServices,并将所有模板变量显示为函数参数$vars

我们将遍历$vars['services']并从Db查询自定义字段值,并将它们作为可在tpl文件中使用的单独变量传递:

1-创建文件:includes/hooks/service_customfields.php并将以下代码添加到其中:

<?php
use WHMCS\Database\Capsule as DB;
if (!defined("WHMCS")) {
    die("This file cannot be accessed directly");
}

add_hook('ClientAreaPageProductsServices', 1, function($vars) {

    $fieldId = 4; //Custom field id
    if (isset($vars['services'])) {
        $csVals = [];
        foreach ($vars['services'] as $service) {

            $fieldVal = '';
            $data = DB::table('tblcustomfieldsvalues AS t1')
            ->leftJoin('tblcustomfields AS t2', 't1.fieldid', '=', 't2.id')
            ->select('t1.value')
            ->where('t2.id', $fieldId)->where('t2.type', 'product')->where('t1.relid', $service['id'])
            ->first();
            if (!is_null($data)) {
                $fieldVal = $data->value;
            }
            $csVals[$service['id']] = $fieldVal;

        }

        return ['customFields' => $csVals];
    }
});

2-在clientareaproducts.tpl中使用{$customFields[$service.id]}输出自定义字段值。

注意:代码使用此SQL查询自定义字段值:

SELECT *
FROM tblcustomfieldsvalues AS t1
LEFT JOIN tblcustomfields AS t2 ON t1.fieldid = t2.id
WHERE t2.id = 2 #Field id
AND t2.type = 'product' 
AND t1.relid = 9 #service id