2017-11-05 5 views
0

私はWHMCS 7.xを使用していますが、Smarty PHPはすでに有効になっています。WHMCSのサービスリストにカスタムフィールドを含めるにはどうすればよいですか?

私は、製品の名前の下にある製品(clientareaproducts.tpl)の下に、すでに存在し、IPアドレス(カスタムフィールドのスマートなPHPコードは{ $ service_custom_fields.4})の代わりに$ service.domainを入力します。

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

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

:私は次の行を交換しようとした

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

:以下

clientareaproducts.tplファイルです

しかし、不運にも、動作しません。

スマートな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> 

私は私が考えたので、ドメインが空だったとドメインを追加することによって、それはその後、trueにsettedされるだろうし、それが希望の場合

{elseif $orderby == 'domainstatus'} 

domainstatus をfalseにsettedされるだろうということでしたカスタムフィールドを表示しますが、動作しません。

誰かが私を助けてくれたら本当に感謝しています。

よろしくお願いいたします。

答えて

0

WHMCSは、このページのサービスのカスタムフィールドに値を設定しません。 一般では、TPLファイル内のSmartyの機能debug_print_varを使用して、あなたのために利用可能であるかどうか確認することができます。

{$service|@debug_print_var} 

は今、あなたがしたいカスタムフィールドを埋めるの世話をする必要があります。これはフックを使用して行うことができます。

フックClientAreaPageProductsServicesは、clientareaproductsページを訪れたときに呼び出され、すべてのテンプレート変数を関数パラメータ$varsとして表示します。

私たちは、DBから$vars['services']とクエリカスタムフィールドの値をループに行くとあなたが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 
+0

こんにちは、すべての最初の、ご返信いただきありがとうございます。フックセクションにコードを追加し、.tplファイル内の '{$ customFields [$ service.id]} 'に置き換えましたが、動作しません。製品名の下にIPアドレスが表示されません。おそらく、ドメインが設定されていないと、この行と関係があります。{elseif $ orderby == 'domainstatus'} 'は無効になっていますか? –

+0

{$ service.product}の直後に追加する場合は、今のところ追加しないようにしてください。動作していることを確認してください。 – wesamly

関連する問題