whmcs显示每组的活跃产品

时间:2016-02-16 12:00:37

标签: php mysql whmcs

我正在尝试在whmcs中创建4个自定义页面,每个页面对应于每个产品组。第一页Web Hosting必须包含用户的所有活动Web托管包。我知道我必须自己设置变量,但我完全不理解

这将获得用户活动服务表中的第一个域。

$hostingProduct = Capsule::table('tblhosting')
      ->where('userid', '=', $ca->getUserID())->pluck('domain');

  $ca->assign('hostingProduct', $hostingProduct);

我现在要做的是获取对某个产品组有效的所有域名。在此表中没有简单的方法来确定产品组。 Howerver有packageid。 Packageid 1,2,3和4我可以用于此页面。我还需要此表中产品的ID。

如何为这些packageid和数组中的产品ID获取正确的域名?我想在.tpl文件中像这样调用它们

{foreach $hostingProduct}
    <div class="col-md-3">
        <a href="clientarea.php?action=productdetails&id={$productid}">{$domain}</a>
    </div>
{/foreach}

2 个答案:

答案 0 :(得分:1)

http://docs.whmcs.com/API:Get_Products上有文档 获取特定组中所有产品的外部API代码是:

public function getproducts($gid) {
    App::uses('Xml', 'Utility');
    $url = $this -> geturl();
    $credentials = $this -> getcredentials();
    $username = $credentials['username'];
    $password = $credentials['password'];

    $postfields["username"] = $username;
    $postfields["password"] = md5($password);
    $postfields["action"] = "getproducts";
    $postfields["gid"] = $gid; //gid is group id

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 100);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
    $data = curl_exec($ch);
    curl_close($ch);
    $array = Xml::toArray(Xml::build($data));
    return $array;
}

希望这有帮助

答案 1 :(得分:1)

感谢Luka Svalina提示:)

因为我需要WHMCS安装中的信息,所以我使用了内部API来解决这个问题。来自Luka Svaldina的代码可以运行,但是我可以更好地控制正在发生的事情和我检索的信息。

我所做的是使用内部API Get Client产品,如其文档中所述,此方法的唯一缺点是我无法为产品设置gid。

$command = "getclientsproducts";
$adminuser = "adminuser";
$values["clientid"] = $_SESSION['uid'];

$results = localAPI($command,$values,$adminuser);

$ca->assign('myVar', $results);

这将返回该用户的所有活动产品的数组。这不是我一直在寻找的,但它让我考虑使用它有利于我。 正如文档中所述,您可以使用pid检索该pid的所有活动产品。所以我为每个pid使用了getclients产品。

// webhosting product
// Basic Packages
$command = "getclientsproducts";
$adminuser = "adminuser";
$values["clientid"] = $_SESSION['uid'];
$values["pid"] = '19';

$results = localAPI($command,$values,$adminuser);

$ca->assign('basicVPS', $results);

// Standard Packages
$command = "getclientsproducts";
$adminuser = "adminuser";
$values["clientid"] = $_SESSION['uid'];
$values["pid"] = '20';

$results = localAPI($command,$values,$adminuser);

$ca->assign('standardVPS', $results);

// Pro Packages
$command = "getclientsproducts";
$adminuser = "adminuser";
$values["clientid"] = $_SESSION['uid'];
$values["pid"] = '21';

$results = localAPI($command,$values,$adminuser);

$ca->assign('proVPS', $results);

// Elite Packages
$command = "getclientsproducts";
$adminuser = "adminuser";
$values["clientid"] = $_SESSION['uid'];
$values["pid"] = '22';

$results = localAPI($command,$values,$adminuser);

$ca->assign('eliteVPS', $results);

这样我对该页面所需的每个产品都可以使用自己的智能变量。但同样不是我需要的,所以我使用array_merge_recursive将不同的数组合并为一个。

