Как включить произвольное поле в список сервисов на 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>

I've tried replacing the following line:

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

но, к сожалению, это не работает.

Умный 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>

Я сделал это, потому что думал, что статус домена

{elseif $orderby == 'domainstatus'}

будет установлено значение false, если домен был пуст, и при добавлении домена для него будет установлено значение true, и будет отображаться настраиваемое поле, но оно не работает.

Я был бы очень признателен, если бы кто-нибудь помог мне.

С уважением.


person Community    schedule 05.11.2017    source источник


Ответы (1)


WHMCS не заполняет настраиваемые поля для служб на этой странице. В общем, вы можете проверить, что доступно для вас, используя умную функцию debug_print_var внутри tpl-файла:

{$service|@debug_print_var}

Теперь вам нужно позаботиться о заполнении настраиваемого поля, которое вы хотите. Это можно сделать с помощью крючков.

Хук ClientAreaPageProductsServices будет вызываться при посещении страницы clientareaproducts. , и он представляет все переменные шаблона как параметр функции $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
person wesamly    schedule 05.11.2017
comment
Здравствуйте, прежде всего, спасибо за ваш ответ. Я добавил код в раздел ловушек и заменил на {$customFields[$service.id]} внутри файла .tpl, но он не работает, он не показывает IP-адрес под названием продукта. Может быть, это как-то связано с тем, что эта строка {elseif $orderby == 'domainstatus'} отключена, если домен не настроен? - person ; 05.11.2017
comment
Постарайтесь не добавлять его внутрь if, добавьте его сразу после {$service.product}, просто чтобы убедиться, что он работает. - person wesamly; 06.11.2017