Jump to content

WHMCS v7: explore domain TLDs


Hal9000

Recommended Posts

Hi there!

Just upgraded to WHMCS v7, went through the release notes, adapted everything etc... looking good.

One thing though, maybe I haven't figured it out: the new domain checker, which is now integrated in the cart (btw maybe you should specify in the docs that only the standard cart supports it), is pretty good. However, I am missing an essential feature, which is exploring the available TLDs we have on offer. I don't see a way to display a list, categorized like in the last WHMCS version. If it's not there anymore, I will have to implement it myself...

Link to comment
Share on other sites

I just coded my own pricelist, it is not 100% what it was before, because I also adapted it to my needs as I was at it, but it should work fine for most I guess...

 

domainpricelist.php

<?php

use Illuminate\Database\Capsule\Manager as DB;

define("CLIENTAREA", true);

require("init.php");

$ca = new WHMCS_ClientArea();

$ca->setPageTitle($whmcs->get_lang('domainspricing'));

$ca->addToBreadCrumb('index.php', $whmcs->get_lang('globalsystemname'));
$ca->addToBreadCrumb('domainpricelist.php', $whmcs->get_lang('domainspricing'));

$ca->initPage();

$currencyid = $whmcs->get_req_var('currency');
if (!$currencyid) {
   $currencyid = $whmcs->get_req_var('currencyid');
}
if (!is_numeric($currencyid)) {
   $currency = array();
} else {
   $currency = getCurrency('', $currencyid);
}

if (!$currency || !is_array($currency) || !isset($currency['id'])) {
   $currency = getCurrency();
}
$currencyid = $currency['id'];

$categories = array();
$tldcategories = DB::table('tbltld_category_pivot as p')
   ->join('tbltld_categories as c', 'c.id', '=', 'p.category_id')
   ->join('tbltlds as t', 't.id', '=', 'p.tld_id')
   ->join('tbldomainpricing as d', DB::raw("binary d.extension"), '=', DB::raw("binary CONCAT('.', t.tld)"))
   ->orderBy('c.is_primary', 'desc')
   ->orderBy('c.display_order', 'asc')
   ->orderBy('t.tld', 'asc')
   ->select(['c.id', 'c.category', 't.tld'])
   ->get();
foreach ($tldcategories as $category) {
   if (!isset($categories[$category->id])) {
       $cat = new stdClass();
       $cat->id = $category->id;
       $cat->category = $category->category;
       $cat->topLevelDomains = array();
       $categories[$category->id] = $cat;
   }
   $categories[$category->id]->topLevelDomains[] = $category->tld;
}

$tldpricelist = DB::table('tbldomainpricing as d')
   ->join('tblpricing as p', 'p.relid', '=', 'd.id')
   ->where('p.currency', '=', $currencyid)
   ->whereIn('p.type', ['domainregister', 'domaintransfer', 'domainrenew'])
   ->orderBy('d.order')
   ->select(['d.extension as tld', 'd.group',
       DB::raw("SUM(IF(type='domainregister', msetupfee, NULL)) AS register"),
       DB::raw("SUM(IF(type='domaintransfer', msetupfee, NULL)) AS transfer"),
       DB::raw("SUM(IF(type='domainrenew', msetupfee, NULL)) AS renew")])
   ->groupBy('d.extension')
   ->get();

$tldpricing = array();
foreach ($tldpricelist as $tld) {
   $tldpricing[substr($tld->tld, 1)] = $tld;
}

$ca->setTemplate('domainpricelist');
$ca->assign('tldcategories', $categories);
$ca->assign('tldpricing', $tldpricing);
$ca->assign('tldpricelist', $tldpricelist);
$ca->assign('currency', $currency);

$ca->output();

 

domainpricelist.tpl