// webhosting product
// set API vars
$command = "getclientsproducts";
$adminuser = "adminuser";
$values["clientid"] = $_SESSION['uid'];

// pid
$values["pid"] = '2';
$results1 = localAPI($command,$values,$adminuser);
$values["pid"] = '5';
$results2 = localAPI($command,$values,$adminuser);
$values["pid"] = '7';
$results3 = localAPI($command,$values,$adminuser);
$values["pid"] = '1';
$results4 = localAPI($command,$values,$adminuser);

$results = array_merge_recursive($results1,$results2,$results3,$results4);

$ca->assign('webHosting', $results);

正是我所需要的。直到它让我想到了array_merge_recursive与布局和引导程序相结合的创造性使用。我创建了两个合并的数组,如下所示:

$a = array_merge_recursive($results1,$results3);
$b = array_merge_recursive($results2,$results4);

$ca->assign('webHosting_a', $a);
$ca->assign('webHosting_b', $b);

然后我使用foreach,odd和even来创建一个模块化的响应网格,其中包含该用户的所有活动产品。大致像这样:

    <div class="col-md-12">
        <div class="col-md-7>
        {foreach $webHosting_a.products.product as $product}
          {if $product@iteration is odd}
          <a href="/clientarea.php?action=productdetails&id={$product.id}">
          <div class="col-md-4">
            <div class="panel">
              <div class="panel-header">
                <h3><strong>{$product.domain}</strong></h3>
              </div>
              <div class="panel-content">
              {if $product.name eq 'Free'}
              <meter value="{$product.diskusage}" min=0 max="{$product.disklimit}" low=1 high=3>{$product.diskusage} of {$product.disklimit}</meter>
              {elseif $product.name eq 'Premium'}
                <meter value="{$product.diskusage}" min=0 max="{$product.disklimit}" low=1 high=3>{$product.diskusage} of {$product.disklimit}</meter>
              {elseif $product.name eq 'Professional'}
                <meter value="{$product.diskusage}" min=0 max="{$product.disklimit}" low=1 high=3>{$product.diskusage} of {$product.disklimit}</meter>
              {else}
                <meter value="{$product.diskusage}" min=0 max="{$product.disklimit}" low=1 high=3>{$product.diskusage} of {$product.disklimit}</meter>
              {/if}
              </div>
              <div class="panel-footer">
                <h3>{$product.name}</h3>
              </div>
            </div>
          </div>
          </a>
          {/if}
        {/foreach}
<div class="col-md-5">
        {foreach $webHosting_b.products.product as $product}
          {if $product@iteration is even}
          <a href="/clientarea.php?action=productdetails&id={$product.id}">
          <div class="col-md-4">
            <div class="panel">
              <div class="panel-header">
                <h3><strong>{$product.domain}</strong></h3>
              </div>
              <div class="panel-content">
              {if $product.name eq 'Free'}
              <meter value="{$product.diskusage}" min=0 max="{$product.disklimit}" low=1 high=3>{$product.diskusage} of {$product.disklimit}</meter>
              {elseif $product.name eq 'Premium'}
                <meter value="{$product.diskusage}" min=0 max="{$product.disklimit}" low=1 high=3>{$product.diskusage} of {$product.disklimit}</meter>
              {elseif $product.name eq 'Professional'}
                <meter value="{$product.diskusage}" min=0 max="{$product.disklimit}" low=1 high=3>{$product.diskusage} of {$product.disklimit}</meter>
              {else}
                <meter value="{$product.diskusage}" min=0 max="{$product.disklimit}" low=1 high=3>{$product.diskusage} of {$product.disklimit}</meter>
              {/if}
              </div>
              <div class="panel-footer">
                <h3>{$product.name}</h3>
              </div>
            </div>
          </div>
          </a>
          {/if}
        {/foreach}
        </div>
    </div>
</div>

当然,如果用户只有一种产品可以让它看起来都很好,那么一堆if语句:)

无论如何感谢小费卢卡!!