我正在使用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&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&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,并且它将显示自定义字段,但它不起作用。
如果有人能帮助我,我真的很感激。
问候。
答案 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