{if !$loggedin && $currencies}
   <div class="currencychooser pull-right clearfix margin-bottom">
       <div class="btn-group" role="group">
           {foreach from=$currencies item=curr}
               <a href="domainpricelist.php?currency={$curr.id}" class="btn btn-default{if $currency.id eq $curr.id} active{/if}">
                   <img src="{$BASE_PATH_IMG}/flags/{if $curr.code eq "AUD"}au{elseif $curr.code eq "CAD"}ca{elseif $curr.code eq "EUR"}eu{elseif $curr.code eq "GBP"}gb{elseif $curr.code eq "INR"}in{elseif $curr.code eq "JPY"}jp{elseif $curr.code eq "USD"}us{elseif $curr.code eq "ZAR"}za{elseif $curr.code eq "CHF"}ch{else}na{/if}.png" border="0" alt="" />
                   {$curr.code}
               </a>
           {/foreach}
       </div>
   </div>
   <div class="clearfix"></div>
{/if}

<div id="pricingTable">

   <div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true">
       {foreach $tldcategories as $tldCategory}
           <div class="panel panel-default">
               <div class="panel-heading" role="tab" id="heading{$tldCategory->id}">
                   <h4 class="panel-title">
                       <a data-toggle="collapse" data-parent="#accordion" href="#collapse{$tldCategory->id}" aria-expanded="{if $tldCategory@first}true{else}false{/if}" aria-controls="collapse{$tldCategory->id}" class="domain-tld-pricing-category">
                           {$tldCategory->category} {$LANG.tldpricing}
                       </a>
                   </h4>
               </div>
               <div id="collapse{$tldCategory->id}" class="panel-collapse collapse{if $tldCategory@first} in{/if}" role="tabpanel" aria-labelledby="heading{$tldCategory->id}">
                   <div class="panel-body">
                       <div class="row">
                           <div class="col-md-10 col-md-offset-1 col-lg-8 col-lg-offset-2 table-responsive domain-tld-pricing-table-responsive">
                               <table class="table table-striped table-framed">
                                   <thead>
                                       <tr>
                                           <th class="text-center">{$LANG.domaintld}</th>
                                           {*<th class="text-center">{$LANG.domainminyears}</th>*}
                                           <th class="text-center">{$LANG.domainsregister}</th>
                                           <th class="text-center">{$LANG.domainstransfer}</th>
                                           <th class="text-center">{$LANG.domainsrenew}</th>
                                       </tr>
                                   </thead>
                                   <tbody>
                                       {foreach $tldCategory->topLevelDomains as $tld}
                                           <tr>
                                               <td>.{$tld}</td>
                                               {*<td class="text-center">{$tldpricing.{$tld->tld}.period}</td>*}
                                               <td class="text-center">{if $tldpricing[$tld]->register}{$currency.prefix} {$tldpricing[$tld]->register} {$currency.suffix}{else}{$LANG.domainregnotavailable}{/if}</td>
                                               <td class="text-center">{if $tldpricing[$tld]->transfer}{$currency.prefix} {$tldpricing[$tld]->transfer} {$currency.suffix}{else}{$LANG.domainregnotavailable}{/if}</td>
                                               <td class="text-center">{if $tldpricing[$tld]->renew}{$currency.prefix} {$tldpricing[$tld]->renew} {$currency.suffix}{else}{$LANG.domainregnotavailable}{/if}</td>
                                           </tr>
                                       {/foreach}
                                   </tbody>
                               </table>
                           </div>
                       </div>
                   </div>
               </div>
           </div>
       {/foreach}
       <div class="panel panel-default">
           <div class="panel-heading" role="tab" id="heading{$tldCategory->id}">
               <h4 class="panel-title">
                   <a data-toggle="collapse" data-parent="#accordion" href="#collapseAll" aria-expanded="false" aria-controls="collapseAll" class="domain-tld-pricing-category">
                       {$LANG.alltldpricing}
                   </a>
               </h4>
           </div>
           <div id="collapseAll" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingAll">
               <div class="panel-body">
                   <div class="row">
                       <div class="col-md-10 col-md-offset-1 col-lg-8 col-lg-offset-2 table-responsive domain-tld-pricing-table-responsive">
                           <table class="table table-striped table-framed">
                               <thead>
                                   <tr>
                                       <th class="text-center">{$LANG.domaintld}</th>
                                       {*<th class="text-center">{$LANG.domainminyears}</th>*}
                                       <th class="text-center">{$LANG.domainsregister}</th>
                                       <th class="text-center">{$LANG.domainstransfer}</th>
                                       <th class="text-center">{$LANG.domainsrenew}</th>
                                   </tr>
                               </thead>
                               <tbody>
                                   {foreach $tldpricelist as $tld}
                                       <tr>
                                           <td>{$tld->tld}</td>
                                           {*<td class="text-center">{$tld->period}</td>*}
                                           <td class="text-center">{if $tld->register}{$currency.prefix} {$tld->register} {$currency.suffix}{else}{$LANG.domainregnotavailable}{/if}</td>
                                           <td class="text-center">{if $tld->transfer}{$currency.prefix} {$tld->transfer} {$currency.suffix}{else}{$LANG.domainregnotavailable}{/if}</td>
                                           <td class="text-center">{if $tld->renew}{$currency.prefix} {$tld->renew} {$currency.suffix}{else}{$LANG.domainregnotavailable}{/if}</td>
                                       </tr>
                                   {/foreach}
                               </tbody>
                           </table>
                       </div>
                   </div>
               </div>
           </div>
       </div>
   </div>

