我正在尝试在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}
答案 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语句:)
无论如何感谢小费卢卡!!