【问题标题】:How to include a custom field in the services list on WHMCS?如何在 WHMCS 的服务列表中包含自定义字段?
【发布时间】:2017-11-05 13:08:29
【问题描述】:

我正在使用 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,并显示自定义字段,但不起作用。

如果有人可以帮助我,我将不胜感激。

问候。

【问题讨论】:

    标签: php smarty whmcs


    【解决方案1】:

    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
    

    【讨论】:

    • 您好,首先感谢您的回复。我已将代码添加到 hooks 部分并在 .tpl 文件中替换为{$customFields[$service.id]},但它不起作用,它没有在产品名称下方显示 IP 地址。如果没有配置域,也许它与这条线 {elseif $orderby == 'domainstatus'} 被禁用有关?
    • 尽量不要在 if 中添加,暂时在 {$service.product} 之后添加,只是为了确保它正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    相关资源
    最近更新 更多