</div>

{if !$loggedin && $currencies}
   <div class="currencychooser pull-right clearfix margin-bottom">
       <div class="btn-group" role="group">
           {foreach from=$currencies item=curr}
               <a href="domainpricelist.php?currency={$curr.id}" class="btn btn-default{if $currency.id eq $curr.id} active{/if}">
                   <img src="{$BASE_PATH_IMG}/flags/{if $curr.code eq "AUD"}au{elseif $curr.code eq "CAD"}ca{elseif $curr.code eq "EUR"}eu{elseif $curr.code eq "GBP"}gb{elseif $curr.code eq "INR"}in{elseif $curr.code eq "JPY"}jp{elseif $curr.code eq "USD"}us{elseif $curr.code eq "ZAR"}za{elseif $curr.code eq "CHF"}ch{else}na{/if}.png" border="0" alt="" />
                   {$curr.code}
               </a>
           {/foreach}
       </div>
   </div>
   <div class="clearfix"></div>
{/if}

<script src="templates/{$template}/js/domainchecker.js"></script>

 

Then I modified domainregister.tpl in standard_cart to open the pricelist in a pop up

           <p>{$LANG.orderForm.findNewDomain}</p>
           <a class="btn btn-primary" onclick="popupWindow('domainpricelist.php', 'emailWin', '650', '650')">
               {lang key='orderForm.showPricelist'}
           </a>

Link to comment
Share on other sites

  • 2 months later...

Thanking you for your solution and code.

But I have a problem presented to me when viewing the pricelist

This is due to that .au domains are a min registration period of 2 years periods.

The table only displays 1 year prices

 

All domains, that end in .au are showing a price of $-1.00AUD

TLD Register Transfer Renew

.com.au $ -1.00 AUD $ -1.00 AUD $ -1.00 AUD

.net.au $ -1.00 AUD $ -1.00 AUD $ -1.00 AUD

.org.au $ -1.00 AUD $ -1.00 AUD $ -1.00 AUD

.id.au $ -1.00 AUD $ -1.00 AUD $ -1.00 AUD

.asn.au $ -1.00 AUD $ -1.00 AUD $ -1.00 AUD

 

all other domains display pricing correctly.

Can you assist in displaying the correct prices for .au domains

Edited by crescent
Link to comment
Share on other sites

Yeah, I was just a bit lazy I guess... I have now improved the code to also handle 2 years. I could have done for more, but the SQL query would have become pretty ugly, and I am not aware of any domains requiring more than 2 years minimum, so...

Anyhoo, here is the updated select statement for the pricelist query:

   ->select(['d.extension as tld',
       'd.group',
       DB::raw("IF(p.msetupfee='-1', 2, 1) AS period"),
       DB::raw("SUM(IF(p.type='domainregister', IF(p.msetupfee='-1', p.qsetupfee, p.msetupfee), NULL)) AS register"),
       DB::raw("SUM(IF(p.type='domaintransfer', IF(p.msetupfee='-1', p.qsetupfee, p.msetupfee), NULL)) AS transfer"),
       DB::raw("SUM(IF(p.type='domainrenew', IF(p.msetupfee='-1', p.qsetupfee, p.msetupfee), NULL)) AS renew")])

