Jump to content


Popular Content

Showing content with the highest reputation since 05/30/19 in all areas

  1. 5 points
    WHMCS was one of the companies which take average 6 - 8 hours to respond to our support requests. Even if the answer requires canned responses. But recently since this month precisely, WHMCS support staffs impress me by sending their responses in less than five minutes. Read me, the last response I received from WHMCS staff about is just after one minute of my post. 👏 👏 👏 To all of their efforts.
  2. 4 points
    $38.14 + 18% = $45 if the tax is inclusive, then the price already contains the tax... so if the price were $118, the tax would be $18 and the subtotal $100 https://docs.whmcs.com/Tax/VAT#Inclusive.2FExclusive_Tax Tax Amount = ( Item Price / ( 100 + Tax Rate ) ) x Tax Rate Tax Amount = ( 45 / ( 100 + 18 ) ) x 18 = 6.86
  3. 3 points
    Hi Mohamed, <?php function admin_custom_css_hook($vars) { $currenttemplate = $vars['template']; if ($currenttemplate == "blend" ) { $head_return = ''; $head_return = '<link href="templates/blend/css/admin-dark.css" rel="stylesheet" type="text/css" /> <script type="text/javascript"> $(document).ready(function() { $(\'.header .logo img\').attr(\'src\', \'templates/blend/images/logo-dark.gif\'); }) </script>'; return $head_return; } } add_hook("AdminAreaHeadOutput",1,"admin_custom_css_hook"); there was two bugs in the original hook - first, it was changing the logos on the marketconnect pages with your logo(!)... i've fixed that by being more accurate with the logo .css reference in the hook. the second bug is when you look at admin pages that appear to be in a subdirectory (due to Friendly URL settings), e.g the setup pages for notifications, security settings etc, the logo is broken - that's purely down to the path to the image being wrong... I suspect that would be fixed by either expanding the hook for those conditions or referencing the replacement image with a full URL rather than a relative path.
  4. 3 points
    then you take @baymax's query and change the where statement... UPDATE tblclients SET groupid='new-group-ID' WHERE email LIKE '%@hotmail.com';
  5. 3 points
    maybe this query if all 60 clients are in the same group currently. UPDATE tblclients SET groupid='new-group-ID' WHERE groupid='current-group-ID'; Replace the parts in green.
  6. 3 points
    You can try this hook: https://github.com/Jetserver/WHMCS-Reply-Above-This-Line
  7. 3 points
    Some people want to show their client's credit balance when they login to client area, as the option not implemented by default in Six Template here is how to do it: 1) Upload the PHP file from Attachements to -> /WHMCS-Path/includes/hooks/ directory. WHMCS_SixTemplateCreditBalance.zip
  8. 3 points
    then you wouldn't use this hook, you would instead use ClientAreaProductDetailsOutput hook and specify what output occurs with specific service(s). <?php add_hook('ClientAreaProductDetailsOutput', 1, function($service) { $serviceID = $service['service']->Id; if ($serviceID == '600') { $output .= '<div class="alert alert-success" role="alert"><div class="row"><div class="col-sm-1"><i class="fab fa-whmcs fa-3x"></i></div><div class="col-sm-11">Welcome to WHMCS!<br><small>buy the addon!</small></div></div></div>'; } if ($output) { return $output; } }); it's worth noting that the location of this specific hook output is determined by the Smarty template and not the hook itself - if you were displaying MarketConnect banners on that page, it would display below them. if you have an unpaid/overdue invoice, then there is a default alert shown at the top of the page... ... but that output is specified in the template itself and only triggered if/when hardcoded conditions are passed to the template. if you wanted to output your alert elsewhere on the page, you would be looking at either editing the template to define exactly where the output should be (you could still trigger it, and specify it's content, with a hook), or using another output hook, containing JS to specify the exact location of the output (though can be difficult depending on where you want to output).
  9. 3 points
    Pretty simple to treat it like a typical config file in a lot of software. custom.css.txt (with a note to rename it)
  10. 3 points
    I was just about to suggest the same thing. 🙂
  11. 3 points
    One thing to note is that WHMCS will redirect from contact.php to submitticket.php (your specific department) if you select a ticket department under WHMCS admin > setup > general settings > mail > Presales Form Destination
  12. 3 points
    don't be shy - i'm volunteering you (and your coding colleagues) for a week or two in Houston - all expenses paid by WHMCS. ✈️
  13. 3 points
    if there is no functionality or automation needed, then i'd still stick with using the Email Registrar idea - but remember that this registrar module code isn't encrypted and therefore can be duplicated and modified. 😉 to duplicate the registrar, all you should need to do is... copy the "email" folder in /modules/registrars - for the sake of argument, paste the duplicated folder and call it "brian" - still in /modules/registrars/ go into the duplicate folder, e.g brian, and rename email.php to brian.php - for consistency keep the folder and filenames the same (and just one word). edit the brian.php file and replace occurrences of "email_" with "brian_" (there should be 6)... these functions need to be unique, so if email registrar is active, and this duplicate is active, you will get errors - so you have to rename the functions. edit the Friendly name line of code to differentiate this from the default email registrar... "FriendlyName" => array("Type" => "System", "Value"=>"Email Notifications (Brian Registrar 1)"), ... so you know which registrar this is to be used with... optionally change the logo. repeat as necessary for other registrars. on the Domain Registrars page, you will now have 2 different email registrars... and in a client's domain profile, it will be available as an option... in your case, what I would probably suggest is that you don't use the original Email Registrar module if you are going to rename it (e.g give it the name of a registrar) because a WHMCS update would probably overwrite any changes that you make to the module - so just use the duplicates that you make and the updater shouldn't touch them.
  14. 3 points
    you might want to share what the solution was in case others read this thread in the future.
  15. 3 points
    I've expanded this hook a bit to also cover failed transfers and log everything it does to the activity log. <?php use WHMCS\Database\Capsule; add_hook('DomainTransferCompleted', 1, function($vars) { //This hook will complete to-do items for transfers when the transfer is completed. $toDoID = Capsule::table('tbltodolist') ->where('status', 'In Progress') ->where('title', 'Domain Pending Transfer') ->where('description', 'LIKE', '% ' . $vars['domain'] . '%') ->get(); //Loop through the ID's and set them as completed. foreach ($toDoID as $entry) { $command = 'UpdateToDoItem'; $postData = array( 'itemid' => $entry->id, 'adminid' => '1', //Update this ID to an admin ID 'status' => 'Completed', ); localAPI($command, $postData); logActivity('Clean-up To-do List: ID ' . $entry->id . ' has been set as complete as the transfer completed successfully - Domain ID: ' . $vars['domainid'] . ' - Domain: ' . $vars['domain']); } }); add_hook('DomainTransferFailed', 1, function($vars) { //This hook will update to-do items for ttransfer that fails. $toDoID = Capsule::table('tbltodolist') ->where('status', 'In Progress') ->where('title', 'Domain Pending Transfer') ->where('description', 'LIKE', '% ' . $vars['domain'] . '%') ->get(); foreach ($toDoID as $entry) { $description = Capsule::table('tbltodolist') ->where('id', $entry->id) ->value('description'); $command = 'UpdateToDoItem'; $postData = array( 'itemid' => $entry->id, 'adminid' => '1', //Update this ID to an admin ID 'status' => 'Incomplete', 'description' => '*FAILED* '.$description, ); localAPI($command, $postData); logActivity('Clean-up To-do List: ID ' . $entry->id . ' has been set as incomplete as the transfer has failed - Domain ID: ' . $vars['domainid'] . ' - Domain: ' . $vars['domain']); } });
  16. 3 points
    Hi all, We are planning a 7.8.3 maintenance update by the end of the month. Included, amongst the usual maintenance fixes, will be the few outstanding issues with the new Stripe Elements module and Pay Methods feature. We are potentially also looking to include module updates for gateway(s) who have published 3DSecureV2 implementation docs in the past few days.
  17. 3 points
    you could try the following hook, which redirects users who are not logged in from viewcart to checkout... <?php # ViewCart For Clients Only Hook # Written by brian! function viewcart_for_clients_only_hook($vars) { $client = Menu::context('client'); if (!$client && $vars['templatefile'] === 'viewcart' && $vars['checkout'] !== true) { header("Location: cart.php?a=checkout"); exit; } } add_hook("ClientAreaPageCart", 1, "viewcart_for_clients_only_hook"); logged in users, e.g clients, will still able to go to viewcart as normal.
  18. 3 points
    Hi, As I said many times, there's no need to use WordPress, Joomla, Drupal or any other CMS that comes to mind. It takes weeks to get a decent integration and keeping it functional is a never ending process with lot of cons that I'm not going to list now. On the other hand it takes few weeks more to expand WHMCS to the point that you no longer need to use any external software. It took me years and tens of integrations to realize this concept 😅 but now I'm fine since I no longer need to put so much efforts in such a silly activity. There's no question that your page can be integrated in WHMCS and personally I wouldn't consider any other alternative. Using WHMCS in example.com rather than client.example.com makes absolutely no difference. Not to mention that getting rid of WordPress lets you to save time and money for a number of reasons. In conclusion using WordPress and WHMCS feels like using the abacus - that's my personal opinion.
  19. 3 points
    Like I said multiple times on this community (I'm boring 😟), first off make sure that WP and WHMCS stay on two separate hosting packages for security reasons. Why? Long story short if someone cracks your WP also your WHMCS is compromised. The problem is that WP is intrinsically less secure for a number of reasons (very popular among people and lamers, huge number of third party components available...). I'd like to underline another aspect but first let me say that I'm not trying to promote anything or change your idea. I'm just sharing with you my experience with WHMCS. I dislike a lot the use of Wordpress, Drupal or any other CMS to overcome the lacks of WHMCS. In the short run using WP looks a great idea but let's focus on the big-picture this for a second. Having two systems to handle the same website could be a frustrating experience. The idea of having to focus on two separate admin interface doesn't look promising. It's already hard to keep an eye on WHMCS, all servers you have (cP, Plesk, DA...), registrars. With WP we're adding another variable to equation. That's distracting You'll find yourself repeating the same operations on WHMCS and WP so that they always look the same or similar year after year. For example you'll have to produce two "versions" of your template. One that works for WHMCS and the other for WP As if keeping secure and updated WHMCS with all modules, addons and servers wasn't enough, now you also need to take care of WP In conclusion installing WP for sure is the fastest way to get what you need. You just need to work on it for X weeks, install Y and Z and cross your fingers hoping that an update of WHMCS or WP doesn't force you to spend hours to fix something that no longer works as expected. I had to deal things like WP + WHMCS for years and this combo made me waste countless number of hours. Personally I decided to follow another path. Instead of installing another CMS to "complete" WHMCS and waste time and patience in the long run, I added all the missing pieces to WHMCS since it has tons of hooks and API to work with. Take what I just said with a grain of salt. This was just my opinion. Using WP doesn't hurt anyone 🙂
  20. 3 points
    Today we announced that WHMCS is joining the WebPros family. Following in the footsteps of Plesk and cPanel, WHMCS becomes the latest company to join WebPros exciting and growing group of companies that power the web hosting industry. Established in 2005 by CEO Matt Pugh, WHMCS is the leading web hosting billing and automation platform. WHMCS was started with the idea that selling web hosting could be made better for consumers and more efficient through automation. By combining customer management, billing and support tools into a single package, coupled with easy extensibility, today we help over 40,000 businesses scale and succeed in today’s competitive web hosting market. In 2012, WHMCS partnered with cPanel to enable us to work more closely and deliver a better experience to our many mutual customers. Today's announcement and news means we'll be able to work even more closely with cPanel, as well as our good friends at Plesk and SolusVM, giving us the opportunity to enhance the integration between all our products to create a more seamless and integrated experience for everyone. "I am looking forward to working with the teams at WebPros to deliver better software and user experiences to both our direct customers and the customers of our customers" said Matt Pugh, CEO of WHMCS. "I also want to take this opportunity to thank each and every one of our customers for putting your trust in us over the last 15 years and bringing us to where we are today." "For us, it’s business as usual.", said Matt. "The same team remains in place, and we will continue to deliver the same high-quality product and experience you've come to expect. We have always strived to provide the most powerful, feature rich and reliable platform for you to operate your business from, and this commitment remains as strong as ever." Based in the UK and with offices in Houston TX, WHMCS employs a team of 28 people and powers over 40,000 businesses with a combined end user base of over 75 million customers in more than 140 countries. I've created this thread for user discussion of the announcement. We will be be monitoring and answering any questions we can.
  21. 3 points
    Let's stop trying, every solution is a bad hack that tampers with parameters. It gives at best a false sense of security that makes you more prone to errors when it fails. If it's not removed in the next version I will seriously consider moving away from the platform.
  22. 3 points
    Very sad day for hosting companies.. We trusted cPanel for years and now they didnt even think about us.. just a massive increase and survive if you could.
  23. 3 points
    I ran into an issue with this hook today - it works fine on a product linked to cPanel, but with other products it shows a blank page. with the assistance of sentq, I was able to tweak it to work correctly. <?php use WHMCS\View\Menu\Item as MenuItem; add_hook('ClientAreaPrimarySidebar', 1, function(MenuItem $primarySidebar) { $service = Menu::context('service'); $domain = $service->domain; $servertype = $service->product->servertype; # Not cPanel, no links added if ($servertype!="cpanel"){ return; } if (!is_null($primarySidebar->getChild('Service Details Actions'))) { $primarySidebar->getChild('Service Details Actions') ->getChild('Login to cPanel') ->setUri('http://'.$domain.'/cpanel'); $primarySidebar->getChild('Service Details Actions') ->getChild('Login to Webmail') ->setUri('http://'.$domain.'/webmail'); } });
  24. 2 points
    instead of modifying header.tpl, I would have been tempted to use a hook because as far as I can tell, there are only two changes in the template... adding a link to the custom dark css file. the changing of the WHMCS logo. so the first you can inject with an adminareaheadoutput hook without any issue; the second is a pain because the logo url is hardcoded in the template... one option would be to just replace the default whmcs logo.gif file... yes, you'll have to replace it after each update - but theoretically you're going to have to check the css still works after every update too - especially a major update. the other two quick alternatives would be to just remove the logo using CSS (you already know which company you're working for - so unless you are logging into multiple different installs, then you don't need the WHMCS logo)... or you use JS to change the image on the fly (that would work, but you might see the default logo first and then the replacement logo loading afterwards). <?php function admin_dark_blend_css_hook($vars) { $currenttemplate = $vars['template']; if ($currenttemplate == "blend" ) { $head_return = ''; $head_return = '<link href="templates/blend/css/admin-dark.css" rel="stylesheet" type="text/css" /> <style>.logo {display: none;}</style>'; return $head_return; } } add_hook("AdminAreaHeadOutput",1,"admin_dark_blend_css_hook"); that way, if you need to disable the dark blend theme, you can just disable/remove the hook and it will default back to using "normal" blend. 🙂
  25. 2 points
    I wouldn't class that as writing your own custom theme - that's just cosmetic changes to an existing theme. not mine, I don't support WGS products - that's what you pay him for! 🙂
  26. 2 points
    not quickly - permanently making "voted" false effectively disables the bootstrap alert from ever appearing, and allows users to vote on multiple articles... I did see yesterday if I could quickly do both (show alert only after voting AND allow multiple votes), but there wasn't an obvious quick solution - the emphasis here being on quick! ☺️ if you want to edit the knowledgebasearticle.tpl, you can modify the buttons to show a alert popup on voting... <button type="submit" name="vote" value="yes" class="btn btn-lg btn-link" onclick="window.alert('{$LANG.knowledgebaseArticleRatingThanks}');"><i class="far fa-thumbs-up"></i> {$LANG.knowledgebaseyes}</button> <button type="submit" name="vote" value="no" class="btn btn-lg btn-link" onclick="window.alert('{$LANG.knowledgebaseArticleRatingThanks}');"><i class="far fa-thumbs-down"></i> {$LANG.knowledgebaseno}</button> looks a little ugly, but when they click ok, their vote will be registered.
  27. 2 points
    I simply can't comprehend why WHMCS doesn't do this automatically. Dealing with multiple transfers each day, the To Do list becomes cluttered really fast. The following hook will execute on 'DomainTransferCompleted', look for Pending Domain Transfers that are In Progress containing the domain name and set all of them to Completed (in case there are multiple entries). <?php use WHMCS\Database\Capsule; add_hook('DomainTransferCompleted', 1, function($vars) { //This hook will complete to do items for transfers when the transfer is completed. $toDoID = Capsule::table('tbltodolist') ->where('status', 'In Progress') ->where('title', 'Domain Pending Transfer') ->where('description', 'LIKE', '% ' . $vars["domain"] . ' %') ->get(); //Loop through the ID's and set them as completed. foreach ($toDoID as $entry) { $command = 'UpdateToDoItem'; $postData = array( 'itemid' => $entry->id, 'adminid' => '1', 'status' => 'Completed', ); $results = localAPI($command, $postData); print_r($results); } }); Place the file in /includes/hooks/. UpdateToDo.php
  28. 2 points
    it would get more attention, but I doubt moving FR into here would be a great panacea... submit a feature request on the opening day of the Olympics, and hope that it will be completed before the next opening day in 4 (or now 5) years time - welcome to WHMCS feature requests. i'm not sure that I would find 2 years acceptable to wait, so 4+ is just laughable. at least it's not been archived! when I read the original request from @ramf... my first thought (untested) might be to solve it by having 2 mailboxes, let's call them support@domain and support1@domain... support emails from clients are sent to support@, but you add a filter in place to send a copy of the incoming email to support1 and it's support1 that WHMCS uses for importing etc (and email from anywhere other than support@ is rejected)... that will leave an existing copy of the (possibly) HTML email in support@ for you to view should you need to - you'll have to delete these emails at some point when they are no longer needed. to use an English expression, it's admittedly a lot of faffing around, but it would likely take minutes to setup as opposed to waiting years for WHMCS to do something about this. from a practical point of view, if WHMCS was importing the email and storing it twice (once stripped for ticket import and the other untouched), then that's going to lead to an increased database size... for something like this, there are no easy solutions - especially with the way WHMCS is currently configured to handle email importing.
  29. 2 points
    Getting the feeling I'm the only one seeing my posts here. 😉
  30. 2 points
    If you need any help sorting that out @gei, please let me know - I've done that for two large hosts now, one of them from any other registrar (which allows for consolidating varied portfolios) --> to the new one. Happy to answer any questions.
  31. 2 points
    There's no such a thing in WHMCS. It took me weeks to find a workaround followed by months of frustration while coding but I gave up. I'd rather kiss the ugliest camel in the world.
  32. 2 points
    if you go to setup -> general settings -> other ... is the "Allow Client Registration" unticked ? https://docs.whmcs.com/Other_Tab#Allow_Client_Registration if it is unticked, then what you see would be normal... if it were ticked, then the register link should appear in both the navbar and the header.
  33. 2 points
    Greetings, I'm developing a module to setup a user on my server and sync their usage data to whmcs. I've successfully contextualized usage metrics now the big issue here is how whmcs track usage metrics my progress so far is below: I've created a new class which implements "ProviderInterface" below is the code for "metrics" function public function metrics() { return [ new Metric( 'disk', 'Disk Utilized', MetricInterface::TYPE_SNAPSHOT, new MegaBytes, new Usage(0) ) ]; } usage function is public function usage() { $serverData = $this->apiCall('stats'); $usage = []; foreach ($serverData as $data) { $usage[$data['username']] = $this->wrapUserData($data); } return $usage; } tenantusage function is public function tenantUsage($tenant) { $userData = $this->apiCall('user_stats'); return $this->wrapUserData($userData); } helper wrapuserdata function is: private function wrapUserData($data) { $wrapped = []; foreach ($this->metrics() as $metric) { $key = $metric->systemName(); if ($data[$key]) { $value = $data[$key]; $metric = $metric->withUsage( new Usage($value) ); } $wrapped[] = $metric; } return $wrapped; } And lastly helper apicall function which delibrately sends a value somewhat emulating an api call for now. private function apiCall($action) { if($action == "stats"){ return [ [ "username" => "kamran@domain.com", //this represents my username which is provided to whmcs "disk" => 100 ] ]; } else{ return [ [ "disk" => 100 ] ]; } } Okay so far in the above mentioned code, date and time updates but usage details are not updating. BTW I'm checking metrics using module parameters using $params["metricStats"][0]["currentvalue"] So please help me with the below mentioned questions. What is the correct way to return "usage()" function including what should be the identifier of the tenant(i.e. the key of value usage object where key should be serviceid?accountid?userid? of the tenant)? Whenever cron job "TenantUsageMetrics" runs only "usage()" function is invoked and never "tenantusage()" why? Also if my syntax is wrong a possible example would be tremendous. Thank you for hearing me out!
  34. 2 points
    Hi Kingsley, there's no need to do that - in fact, you should never edit the dist.whois.json as you can create a whois.json custom file in the same folder and the update won't touch that file. you should just test those TLDs after an update to ensure that they still work... if they don't, then check to see if an updated entry has been added in the dist.whois.json file. https://docs.whmcs.com/WHOIS_Servers
  35. 2 points
    by using the custom.css file ? remember to take a backup though, as the auto updater might try to overwrite it if the folder is still called Six. https://developers.whmcs.com/themes/css-styling/ technically, you could do it using a hook, but that shouldn't really be necessary. chances are the /store/sitelockvpn folder will be missing from your custom template.
  36. 2 points

    Version 1.0.0


    An issue has been identified in the 7.8.2 release - published on 6th September 2019, that can result in an error when visiting the pwreset.php file directly: Call to undefined function WHMCS\CALinkUpdateCC This is caused by the introduction of new Friendly URLs for the password reset path /password/reset/begin Attempting to access the old location at pwreset.php results in this error. This hotfix applies only to 7.8.2
  37. 2 points
    Hi all, Grizzlyware has just released Ranger for WHMCS, which will allow you to generate, manage and distribute license keys for software that you sell, via WHMCS. It's much like the WHMCS 'Licensing' module, however it has only just been released, so while it's fully functional and full featured, there is more to be added. We built Ranger to satisfy our own needs, it's open source and allows developers to license their software in the field. This is a WHMCS module which uses the Ranger framework. You can of course use the Ranger library on its own if you prefer. The module is bundled with email templates too. It's free - There is no charge for this module or the Ranger framework, all of the source code is available online as well as a packaged up WHMCS module. More information can be found here: https://www.grizzlyware.com/apps/whmcs/ranger/ We will have more WHMCS modules coming out in the not too distant future too. With that said, we just released 'Email Catcher' which scans your ticket replies for mismatched client email addresses (so you don't send an email address to the wrong client). Any questions or confusion, please give me a shout. Thank you, Josh
  38. 2 points
    Made a very small typo in the first. Use this instead: <?php use WHMCS\Database\Capsule; add_hook('DomainTransferCompleted', 1, function($vars) { //This hook will complete to do items for transfers when the transfer is completed. $toDoID = Capsule::table('tbltodolist') ->where('status', 'In Progress') ->where('title', 'Domain Pending Transfer') ->where('description', 'LIKE', '% ' . $vars["domain"] . '%') ->get(); //Loop through the ID's and set them as completed. foreach ($toDoID as $entry) { $command = 'UpdateToDoItem'; $postData = array( 'itemid' => $entry->id, 'adminid' => '1', 'status' => 'Completed', ); $results = localAPI($command, $postData); } }); Remember to update 'adminid' with the actual ID of an admin. UpdateToDo.php
  39. 2 points
    you can't really skip it, but you could redirect as soon as you hit the page using a similar hook to the viewcart one... <?php # Complete Redirect For Free Products Hook # Written by brian! use WHMCS\Database\Capsule; function complete_page_redirect_free_products_hook($vars) { $orderid = $vars['orderid']; $status = Capsule::table('tblorders')->where('id',$orderid)->value('status'); if ($vars['templatefile'] === "complete" && $vars['amount'] == "0.00" && $vars['invoiceid'] == "0" && $status !== "Fraud") { header("Location: clientarea.php"); exit; } } add_hook("ClientAreaPageCart", 1, "complete_page_redirect_free_products_hook"); so if an order has zero amount, no invoice and is not marked as Fraud, then it should redirect to clientarea.php
  40. 2 points
    What I did is a bit hacky, but here goes: From this part: {foreach $addons as $addon} In configureproduct.tpl. I first try to identify the items that has "WHMCS" in it: {if strpos($addon.name, 'WHMCS') !== false} {$isGroupable = true} {$hasWhmcsAddons = true} {$isWhmcsItem = true} {$extraClass = 'isWHMCS'} {/if} Then I hide those addons: <div class="col-sm-12 {if $isGroupable}hiddenToBeGrouped{/if} {$extraClass}"> the "hiddenToBeGrouped" css entry is simply: .hiddenToBeGrouped { display: none; } And then I simply create a new select option using the items with "WHMCS" in it: <select name="whmcsLicenseSelect" onchange="whmcsLicenseChanged(this)"> <option value="">No WHMCS License</option> {foreach $addons as $addon} {$isWhmcsItem = false} {if strpos($addon.name, 'WHMCS') !== false} {$isWhmcsItem = true} {/if} {if $isWhmcsItem} <option value="{trim(substr($addon.name, 5))}" {if $inCartWHMCSItem == $addon.name}selected{/if}> {trim(substr($addon.name, 5))} - {str_replace(" Monthly", " p/m", $addon.pricing)} </option> {/if} {/foreach} </select> And then I manipulate the hidden buttons with javascript: <script> function whmcsLicenseChanged(caller) { var selectedVal = jQuery(caller).val().trim(); // Unset All jQuery("span.singleAddonName").each(function() { var thisItem = jQuery(this); var title = thisItem.html().trim(); if(thisItem.parent().find('input').is(':checked') && title.indexOf("WHMCS") >= 0) { thisItem.parent().find('.iCheck-helper').click(); } }); // Set relevant selected one if (selectedVal != "") { jQuery("span.singleAddonName").each(function() { var thisItem = jQuery(this); var title = thisItem.html().trim(); if (title.indexOf(selectedVal) >= 0) { thisItem.parent().find('.iCheck-helper').click(); //attr("checked", "checked"); } }); } } </script> Not sure if it's the most elegant solution, but it works perfectly! :-)
  41. 2 points
    In all honesty, this should not even be a feature request at all. It should be standard!! And as far as I can see, the link to the feature request that you posted is over 4 years old. There is no point in bothering to vote at all if WHMCS doesn't care to add such an absolutely obvious feature that is part of every other billing system in the world except WHMCS.
  42. 2 points
    Google+ is an option in the social tab in general settings (along with twitter and fb) and was closed earlier in the year - that's why WHMCS will be removing it.... it's unrelated to Google Sign-In.
  43. 2 points
    if you're going to have the output in the one language, then edit the clientareadomaingetepp.tpl and change... {include file="$template/includes/alert.tpl" type="warning" msg=$LANG.domaingeteppcodeis|cat:" $eppcode"} to... {include file="$template/includes/alert.tpl" type="warning" msg="Please contact us to retrieve your EPP code"} if it needs to be in the client's language, then you'd need to use Language Overrides on the LANG.domaingeteppcodeis string. you could even use Language Overrides on the {$LANG.domaingeteppcodeexplanation} string, append your text to the end of that string and remove the entire {if} block from the template.
  44. 2 points
    There are a number of ways that you could achieve this. One of the ways this could be accomplished is with the ClientAreaProductDetails and ClientAreaPrimarySidebar hook points. You would be using the ClientAreaProductDetails hook point to get the Package ID, and then nest the ClientAreaPrimarySidebar hook point inside that to modify the sidebar. Information about these two hook points can be found at the following URLs: https://developers.whmcs.com/hooks-reference/client-area-interface/#clientareaproductdetails https://developers.whmcs.com/hooks-reference/client-area-interface/#clientareaprimarysidebar The ClientAreaProductDetails hook point returns the Service class which you can read more about at https://docs.whmcs.com/classes/7.1/WHMCS/Service/Service.html I have taken a moment to put together a basic example of such a hook. You can review this below: <?php $data['packages'] = array('1'); // Array of Package IDs to be affected $data['children'] = array('Login to cPanel', 'Login to Webmail', 'Change Password'); // Array of Children to be removed add_hook('ClientAreaProductDetails', 1, function ($vars) use ($data) { $packageId = $vars['service']->packageId; if (in_array($packageId, $data['packages'])) { add_hook('ClientAreaPrimarySidebar', 1, function ($primarySidebar) use ($data) { $targetSidebar = $primarySidebar->getChild('Service Details Actions'); if ($targetSidebar) { foreach ($data['children'] as $child) { $targetSidebar->removeChild($child); } } }); } });
  45. 2 points
    8 or 9 years ago I coded a WHMCS module that was pulling data from cPanel & CloudLinux. I can't remember all the parameters involved but for sure I had everything you see in LVE Manager (CPU, VMEM, PMEM, I/O, EP... min, avg, max, limit) and in the sidebar of WHM (FTP accounts, databases, emails, forwarders, disk, bandwidth...). At that time cloud was becoming the new trend to follow but there were still no softwares to bill hourly depending on resource usage so I coded one. I remember that few years later Modulesgarden coded a similar script. You could try to contact them. Considering what I did it so many years ago, I'd say that for sure it is still possible but I can't remember anything about INODES. Curiously my ancient module worked non-stop till 2 years ago when I killed the server. Before you ask, I have a backup but who knows where.
  46. 2 points
    The largest issue will be the resellers, VPS and dedicated server licenses, not those having to do with plain shared accounts. Keeping track of plain shared accounts on a server is simple, as is charging to cover them. Where this runs into big problems is a reseller (for instance) jamming hundreds and hundreds of accounts onto a box, and suddenly having to pay per account rather than one known license fee. WHMCS tracks the reseller account, but not the accounts that account creates on a server. If you're charging $20/m (as an example) for a reseller account, and they have sold 400 accounts, that's an extra $80/m (assuming the server already has 100+ on it) to you, the server admin/owner. You're out that $60 unless you think you can tell them they owe it. If you'd been limiting accounts per reseller all along, less concerning, but still will require onerous billing changes.
  47. 2 points
    If you meditate it a minute or two, you will discover that the new price structure charging for EVERY extra panel... IS NOT A FEE. IT LOOKS MORE LIKE A TAX: cPanel will charge YOU some kind of tax for having too many accounts in YOUR server, where enabling a new account does not represent any extra job or effort for them, because the new account is just a collection of configuration files sharing the same engine that is already installed. Wanna know another issue this new price creates? If a company owns dozens of cPanel servers with a varying rate of new/exiting customers, how can one sleep peacefully if the monthly subscription of lots of its servers will vary every month? Just imagine the chaos with the PayPal subscriptions. This means having to closely monitor the monthly expenses and due dates to add enough funds to cover the payments, or recreating those subscriptions from time to time due to the price variations. This absolutelly don't happen with the current price scheme.
  48. 2 points
    Hello Brian Finally my problem was that I had a hidden character before "<?Php" that was not seen, I could only see it from the cpanel editor. Thank you very much for your interest! A greeting.
  49. 2 points
    Lagom WHMCS Email Template - FREE We’ve just released a Lagom WHMCS Email Template, it’s available in our store completly for Free!! With active license of Lagom WHMCS Theme you will gain access to the simple email template management from the WHMCS addon. You won’t need to have any HTML and CSS knowledge, to customize the Lagom WHMCS Email Template to your needs. You can choose from 3 styles: Futuristic Style - live demo Depth Style - live demo Minimal Style - live demo Lagom Extension Configure Header Text Configure Social Links Configure Footer Links Choose Style Live Preview
  50. 2 points
    //Updated to only target products of Hosting-type. <?php use WHMCS\Database\Capsule; add_hook('PreModuleTerminate', 1, function($vars) { $invoiceid = Capsule::table('tblinvoiceitems') ->where('relid', '=', $vars['params']['serviceid']) ->where('type','Hosting') ->orderBy('duedate', 'desc') ->first(); Capsule::table('tblinvoices') ->where('id', '=', $invoiceid->invoiceid) ->update(['Status' => 'Cancelled']); });
  • 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