Here is the updated template file

{if !$loggedin && $currencies}
   <div class="currencychooser pull-right clearfix margin-bottom">
       <div class="btn-group" role="group">
           {foreach from=$currencies item=curr}
               <a href="domainpricelist.php?currency={$curr.id}" class="btn btn-default{if $currency.id eq $curr.id} active{/if}">
                   <img src="{$BASE_PATH_IMG}/flags/{if $curr.code eq "AUD"}au{elseif $curr.code eq "CAD"}ca{elseif $curr.code eq "EUR"}eu{elseif $curr.code eq "GBP"}gb{elseif $curr.code eq "INR"}in{elseif $curr.code eq "JPY"}jp{elseif $curr.code eq "USD"}us{elseif $curr.code eq "ZAR"}za{elseif $curr.code eq "CHF"}ch{else}na{/if}.png" border="0" alt="" />
                   {$curr.code}
               </a>
           {/foreach}
       </div>
   </div>
   <div class="clearfix"></div>
{/if}

<div id="pricingTable">

   <div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true">
       {foreach $tldcategories as $tldCategory}
           <div class="panel panel-default">
               <div class="panel-heading" role="tab" id="heading{$tldCategory->id}">
                   <h4 class="panel-title">
                       <a data-toggle="collapse" data-parent="#accordion" href="#collapse{$tldCategory->id}" aria-expanded="{if $tldCategory@first}true{else}false{/if}" aria-controls="collapse{$tldCategory->id}" class="domain-tld-pricing-category">
                           {$tldCategory->category} {$LANG.tldpricing}
                       </a>
                   </h4>
               </div>
               <div id="collapse{$tldCategory->id}" class="panel-collapse collapse{if $tldCategory@first} in{/if}" role="tabpanel" aria-labelledby="heading{$tldCategory->id}">
                   <div class="panel-body">
                       <div class="row">
                           <div class="col-md-10 col-md-offset-1 col-lg-8 col-lg-offset-2 table-responsive domain-tld-pricing-table-responsive">
                               <table class="table table-striped table-framed">
                                   <thead>
                                       <tr>
                                           <th class="text-center">{$LANG.domaintld}</th>
                                           <th class="text-center">{$LANG.domainminyears}</th>
                                           <th class="text-center">{$LANG.domainsregister}</th>
                                           <th class="text-center">{$LANG.domainstransfer}</th>
                                           <th class="text-center">{$LANG.domainsrenew}</th>
                                       </tr>
                                   </thead>
                                   <tbody>
                                       {foreach $tldCategory->topLevelDomains as $tld}
                                           <tr>
                                               <td>.{$tld}
                                                   {if $tldpricing[$tld]->group eq 'new'}<span class="label label-success">{$LANG.domainCheckerSalesGroup.new}</span>
                                                   {elseif $tldpricing[$tld]->group eq 'sale'}<span class="label label-warning">{$LANG.domainCheckerSalesGroup.sale}</span>
                                                   {elseif $tldpricing[$tld]->group eq 'hot'}<span class="label label-danger">{$LANG.domainCheckerSalesGroup.hot}</span>{/if}
                                               </td>
                                               <td class="text-center">{$tldpricing[$tld]->period}</td>
                                               <td class="text-center">{if $tldpricing[$tld]->register}{$currency.prefix} {$tldpricing[$tld]->register} {$currency.suffix}{else}{$LANG.domainregnotavailable}{/if}</td>
                                               <td class="text-center">{if $tldpricing[$tld]->transfer}{$currency.prefix} {$tldpricing[$tld]->transfer} {$currency.suffix}{else}{$LANG.domainregnotavailable}{/if}</td>
                                               <td class="text-center">{if $tldpricing[$tld]->renew}{$currency.prefix} {$tldpricing[$tld]->renew} {$currency.suffix}{else}{$LANG.domainregnotavailable}{/if}</td>
                                           </tr>
                                       {/foreach}
                                   </tbody>
                               </table>
                           </div>
                       </div>
                   </div>
               </div>
           </div>
       {/foreach}
       <div class="panel panel-default">
           <div class="panel-heading" role="tab" id="heading{$tldCategory->id}">
               <h4 class="panel-title">
                   <a data-toggle="collapse" data-parent="#accordion" href="#collapseAll" aria-expanded="false" aria-controls="collapseAll" class="domain-tld-pricing-category">
                       {$LANG.alltldpricing}
                   </a>
               </h4>
           </div>
           <div id="collapseAll" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingAll">
               <div class="panel-body">
                   <div class="row">
                       <div class="col-md-10 col-md-offset-1 col-lg-8 col-lg-offset-2 table-responsive domain-tld-pricing-table-responsive">
                           <table class="table table-striped table-framed">
                               <thead>
                                   <tr>
                                       <th class="text-center">{$LANG.domaintld}</th>
                                       <th class="text-center">{$LANG.domainminyears}</th>
                                       <th class="text-center">{$LANG.domainsregister}</th>
                                       <th class="text-center">{$LANG.domainstransfer}</th>
                                       <th class="text-center">{$LANG.domainsrenew}</th>
                                   </tr>
                               </thead>
                               <tbody>
                                   {foreach $tldpricelist as $tld}
                                       <tr>
                                           <td>{$tld->tld}
                                               {if $tld->group eq 'new'}<span class="label label-success">{$LANG.domainCheckerSalesGroup.new}</span>
                                               {elseif $tld->group eq 'sale'}<span class="label label-warning">{$LANG.domainCheckerSalesGroup.sale}</span>
                                               {elseif $tld->group eq 'hot'}<span class="label label-danger">{$LANG.domainCheckerSalesGroup.hot}</span>{/if}
                                           </td>
                                           <td class="text-center">{$tld->period}</td>
                                           <td class="text-center">{if $tld->register}{$currency.prefix} {$tld->register} {$currency.suffix}{else}{$LANG.domainregnotavailable}{/if}</td>
                                           <td class="text-center">{if $tld->transfer}{$currency.prefix} {$tld->transfer} {$currency.suffix}{else}{$LANG.domainregnotavailable}{/if}</td>
                                           <td class="text-center">{if $tld->renew}{$currency.prefix} {$tld->renew} {$currency.suffix}{else}{$LANG.domainregnotavailable}{/if}</td>
                                       </tr>
                                   {/foreach}
                               </tbody>
                           </table>
                       </div>
                   </div>
               </div>
           </div>
       </div>
   </div>

</div>

{if !$loggedin && $currencies}
   <div class="currencychooser pull-right clearfix margin-bottom">
       <div class="btn-group" role="group">
           {foreach from=$currencies item=curr}
               <a href="domainpricelist.php?currency={$curr.id}" class="btn btn-default{if $currency.id eq $curr.id} active{/if}">
                   <img src="{$BASE_PATH_IMG}/flags/{if $curr.code eq "AUD"}au{elseif $curr.code eq "CAD"}ca{elseif $curr.code eq "EUR"}eu{elseif $curr.code eq "GBP"}gb{elseif $curr.code eq "INR"}in{elseif $curr.code eq "JPY"}jp{elseif $curr.code eq "USD"}us{elseif $curr.code eq "ZAR"}za{elseif $curr.code eq "CHF"}ch{else}na{/if}.png" border="0" alt="" />
                   {$curr.code}
               </a>
           {/foreach}
       </div>
   </div>
   <div class="clearfix"></div>
{/if}

<script src="templates/{$template}/js/domainchecker.js"></script>

Edited by Hal9000
Link to comment
Share on other sites

  • 3 weeks later...

Hi Hal9000, Thanks for the code, but can't det the results to show. Could you please clarify the file structure for your two files?

 

I can't get the results displayed on the tpl file. At the moment it's just showing the table and header with now actual data.

 

as in: root/domainpricelist.php or template/domainpricelist.php or orderforms/template/domainpricelist.php

 

for both files, Thanks!

PS also noticed that v7'Six' no longer contains domainchecker.js called in the end of your tpl file.

Link to comment
Share on other sites

Hi pietpomop, the domainpricelist.php file should reside in your whmcs root, the domainpricelist.tpl in your template/<templatename>/ directory, and the other snippet should go into domainregister.tpl in the standard_cart, or whatever cart you are using.

You are right about the domainchecker.js, you can remove that line as it's not needed. Weirdly though, the six template files domainchecker.tpl and bulkdomainchecker.tpl still contain references to this file.

Edited by Hal9000
Link to comment
Share on other sites

Has anyone been able to pull this price table into another page, besides domainpricelist.php?

 

Can't figure out what to add to, say template/header.tpl in order to get the pricelist. The table html is not the issue, it's trying to get the php logic going of domainpricelist.php within other template files.

 

The button and pop-up id great for some cases, but I need to pricelist as part of several other tpl pages.

Link to comment
Share on other sites

Has anyone been able to pull this price table into another page, besides domainpricelist.php?

you can add a non-categorised version of the v6 table, to any page (including outside of WHMCS), using the data feed (+ template tweak) in the thread below...

 

https://forum.whmcs.com/showthread.php?122790-After-upgrading-to-v7-domain-suggessions-have-gone&p=498618#post498618

 

Can't figure out what to add to, say template/header.tpl in order to get the pricelist. The table html is not the issue, it's trying to get the php logic going of domainpricelist.php within other template files.

you couldn't really do it in the template (well technically you could, but you shouldn't!) - you'd need to write a hook to query the database to create the Smarty variables that the pricelist table uses.

 

one weekend, i'll go back and write v2 of that data feed which will use TLD categories, or write a hook to make the variables available to the page - but i'm not a big fan of the TLD categories (at least how WHMCS did it), so we don't use them. :idea:

Link to comment
Share on other sites

  • 2 weeks later...

Nice result with this domainpricelist.php, but there's an issue:

if you use multiple price slabs for domains, the price exposed will be the sum of prices in various slabs.

 

That's to say:

- price in base slab: 10

- price in second slab: 8

- price exposed: 18

(I suppose that if you have three or more slabs, it will sum all of them).

 

I suppose will bw needed to add a filter in the query, in order to select only the base slab (for public), or a more complex query for other slabs...

Link to comment
Share on other sites

  • 2 weeks later...

I fixed the issue (at least for default slab)

 

In domainpricelist.php it's necessary modify following code:

 

$tldpricelist = DB::table('tbldomainpricing as d')

->join('tblpricing as p', 'p.relid', '=', 'd.id')

->where('p.currency', '=', $currencyid)

->whereIn('p.type', ['domainregister', 'domaintransfer', 'domainrenew'] )

->orderBy('d.order')

->select(['d.extension as tld', 'd.group',

DB::raw("SUM(IF(type='domainregister', msetupfee, NULL)) AS register"),

DB::raw("SUM(IF(type='domaintransfer', msetupfee, NULL)) AS transfer"),

DB::raw("SUM(IF(type='domainrenew', msetupfee, NULL)) AS renew")])

->groupBy('d.extension')

->get();

 

 

as follows:

 

$tldpricelist = DB::table('tbldomainpricing as d')

->join('tblpricing as p', 'p.relid', '=', 'd.id')

->where('p.currency', '=', $currencyid)

->where('p.tsetupfee', '=', 0 )

->whereIn('p.type', ['domainregister', 'domaintransfer', 'domainrenew'] )

->orderBy('d.order')

->select(['d.extension as tld', 'd.group',

DB::raw("SUM(IF(type='domainregister', msetupfee, NULL)) AS register"),

DB::raw("SUM(IF(type='domaintransfer', msetupfee, NULL)) AS transfer"),

DB::raw("SUM(IF(type='domainrenew', msetupfee, NULL)) AS renew")])

->groupBy('d.extension')

->get();

 

So this query select all prices for default slab (id = 0)

 

I was looking for a way to select for a logged customer the pricelist of his slab (if different from default), but it's not trivial: it may happen that not all the domains have different price, and when it's so the record does not exist; so, you need to get:

- all the TLDs which have a record defined for that slab

- and, for all others TLDs which don't have a record defined for that slab, the record of the default slab...

 

If anyone get any idea to do it... (Laravel is not my friend... :D )

Link to comment
Share on other sites

I'm also surprised they removed this. Yes, you could make a manual page listing your domains for sell but that seems like a management nightmare with the amount of new domains that exist today, imagining having to change/remove or update TLD's or pricing. So the logic tells you that this information should be dynamic or pulled directly from WHMCS.

 

Why they removed the pricing page or at least a template where someone can see the available domains for sell is beyond me. This is like not letting someone check which products or plans you are selling. The user has no idea what domain he wants in the first place so he has to guess which extensions you are selling or not selling.

 

Personally while v7 has some nice changes, and the new domain search is better, in a global perspective its an downgrade if you are selling domains. Maybe they will add the code later on, but they should not release a new feature by removing tons of old features. That is not an upgrade but a downgrade. An upgrade is when you keep adding new features on top of the old ones and if the old ones are bad, you re-code from scratch again in order to give the same functionality or better to customers.

 

From v5 to v6 they removed things, from v6 to v7 they removed more. I completely understand they are removing old code, but they are making WHMCS inferior. I completely understand that most people have to use their own theme, code, and designs. I agree, but they should always ship at least 1 default theme and 1 default cart, and that one should have at least basic functionality a new customer would expect. If they want to change or add more advanced things, so be it, but relying on hacking code around to add things back is a bad business approach, in particular as WHMCS increased the pricing you would expect more, not less. Support is down the pipe as well. Usually you received a reply 2 - 6 hours. Now its 24 hours or more to receive one reply.

 

This is a positive critic, I like WHMCS but I hope they don't rush new releases the next time. I'm far more happy with smaller releases that add things and fix bugs, than having a major one which is a pain in the butt to upgrade as they move all files and code around and remove and adds more new bugs. Its like playing hide and seek all the time, when you finally have things working, a new version comes up and back to the same.

 

- - - Updated - - -

 

who knows why WHMCS does anything? I gave up expecting joined-up thinking from them long ago.

 

I suppose potentially it might have sped up the page by removing the table, but i'm assuming there were more reasons than that.

 

I agree that should probably not be in the same page for performance reasons but why not add it to a separate template file then where users can link to it if they want, or use it in a modal windows, or what ever...

 

I also don't think they did that for performance reasons. If performance was a concern they would not move basic things to hooks like the sidebar or breadcrumb and other very basic things they removed from the template files and added as hook which means it has to be processed and re-generated on every single hit !!! That is not what I call performance wise. Hooks are to pull out things on a dynamic views by certain user actions, they should not be using that for basic HTML links and buttons or a basic navigation breadcrumb. They probably did this because they want to show different buttons or options depending on the user actions. Fine! But why is it encoded them? You can't modify the code, links or even icons, unless you create your own hooks, so a hook modifying a hook...

Link to comment
Share on other sites

If performance was a concern they would not move basic things to hooks like the sidebar or breadcrumb and other very basic things they removed from the template files and added as hook which means it has to be processed and re-generated on every single hit !!! That is not what I call performance wise. Hooks are to pull out things on a dynamic views by certain user actions, they should not be using that for basic HTML links and buttons or a basic navigation breadcrumb.

not to drag the thread off-topic, but the two big issues with the navbar/sidebar is the bizarre thinking that WHMCS believed their users should be capable of writing hooks just to change the navigation - they should either have delayed the launch until they'd developed a menu manager feature (now available as 3rd-party addons), or made the documentation absolutely idiot-proof... the fact they did neither is telling, though sadly, not surprising.

 

the rest of your post, and the one in the TLDs thread, I largely agree with.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use & Guidelines and understand your posts will initially be pre-moderated