Jump to content

Leaderboard


Popular Content

Showing content with the highest reputation since 07/09/2013 in all areas

  1. 11 points
    The WHMCS.Community is intended to provide a place for users of WHMCS to discuss, share and interact with each other as well as WHMCS Staff. To ensure we maintain a friendly environment, we ask users to respect the following rules and guidelines. Please let us know via the WHMCS.Community Assitance category should you have any questions or comments, posts in this category are visible between yourself and the WHMCS.Community Team. WHMCS reserves the right to alter these rules from time to time. 1.User Accounts Each person may have (one) 1 forum login regardless of the number of companies you may be part of. Duplicate accounts will be removed from WHMCS.Community Please do not share your user account with others - each person should retain their own username and password Usernames must not be created that contain any of the items listed below: An email address A website address The following words WHMCS cPanel Staff Moderator Admin Any word determined to cause offence or be deemed inappropriate. Usernames or Users that do not comply with these rules may be removed from WHMCS.Community 2. Behaviour on the Community We expect all users to be friendly and polite. While we understand that users will disagree and have different points of view at times, this can be communicated in a civil manner Please do not post rude, insulting or inflammatory posts. Personal attacks, name-calling and insults will not be tolerated on WHMCS.Community. Profanity and inappropriate images (including porn or gross violence) may not be posted anywhere on the WHMCS.Community. WHMCS.Community Staff & Moderators use their sole discretion as to what is deemed unacceptable behaviour in the community and may remove content at any time. Your posts assist other users, please do not delete content if you find an answer, please share this solution to help other users. 3. Advertising on WHMCS.Community Advertising, offers or self-promotion are to be posted only in the Third Party Add-ons section of the community. Community users seeking to hire a developer may post within the Service Offers & Requests section. Advertising is limited to one advertisement per seven (7) day period on a rolling 7-day basis. Additional or excessive advertising will be removed by the moderation team and your ability to post in advertising boards removed. Soliciting and/or self-promotion via the private messaging (PM) system is strictly prohibited. The sale or reselling of WHMCS Licenses is strictly prohibited on the community. Affiliate and referral links may not be used, these links are those that link to a site and contain information crediting the person with that referral 4. Posting and Moderation on WHMCS.Community The WHMCS.Community is moderated by WHMCS.Community Moderators and Staff. When a post is deemed to be in breach of the rules it will be removed and the user advised via a warning. Please do not cross-post across the community. If your topic is better suited to another section one of the WHMCS.Community team will move it to the best category for you. You may report your post if you wish to have it moved by a moderator. For privacy reasons please do not post any personally identifiable information including Usernames, Passwords, Contact Numbers, Email Addresses and/or Credit Card Numbers As WHMCS.Community is a moderated community we have implemented a Warning System. When a post is removed for breaching the community rules we’ll be sure to let you know. We allocate points to a warning and once you have a set number of points you may be suspended from posting on the community. Users that do not comply with the rules for WHMCS.Community may be banned temporarily. Ongoing temporary bans may result in a permanent ban from WHMCS.Community. The public discussion of moderation decisions is not permitted, these will be removed without notice and may result in a community ban. 5. Signature and Profile Rules Your signature may include links, however, please ensure these are reasonable (no more than 4) and they must not include Referral/Affiliate links. This includes pricing and plan details Signatures may not contain more than 4 lines at a 1024x768 resolution Please do not sell or rent your signature space, your signature is yours alone. Where your signature does not comply with these rules you may be asked to alter or remove it 6. WHMCS.Community Ranks Official WHMCS Staff & Moderators are identified by one of the following ranks located below their profile image, in addition, their posts are highlighted blue WHMCS CEO WHMCS Community Manager WHMCS Customer Service WHMCS Developer WHMCS Marketing WHMCS Staff WHMCS Support Manager WHMCS Technical Analyst WHMCS.Community runs a ranking system, new community members start with the rank of Newbie and can progress based on the number of posts, reputation points and length of time active on the community Some users have a special “Super Users” rank. These members are a select group of elite community members that are long-standing mentors in the community, courteous to other members, always providing technical insight and advice, and generally helping to make our community a better place to learn, troubleshoot and advance. The WHMCS.Community ranking formula is changed from time to time and without notice. The algorithm used is not published or discussed with users to prevent gaming the system 7. Contacting the WHMCS.Community Team You may contact a member of the WHMCS.Community via the WHMCS.Community Assitance board If you would prefer to email you may open a ticket by emailing forums@whmcs.com Thank you for helping to keep WHMCS.Community a great place
  2. 5 points
    Hello there, After a lot of thinking, here you have a template for the Upcoming Domain Renewal Notice that will cover all scenarios. Subject: Domain {$domain_name} is due to expire in {$domain_days_until_expiry} days Dear {$client_name}, Domain {$domain_name} is due to expire in {$domain_days_until_expiry} days - {if $domain_do_not_renew eq "0"}Auto Renew On{else}Auto Renew Off{/if}. {if $domain_days_until_expiry eq "60"}{if $domain_do_not_renew eq "0"}As you have Auto Renew On, you will receive the renewal invoice 30 days before the expiration date.{else}If you would like to have the domain renewed, please access client area and turn On the Auto Renew option.{/if}{else}{if $domain_do_not_renew eq "0"}As you have Auto Renew On, you should have already received the renewal invoice. If you still didn't received the invoice, please contact our sales department. If you have already received the renewal invoice, please pay it as soon as possible to avoid the risk of domain expiration.{else}To renew the domain, please click on the following url {$domain_renewal_url}.{/if}{/if} {if $domain_days_until_expiry eq "7"}If domain {$domain_name} expires, the website and emails using this domain will no longer work.{/if} {if $domain_days_until_expiry eq "3"}If domain {$domain.name} expires, the website and emails using this domain will no longer work, and the domain may be available to be registered by someone else. WARNING: To renew an expired domain, when possible, you may have to pay a fee of up to $250.{/if} Explanation If you have configured the First Renewal Notice to be sent 60 days prior to the expiration date, and the customer has Auto Renew On, here you have the content he will receive on that Notice: Dear Customer Name, Domain example.com is due to expire in 60 days - Auto Renew On. As you have Auto Renew On, you will receive the renewal invoice 30 days before the expiration date. If you have configured the First Renewal Notice to be sent 60 days prior to the expiration date, and the customer has Auto Renew Off, here you have the content he will receive on that Notice: Dear Customer Name, Domain example.com is due to expire in 60 days - Auto Renew Off. If you would like to have the domain renewed, please access client area and turn On the Auto Renew option. If you have configured the Second Renewal Notice to be sent 30 days prior to the expiration date, and the customer has Auto Renew On, here you have the content he will receive on that Notice: Dear Customer Name, Domain example.com is due to expire in 30 days - Auto Renew On. As you have Auto Renew On, you should have already received the renewal invoice. If you still didn't received the invoice, please contact our sales department. If you have already received the renewal invoice, please pay it as soon as possible to avoid the risk of domain expiration. If you have configured the Second Renewal Notice to be sent 30 days prior to the expiration date, and the customer has Auto Renew Off, here you have the content he will receive on that Notice: Dear Customer Name, Domain example.com is due to expire in 30 days - Auto Renew Off. To renew the domain, please click on the following url {$domain_renewal_url}. If you have configured the Third Renewal Notice to be sent 7 days prior to the expiration date, and the customer has Auto Renew On, here you have the content he will receive on that Notice: Dear Customer Name, Domain example.com is due to expire in 7 days - Auto Renew On. As you have Auto Renew On, you should have already received the renewal invoice. If you still didn't received the invoice, please contact our sales department. If you have already received the renewal invoice, please pay it as soon as possible to avoid the risk of domain expiration. If domain example.com expires, the website and emails using this domain will no longer work. If you have configured the Third Renewal Notice to be sent 7 days prior to the expiration date, and the customer has Auto Renew Off, here you have the content he will receive on that Notice: Dear Customer Name, Domain example.com is due to expire in 7 days - Auto Renew Off. To renew the domain, please click on the following url {$domain_renewal_url}. If domain example.com expires, the website and emails using this domain will no longer work. If you have configured the Fourth Renewal Notice to be sent 3 days prior to the expiration date, and the customer has Auto Renew On, here you have the content he will receive on that Notice: Dear Customer Name, Domain example.com is due to expire in 3 days - Auto Renew On. As you have Auto Renew On, you should have already received the renewal invoice. If you still didn't received the invoice, please contact our sales department. If you have already received the renewal invoice, please pay it as soon as possible to avoid the risk of domain expiration. If domain example.com expires, the website and emails using this domain will no longer work, and the domain may be available to be registered by someone else. WARNING: To renew an expired domain, when possible, you may have to pay a fee of up to $250. If you have configured the Fourth Renewal Notice to be sent 3 days prior to the expiration date, and the customer has Auto Renew Off, here you have the content he will receive on that Notice: Dear Customer Name, Domain example.com is due to expire in 3 days - Auto Renew Off. To renew the domain, please click on the following url {$domain_renewal_url}. If domain example.com expires, the website and emails using this domain will no longer work, and the domain may be available to be registered by someone else. WARNING: To renew an expired domain, when possible, you may have to pay a fee of up to $250. I hope that this will be useful for someone. Best regards, David Duarte
  3. 4 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
  4. 4 points

    Version 1.0.0

    436 downloads

    An issue has been identified in the 7.6.1 release - published on 28th August, 2018 - that causes the domain synchronization task not to be performed at the scheduled time. This could result in domains remaining in Pending Transfer status, or keeping inaccurate expiration dates.
  5. 4 points
    Impressive, @Matt. It's not every day the CEO of a software company personally attends to and responds to customer issues like this. I'm truly impressed in the dedication to our community.
  6. 3 points

    Version 1.0.0

    821 downloads

    The URL of the European Central Bank XML Feed appears to have been changed on 8th September 2018 without notice. This is the feed used by WHMCS to update the exchange rates and convert product prices. This results in an error when attempting to update exchange rates:
  7. 3 points
    When displaying your payment options during the final stages of the checkout process, the available payment gateway options are shown as text – in a number of different ways based upon the order form template being used. If we wanted to make this more attractive, we could replace the text of any or all of the gateways, with an image or logo, by editing the viewcart.tpl template within the active order form template. In order to do this, we can use one of the WHMCS variables that we have access to during the checkout process - $gateway.sysname - the variable stores in lowercase, the unique name used by WHMCS for the payment gateway. This is not the value you entered for the gateway in the “Display Name” field in the “Payment Gateways” section of the Admin Area. The next step is to create or find images for each of the gateways that you wish to replace with a graphic, all in the same graphic format (PNG, JPG or GIF) and save them with a lowercase filename. For example, if you were using PNG format, then your “PayPal” image would be called ‘paypal.png’; your “Bank Transfer” image is called ‘banktransfer.png’; and the “Mail-In Payment” gateway (in the above example, named ‘Cheque’) would be ‘mailin.png’. I believe the filename to be used is based upon the filename of the gateway file in ‘modules/gateways’, but you should be able to find its value by viewing the source of your cart page in your browser... [<label><input type="radio" name="paymentmethod" value="paypal" onclick="hideCCForm()" /> <img src=images/paypal.png /> So the part of interest above is: value=”paypal”. You would then upload these images to your “images” directory within WHMCS. If you wanted to put them in their own folder within the “images” directory, you can – but you will need to adjust the URL in the code below to take account of the slightly different path (see end of tutorial). The images directory i'm using in these examples is whmcs/images - and not the template(s) images folder. The replacement code works by first creating a new variable to store the URL of the gateway logo, then it will check to see if the image exists in the “images” folder (remember that it must have a lowercase filename on the server otherwise it will not be found) – if the image exists, it will display the image; if no image is found, it will display the text (as it does now). In the examples above, I have only uploaded a ‘paypal’ logo and hence only that gateway is using a replacement image – if I were to upload logos for the other two gateways, they would also be used instead of their text names. So, I will now go through each of the eight existing order form templates and show the code to be replaced, the replacement code and an image of how the cart checkout page looks when the new code is added. Ajaxcart Replace.... <div class="cartbox">{foreach key=num item=gateway from=$gateways} <label><input type="radio" name="paymentmethod" value="{$gateway.sysname}" onclick="{if $gateway.type eq "CC"}showCCForm(){else}hideCCForm(){/if}"{if $selectedgateway eq $gateway.sysname} checked{/if} /> {$gateway.name}</label>{/foreach}</div> With... <div class="cartbox">{foreach key=num item=gateway from=$gateways} <label><input type="radio" name="paymentmethod" value="{$gateway.sysname}" onclick="{if $gateway.type eq "CC"}showCCForm(){else}hideCCForm(){/if}"{if $selectedgateway eq $gateway.sysname} checked{/if} /> {assign var="paylogo" value="images/`$gateway.sysname`.png"} {if file_exists($paylogo)} <img src={$paylogo} /> {else} {$gateway.name}{/if}</label> {/foreach}</div> Boxes Replace.... <p align="center">{foreach key=num item=gateway from=$gateways}<label><input type="radio" name="paymentmethod" value="{$gateway.sysname}" onclick="{if $gateway.type eq "CC"}showCCForm(){else}hideCCForm(){/if}"{if $selectedgateway eq $gateway.sysname} checked{/if} />{$gateway.name}</label> {/foreach}</p> With... <p align="center">{foreach key=num item=gateway from=$gateways}<label><input type="radio" name="paymentmethod" value="{$gateway.sysname}" onclick="{if $gateway.type eq "CC"}showCCForm(){else}hideCCForm(){/if}"{if $selectedgateway eq $gateway.sysname} checked{/if} /> {assign var="paylogo" value="images/`$gateway.sysname`.png"} {if file_exists($paylogo)} <img src={$paylogo} /> {else} {$gateway.name}</label> {/foreach}</p> Cart Replace... <p align="center">{foreach key=num item=gateway from=$gateways}<label><input type="radio" name="paymentmethod" value="{$gateway.sysname}" onclick="{if $gateway.type eq "CC"}showCCForm(){else}hideCCForm(){/if}"{if $selectedgateway eq $gateway.sysname} checked{/if} />{$gateway.name}</label> {/foreach}</p> With... <p align="center">{foreach key=num item=gateway from=$gateways}<label><input type="radio" name="paymentmethod" value="{$gateway.sysname}" onclick="{if $gateway.type eq "CC"}showCCForm(){else}hideCCForm(){/if}"{if $selectedgateway eq $gateway.sysname} checked{/if} />{assign var="paylogo" value="images/`$gateway.sysname`.png"} {if file_exists($paylogo)} <img src={$paylogo} /> {else} {$gateway.name}{/if}</label> {/foreach}</p> Comparison Replace... <p class="paymentmethods">{foreach key=num item=gateway from=$gateways}<label><input type="radio" name="paymentmethod" value="{$gateway.sysname}" onclick="{if $gateway.type eq "CC"}showCCForm(){else}hideCCForm(){/if}"{if $selectedgateway eq $gateway.sysname} checked{/if} />{$gateway.name}</label><br />{/foreach}</p> With... <p class="paymentmethods">{foreach key=num item=gateway from=$gateways}<label><input type="radio" name="paymentmethod" value="{$gateway.sysname}" onclick="{if $gateway.type eq "CC"}showCCForm(){else}hideCCForm(){/if}"{if $selectedgateway eq $gateway.sysname} checked{/if} />{assign var="paylogo" value="images/`$gateway.sysname`.png"} {if file_exists($paylogo)} <img src={$paylogo} /> {else} {$gateway.name}{/if}</label><br />{/foreach}</p> Modern Replace... {foreach key=num item=gateway from=$gateways}<label><input type="radio" name="paymentmethod" value="{$gateway.sysname}" id="pgbtn{$num}" onclick="{if $gateway.type eq "CC"}showCCForm(){else}hideCCForm(){/if}"{if $selectedgateway eq $gateway.sysname} checked{/if} /> {$gateway.name}</label> {/foreach} With... {foreach key=num item=gateway from=$gateways}<label><input type="radio" name="paymentmethod" value="{$gateway.sysname}" id="pgbtn{$num}" onclick="{if $gateway.type eq "CC"}showCCForm(){else}hideCCForm(){/if}"{if $selectedgateway eq $gateway.sysname} checked{/if} /> {assign var="paylogo" value="images/`$gateway.sysname`.png"} {if file_exists($paylogo)} <img src={$paylogo} /> {else} {$gateway.name}{/if}</label> {/foreach} Slider Replace... {foreach key=num item=gateway from=$gateways}<label><input type="radio" name="paymentmethod" value="{$gateway.sysname}" onclick="{if $gateway.type eq "CC"}showCCForm(){else}hideCCForm(){/if}"{if $selectedgateway eq $gateway.sysname} checked{/if} />{$gateway.name}</label> {/foreach} With... {foreach key=num item=gateway from=$gateways}<label><input type="radio" name="paymentmethod" value="{$gateway.sysname}" onclick="{if $gateway.type eq "CC"}showCCForm(){else}hideCCForm(){/if}"{if $selectedgateway eq $gateway.sysname} checked{/if} />{assign var="paylogo" value="images/`$gateway.sysname`.png"} {if file_exists($paylogo)} <img src={$paylogo} /> {else} {$gateway.name}{/if}</label> {/foreach} Verticalsteps Replace... <p align="center">{foreach key=num item=gateway from=$gateways}<input type="radio" name="paymentmethod" value="{$gateway.sysname}" id="pgbtn{$num}" onclick="{if $gateway.type eq "CC"}showCCForm(){else}hideCCForm(){/if}"{if $selectedgateway eq $gateway.sysname} checked{/if} /><label for="pgbtn{$num}">{$gateway.name}</label> {/foreach}</p> With... <p align="center">{foreach key=num item=gateway from=$gateways}<input type="radio" name="paymentmethod" value="{$gateway.sysname}" id="pgbtn{$num}" onclick="{if $gateway.type eq "CC"}showCCForm(){else}hideCCForm(){/if}"{if $selectedgateway eq $gateway.sysname} checked{/if} /><label for="pgbtn{$num}">{assign var="paylogo" value="images/`$gateway.sysname`.png"} {if file_exists($paylogo)} <img src={$paylogo} /> {else} {$gateway.name}{/if}</label> {/foreach}</p> Web20Cart Replace... <div class="cartbox">{foreach key=num item=gateway from=$gateways} <label><input type="radio" name="paymentmethod" value="{$gateway.sysname}" onclick="{if $gateway.type eq "CC"}showCCForm(){else}hideCCForm(){/if}"{if $selectedgateway eq $gateway.sysname} checked{/if} /> {$gateway.name}</label> {/foreach}</div> With... <div class="cartbox">{foreach key=num item=gateway from=$gateways} <label><input type="radio" name="paymentmethod" value="{$gateway.sysname}" onclick="{if $gateway.type eq "CC"}showCCForm(){else}hideCCForm(){/if}"{if $selectedgateway eq $gateway.sysname} checked{/if} /> {assign var="paylogo" value="images/`$gateway.sysname`.png"} {if file_exists($paylogo)} <img src={$paylogo} /> {else} {$gateway.name}{/if}</label> {/foreach}</div> Customised Order Form Templates If you are using a customised order form, perhaps supplied with a purchased WHMCS theme, this solution may still work with your template - in viewcart.tpl, you simply replace... {$gateway.name} With... {assign var="paylogo" value="images/`$gateway.sysname`.png"} {if file_exists($paylogo)} <img src={$paylogo} /> {else} {$gateway.name}{/if} In these examples, I have used .PNG images - if you wanted to use .JPG or .GIF instead, then you would replace .png in the code with .jpg or .gif - remember, they must all use the same format! if you wanted to put the gateway images in their own folder, e.g 'paylogos', then you would replace the code... {assign var="paylogo" value="images/`$gateway.sysname`.png"} with... {assign var="paylogo" value="images/paylogos/`$gateway.sysname`.png"} I hope this helps anyone who wants to replace their payment gateways text with images. I should also add that this is tested and working on the latest WHMCS release as of this tutorial - v5.3.3
  8. 3 points
    errr... really? did anyone genuinely ask for such a feature... ?? feel free to point to a feature request where this occurred and received an overwhelming number of votes. it's an admin lookup tool, not a sales tool... if I want suggestions, I can get them in the client area... and nice to see the usual same old WHMCS trick of sneaking a new feature in between RC and GA, without the slightest hint of a mention of it in any of the previous two v7.6 betas... I couldn't find any obvious admin method to disable the output - nothing in general settings... only option seems to be going to domain pricing and removing the alternate TLDs from Standard Whois or WHMCS Namespinning... which then removes them from the clientarea searches too... absolutely ridiculous, but sadly not surprising. in the end, I wrote an admin hook to hide the suggestions output from that whois page... needless to say, there are no unique IDs used in the HTML, so using css in a custom css file wasn't an option(!)... if anyone wants the hook, feel free to PM me - but i'm not posting any code in a temporary community like this one. btw - did you decide not to fix the obvious twitter fontawesome icon bug that's been in twitterfeed.tpl since the first v7.6 beta.. <i class="fas fa-twitter fa-2x"></i> with it being a brand icon, shouldn't it be... <i class="fab fa-twitter fa-2x"></i> even though I did mention it to a WHMCS staff member on June 29 when the first beta was released, I guess it's easily missed by WHMCS - it's only visible on the front page of the client homepage that every (if twitter account enabled) v7.6 end-user will now see when they upgrade. oh boy.
  9. 3 points
    When choosing a product that has a recurring billing cycle, WHMCS will show the price in one of two fixed ways – depending on whether the "Monthly Pricing Breakdown" checkbox is ticked in the "Ordering" settings tab within the Admin Area. If it is not ticked, then the price will be displayed alongside the cycle names (taken from the language files) for the available cycles – if there are setup fees included for the cycle, they will be added to the end of the text (shown below on the left). However, if the checkbox is ticked, then WHMCS will not display the total cost of the cycles, but will calculate an equivalent monthly price for each of them instead (shown below on the right). A question was asked in the Community Forum by Ambarella about how to show the total price, the saving from the minimum cycle and also the monthly price for each cycle – e.g. for a layout such as this: http://forum.whmcs.com/showthread.php?84298-How-to-display-discounted-pricing-on-order-pages I was intrigued to see if there was an answer to this question as it has previously been asked many times and as far as I could tell, never really answered. Unfortunately, it is not possible to do this solely by changing any admin settings – the above two methods for displaying the cost of recurring billing cycles are hard-coded into WHMCS. If we were looking to only make a minor change to either layout, it would be possible to do so by slightly modifying the language files and tweaking the existing billing cycle variable in the template. However, Ambarella’s desired layout uses aspects of both methods and then additionally wishes to show the saving too - minor tweaking wouldn’t be sufficient to do this and so a more thorough solution has to be developed. The final solution turned out to be far simpler, from a coding point of view, than I had first imagined as most of the required variables were easily obtainable. I have also tried to keep it flexible and simple enough for others to modify for their own needs. This has been tested using the latest release of WHMCS as I write this, v5.3.4, and will work with all of the default order form templates (Ajaxcart, Boxes, Cart, Comparison, Modern, Slider, Verticalsteps and Web20Cart). If they’re similar in design to the default templates, I can see no reason why this solution shouldn’t work with customised order form templates either. There are three steps to this solution, listed below, and I will go through each of them briefly before bringing them all together to show the completed result. Possible changes to the language file(s). Creation of the new variables to calculate and store the required values. Modifying the template to use these new variables. Language Files The two default methods for showing recurring billing cycles use existing language variables in their display. When “Monthly Pricing Breakdown” is enabled, the following variables are used. In the example below, this is their values from the english.php language file: $_LANG['orderpaymentterm1month'] = "1 Month Price"; $_LANG['orderpaymentterm3month'] = "3 Month Price"; $_LANG['orderpaymentterm6month'] = "6 Month Price"; $_LANG['orderpaymentterm12month'] = "12 Month Price"; $_LANG['orderpaymentterm24month'] = "24 Month Price"; $_LANG['orderpaymentterm36month'] = "36 Month Price"; When disabled, it uses the following variables: $_LANG['orderpaymenttermmonthly'] = "Monthly"; $_LANG['orderpaymenttermquarterly'] = "Quarterly"; $_LANG['orderpaymenttermsemiannually'] = "Semi-Annually"; $_LANG['orderpaymenttermannually'] = "Annually"; $_LANG['orderpaymenttermbiennially'] = "Biennially"; $_LANG['orderpaymenttermtriennially'] = "Triennially"; Ideally, if you can use any of the above groups of variables without modifying them, then it is probably easier to do so. But if you feel that you need to modify any of them for use with this method, I would strongly urge you to consider the consequences carefully before doing so. The second group of variables (Monthly, Quarterly, Semi-Annually etc) are also used on the cart summary page, viewcart.tpl, and so any changes you make to them for use in the billing cycle page, will also affect their display on the cart summary page too. As an aside, I should probably add that if your WHMCS site only uses one language, then you could code the language directly in the template rather than using language variables – but for the sake of this tutorial, I will assume you are not and use the language files. Using the example of Ambarella’s desired output of "Monthly Cost", "Quarterly Cost" etc, you might think that it would be easier to use the existing variable for "Monthly", add another variable to store "Cost" - then use them together. While this might work in English, it would not necessary be grammatically correct in other languages – for example, in the French.php language file, the value for "Monthly" is: $_LANG['orderpaymenttermmonthly'] = "Mensuel"; The French word for "Cost" is "coût" – so if we put them together, we would get "Mensuel coût". Using my (limited!) understanding of French, I think that it should really be "coût mensuel" – and this appears to be confirmed by Google Translate. So to make things easier, we will start by creating six new language variables for use with this recurring billing cycle solution and add them to the language override file(s). Language Overrides Although we can edit the existing language files in WHMCS, it is recommended that you do not because when you update WHMCS, you will overwrite these language files – and subsequently lose any changes that you have made to them. http://docs.whmcs.com/Language_Overrides To create a Language Override file, we would follow this procedure: Create the folder 'overrides' within the 'lang' folder. Create or copy the language file you want to override. For example, to create an override for the French language you create ./lang/overrides/french.php Open the newly created file in your preferred editor. Start the file with a PHP tag '<?php' indicating PHP code is to be used. Try to use variable names that make sense to where they’re being used, and have not previously been used. So, for our six recurring billing cycles, let’s use the following: $_LANG['billingcyclemonth'] = "Monthly Cost"; $_LANG['billingcyclequart'] = "Quarterly Cost"; $_LANG['billingcyclesemi'] = "Semi-Annual Cost"; $_LANG['billingcycleannual'] = "Annual Cost"; $_LANG['billingcyclebienn'] = "Biennial Cost"; $_LANG['billingcycletrienn'] = "Triennial Cost"; To get Ambarella’s output, we will need two additional new language variables – one for “Saving” and another for “Per Month”. $_LANG['cyclesaving'] = "Save"; $_LANG['permonth'] = "P/m"; Now that we have these language variables created, we can move on to making the calculations and saving them for use in the display. Calculations and Variables As the template system used by WHMCS is based on Smarty, I have used only Smarty code for this solution. It would be possible to perform these calculations using PHP within the template, but it is often frowned upon to use {php} tags in the templates. Also, I believe that as of Smarty v3, the option to do use {php} has been removed. Although WHMCS currently uses Smarty v2, I am sure that at some point it will be upgraded. Therefore, as it should be easier for others to follow, and hopefully avoid future upgrade complications, I decided to write the solution entirely using Smarty tags. We need to calculate the saving of a recurring billing cycle compared to the minimum billing cycle – this would probably be the monthly cycle, but this is not always the case. Usefully, the variable that stores the minimum billing cycle is available to us and so we can use it in our calculations to determine the correct savings for each enabled recurring billing cycle based on the minimum cycle. Additionally, we need to calculate the price per month of a recurring billing cycle – but this is simple as it is just the total price for the billing cycle divided by its total number of months. So let’s start with the easier step first – calculating the price per month of a cycle. Obviously, we don’t have to calculate the price per month for the monthly cycle, so we just need to work out the other five. For this we need two variables - the total billing cycle cost (which we can obtain from existing variables) and the number of months in each cycle (which we will define ourselves). First, we create a new variable and give it a value of zero to ensure that any calculations are not added to any previous total. Then, using the {math} Smarty tag, we assign our result to this variable; define what the equation is; specify the variables we’re using in the equation and set the format of the resulting answer... and then repeat the same process for the remaining recurring billing cycles. {assign var="qmonthprice" value=0} {math assign="qmonthprice" equation="d / b" b=3 d=$pricing.rawpricing.quarterly format="%.2f"} {assign var="smonthprice" value=0} {math assign="smonthprice" equation="d / b" b=6 d=$pricing.rawpricing.semiannually format="%.2f"} {assign var="amonthprice" value=0} {math assign="amonthprice" equation="d / b" b=12 d=$pricing.rawpricing.annually format="%.2f"} {assign var="bmonthprice" value=0} {math assign="bmonthprice" equation="d / b" b=24 d=$pricing.rawpricing.biennially format="%.2f"} {assign var="tmonthprice" value=0} {math assign="tmonthprice" equation="d / b" b=36 d=$pricing.rawpricing.triennially format="%.2f"} The above code will create the price per month for each recurring billing cycle and store it to two decimal places. Next we need to calculate the savings – this uses a similar method to the previous example, but there are more variables required and thus the equation itself is more complicated - we will also use an {if} statement to determine what the minimum billing cycle is. To calculate the saving, we also take into account any setup fees for each cycle. For the previous “price per month” calculation, I have ignored any setup fees – but these could easily be added by modifying the previous equations if you wished to include them. As the minimum billing cycle increases, there are fewer additional cycles available and so fewer calculations will be required. For "Monthly", there are five saving calculations to be made – but by the time the minimum cycle is "Biennial", there is only one calculation required. If the minimum billing cycle is "Triennial", then it will not necessary to calculate any savings as there will only be one recurring billing cycle available. Here is a small example of the required code... {if $pricing.minprice.cycle eq "monthly"} {assign var="qsaving" value=0} {math assign="qsaving" equation="((a * b) + c) - (d + e)" a=$pricing.rawpricing.monthly b=3 c=$pricing.rawpricing.msetupfee d=$pricing.rawpricing.quarterly e=$pricing.rawpricing.qsetupfee format="%.2f"} {/if} The above code will calculate the savings for the quarterly billing cycle based on the minimum billing cycle being monthly, and store it to two decimal places. So we have our modified language variables; we have created our equations to calculate the price per month / cycle savings and assigned them to new variables – the third step is to integrate these into the templates. Template Modifications As I stated earlier in this tutorial, this solution will work for all of the default order form templates and should work for customised order form templates too. While there might be slight variations in the code used to create the billing cycle table in the different order form templates, the six important variables remain the same – and it is only these that you will need to replace with my new code. If we use "Comparison" as an example and look at the current code for displaying the monthly cycle: {if $pricing.monthly}<tr><td class="radiofield"> <input type="radio" name="billingcycle" id="cycle1" value="monthly"{if $billingcycle eq "monthly"} checked{/if} onclick="submit()" /></td><td class="fieldarea"><label for="cycle1">{$pricing.monthly}</label></td></tr>{/if} To use the new modified code to display our customised layout, you need to replace the above with: As you can see, the basics of the layout remain exactly the same, all we have done is replaced {$pricing.monthly} with the following: {$LANG.billingcyclemonth} {$currency.prefix}{$pricing.rawpricing.monthly}{$currency.suffix}{if $pricing.rawpricing.msetupfee neq 0} + {$currency.prefix}{$pricing.rawpricing.msetupfee}{$currency.suffix} {$LANG.ordersetupfee}{/if} Some of these variables you will recognise as we have created them previously – the others are defined by WHMCS, either to store price / setup fee values, or currency strings. {$currency.prefix} - The prefix defined in your currency settings, e.g. $, £, € etc or left blank. {$currency.suffix} - The suffix defined in your currency settings, e.g. USD, GBP, EUR etc or left blank. If we take a look at the next billing cycle, in this case quarterly, you will see some additional code that will generate the saving text (which obviously is not used on the minimum billing cycle). After adding the code for the remaining billing cycles, the output using the Comparison order form would be as follows: In the above examples, I’ve intentionally setup some billing cycles to have setup fees and others not – this was to thoroughly test the equations used. So that’s a brief explanation of the theory, next we will assemble the three steps and bring them together for the finished solution. Language Files As I previously listed, here are the eight new language variables - if you want to use them, remember to add them to your language override file(s). Should you need to add more or change these, please do so! $_LANG['billingcyclemonth'] = "Monthly Cost"; $_LANG['billingcyclequart'] = "Quarterly Cost"; $_LANG['billingcyclesemi'] = "Semi-Annual Cost"; $_LANG['billingcycleannual'] = "Annual Cost"; $_LANG['billingcyclebienn'] = "Biennial Cost"; $_LANG['billingcycletrienn'] = "Triennial Cost"; $_LANG['cyclesaving'] = "Save"; $_LANG['permonth'] = "P/m"; Calculations and Variables If you require calculations and new variables for your solution, add them to the template before the lines in which these newly created variables are called. For this solution, we will need to add the following to the 'configureproduct.tpl' order form template(s) *before* the template modifications of step 3. {* Calculate the price per month *} {assign var="qmonthprice" value=0} {math assign="qmonthprice" equation="d / b" b=3 d=$pricing.rawpricing.quarterly format="%.2f"} {assign var="smonthprice" value=0} {math assign="smonthprice" equation="d / b" b=6 d=$pricing.rawpricing.semiannually format="%.2f"} {assign var="amonthprice" value=0} {math assign="amonthprice" equation="d / b" b=12 d=$pricing.rawpricing.annually format="%.2f"} {assign var="bmonthprice" value=0} {math assign="bmonthprice" equation="d / b" b=24 d=$pricing.rawpricing.biennially format="%.2f"} {assign var="tmonthprice" value=0} {math assign="tmonthprice" equation="d / b" b=36 d=$pricing.rawpricing.triennially format="%.2f"} {* Calculate the cycle savings *} {if $pricing.minprice.cycle eq "monthly"} {assign var="qsaving" value=0} {math assign="qsaving" equation="((a * b) + c) - (d + e)" a=$pricing.rawpricing.monthly b=3 c=$pricing.rawpricing.msetupfee d=$pricing.rawpricing.quarterly e=$pricing.rawpricing.qsetupfee format="%.2f"} {assign var="ssaving" value=0} {math assign="ssaving" equation="((a * b) + c) - (d + e)" a=$pricing.rawpricing.monthly b=6 c=$pricing.rawpricing.msetupfee d=$pricing.rawpricing.semiannually e=$pricing.rawpricing.ssetupfee format="%.2f"} {assign var="asaving" value=0} {math assign="asaving" equation="((a * b) + c) - (d + e)" a=$pricing.rawpricing.monthly b=12 c=$pricing.rawpricing.msetupfee d=$pricing.rawpricing.annually e=$pricing.rawpricing.asetupfee format="%.2f"} {assign var="bsaving" value=0} {math assign="bsaving" equation="((a * b) + c) - (d + e)" a=$pricing.rawpricing.monthly b=24 c=$pricing.rawpricing.msetupfee d=$pricing.rawpricing.biennially e=$pricing.rawpricing.bsetupfee format="%.2f"} {assign var="tsaving" value=0} {math assign="tsaving" equation="((a * b) + c) - (d + e)" a=$pricing.rawpricing.monthly b=36 c=$pricing.rawpricing.msetupfee d=$pricing.rawpricing.triennially e=$pricing.rawpricing.tsetupfee format="%.2f"} {elseif $pricing.minprice.cycle eq "quarterly"} {assign var="ssaving" value=0} {math assign="ssaving" equation="((a * b) + c) - (d + e)" a=$pricing.rawpricing.quarterly b=2 c=$pricing.rawpricing.qsetupfee d=$pricing.rawpricing.semiannually e=$pricing.rawpricing.ssetupfee format="%.2f"} {assign var="asaving" value=0} {math assign="asaving" equation="((a * b) + c) - (d + e)" a=$pricing.rawpricing.quarterly b=4 c=$pricing.rawpricing.qsetupfee d=$pricing.rawpricing.annually e=$pricing.rawpricing.asetupfee format="%.2f"} {assign var="bsaving" value=0} {math assign="bsaving" equation="((a * b) + c) - (d + e)" a=$pricing.rawpricing.quarterly b=8 c=$pricing.rawpricing.qsetupfee d=$pricing.rawpricing.biennially e=$pricing.rawpricing.bsetupfee format="%.2f"} {assign var="tsaving" value=0} {math assign="tsaving" equation="((a * b) + c) - (d + e)" a=$pricing.rawpricing.quarterly b=12 c=$pricing.rawpricing.qsetupfee d=$pricing.rawpricing.triennially e=$pricing.rawpricing.tsetupfee format="%.2f"} {elseif $pricing.minprice.cycle eq "semiannually"} {assign var="asaving" value=0} {math assign="asaving" equation="((a * b) + c) - (d + e)" a=$pricing.rawpricing.semiannually b=2 c=$pricing.rawpricing.ssetupfee d=$pricing.rawpricing.annually e=$pricing.rawpricing.asetupfee format="%.2f"} {assign var="bsaving" value=0} {math assign="bsaving" equation="((a * b) + c) - (d + e)" a=$pricing.rawpricing.semiannually b=4 c=$pricing.rawpricing.ssetupfee d=$pricing.rawpricing.biennially e=$pricing.rawpricing.bsetupfee format="%.2f"} {assign var="tsaving" value=0} {math assign="tsaving" equation="((a * b) + c) - (d + e)" a=$pricing.rawpricing.semiannually b=8 c=$pricing.rawpricing.ssetupfee d=$pricing.rawpricing.triennially e=$pricing.rawpricing.tsetupfee format="%.2f"} {elseif $pricing.minprice.cycle eq "annually"} {assign var="bsaving" value=0} {math assign="bsaving" equation="((a * b) + c) - (d + e)" a=$pricing.rawpricing.annually b=2 c=$pricing.rawpricing.asetupfee d=$pricing.rawpricing.biennially e=$pricing.rawpricing.bsetupfee format="%.2f"} {assign var="tsaving" value=0} {math assign="tsaving" equation="((a * b) + c) - (d + e)" a=$pricing.rawpricing.annually b=3 c=$pricing.rawpricing.asetupfee d=$pricing.rawpricing.triennially e=$pricing.rawpricing.tsetupfee format="%.2f"} {elseif $pricing.minprice.cycle eq "biennially"} {assign var="tsaving" value=0} {math assign="tsaving" equation="((a * b) + c) - (d + e)" a=$pricing.rawpricing.biennially b=1.5 c=$pricing.rawpricing.bsetupfee d=$pricing.rawpricing.triennially e=$pricing.rawpricing.tsetupfee format="%.2f"} {/if} Template Modifications In the previous step, we modified the 'configureproduct.tpl' to calculate and assign some new variables. Next, we will replace the existing recurring billing cycle code in that same template file with the new code. To make this solution complete, I will go through the default order form templates and show the existing code, plus the new code to replace it with. Ajaxcart The default recurring billing cycle code for Ajaxcart (configureproduct.tpl) is... Replace the above with the new modified code... Please note: This code appeared not to work in v5.3.3, but following the v5.3.4 maintenance release, the pricing bugs have been fixed in WHMCS and this solution now works using Ajaxcart in v5.3.4 Boxes The original code and the replacement code are the same as for Ajaxcart. Cart The original code and the replacement code are the same as for Ajaxcart. Comparison The default recurring billing cycle code for Comparison (configureproduct.tpl) is... Replace the above with the new modified code... Modern & Slider The default recurring billing cycle code for Modern & Slider (configureproduct.tpl) is... Replace the above with the new modified code... Verticalsteps The original code and the replacement code are the same as for Ajaxcart. Web20Cart The original code and the replacement code are the same as for Ajaxcart. Taking the solution to the next level During this tutorial, I’ve shown how, instead of using either of the default WHMCS predefined displays of recurring billing cycles, we can define and use our own specified layout. But, why stop there? Now that we are no longer constrained by hardcoded displays, we could take this further and make other changes... some trivial, others cosmetic and perhaps one or two that are very powerful! Ok, let’s start off with something trivial that you can use on those templates that don’t have a dropdown to display the cycles – e.g., Comparison, Modern and Slider. If you wanted to bold the billing cycle names, and perhaps highlight any potential savings by showing them in red, you could use the following code: When originally working out the Smarty code for this tutorial, I did consider using combined variables as WHMCS currently does, e.g $pricing.monthly etc, where a number of variables are assembled together to create a single easily callable variable. However, I decided against doing this for a number of reasons – firstly, I wanted to show all the component variables separately to make it easier for others to remove or add variables themselves; Secondly, because the variables are separate, each can be modified (either with Smarty code or as with the above html/css) individually and thirdly, in most circumstances I can foresee with this, I don’t think there’s any real advantage in doing so! So we’ve modified the display a little, but why don’t we try to do something a little more powerful! Up until this point, we have simply been replacing the default method of displaying the recurring billing cycles with our customised solution - but if we can create one solution, why not a second, a third or a hundred? We are now in a position where, instead of WHMCS just using one recurring billing cycle display method for the entire site, we can specify different cycle displays for each product and/or product group. Put simply – each individual product or product group can use its own method for displaying recurring billing cycles, as defined by you! The code itself is straightforward and uses the variables for Group ID (gid) and Product ID (pid) – these values can be obtained from the “Direct Cart Links” section of the Product or Product Group in the Admin Area - http://docs.whmcs.com/Products_and_Services#Links_tab As an example, let’s use Ajaxcart and specify a custom display method for one product – all other products will use the default method of display (in practice this could be another custom layout, but to save time and keep things simple, we’ll use the default display code). in basic terms, this: In actual code... If you wanted to select product groups and individual products to use the same display method, then you could use... You can add as many products and/or groups you want to the above statement or use multiple {if} statements - just remember to end the block of code with a closing {/if}, This advanced solution should hopefully allow you to make the shopping process slightly easier for your customers by enabling you to use more appropriate billing cycle text for each product and/or group. I suspect that I've only scratched the surface of what is possible with this technique... so if anyone turns this into a commercial addon, I'd appreciate a share of the profits, a mention - or at the very least, a small glass of cooking sherry to get me through the day.* * I'd add a smilie at this point, but I'm limited to ten images and can't add one! lol
  10. 3 points
    Hi everyone, Its been a long time since i have been around and mostly due to medical and life issues. However since i have decided to retire from the professional side of programming and just doing the hobby deal now i wanted to offer up my old WHMCS addons (not encoded) to everyone for free. I wont be doing any more WHMCS work now that its just a hobby for me so sharing what i have done in the past might help someone in the future, so you may download an use them as you wish. You are free to use these addons without restriction from me, all i ask is that somewhere in the header you at least be kind enough to mention my name as the original artist. I believe that last version i updated these for was WHMCS version 6 and they all worked back then. You may have to do some tweaking for the newer versions of WHMCS. I will be posting several zip files here over the next few days as soon as i can get the file headers modified for the new non restrictive purposes, i believe there are a total of 4 addons i will be posting here. The zip file contains the install txt and all the files you need. It is exactly the way it was when it was for sale, the only thing i have changed are the files license header to unrestricted. Thanks for all your help in the past and i wish you all the very best going forward. 1. This one is called Client Permblock - The purpose of this addon is to give the local admin a way to locally block unwanted clients. With WHMCS there are national fraud features that you would typically report fraud clients to as part of WHMCS. However, if that client should not qualify to be reported to those national companies for some reason then this addon will allow you to keep your own local records. This addon does not do any remote reporting, its only purpose is to allow you to be more proactive and list current WHMCS clients or add non-client information that you choose not to do business with in the future should they attempt to join your business as a client. I had big plans for this addon with more features but just never got around to it. Enjoy the addon client_permblock_addon_V1_1_free.zip 2. This is the PHPBB Bridge addon - This addon allows you to auto register a new WHMCS client to your phpBB community when they complete the WHMCS registration. Enjoy the addon phpbb_bub_addon1_4_free.zip
  11. 3 points
    Hi there We first became aware of instances of the spam signups being discussed here towards the latter end of last week and since then our team has been monitoring the issue and investigating instances of it reported to us via support tickets. We understand how receiving a large number of spam orders can be inconvenient and frustrating and so in an effort to try to combat and prevent these orders from being successful, our team has worked to implement Google's invisible reCAPTCHA to the shopping cart checkout workflow through the use of the hooks system. This is being provided as a short term immediate solution for users affected by the recent spam order submissions until such time as we can release a product update with this functionality natively included. What is Google Invisible reCAPTCHA? Invisible reCAPTCHA is designed to be as inobtrusive to the regular user as possible. In most cases, users will not be prompted to solve a captcha. Only when Google detects suspicious behaviour or traffic will a captcha challenge be presented. The result is that while it may not prevent all spam signups, as soon as Google detects suspicious activity or patterns, further automated orders should be blocked. To learn more about how Invisible reCAPTCHA works, please visit https://developers.google.com/recaptcha/docs/invisible Installation Instructions To install the hook, follow the steps below. 1. Download the hook (attached at the bottom of this post) 2. Upload to the /includes/hooks/ directory of your WHMCS installation 3. The hook leverages the same Google reCAPTCHA configuration as defined in Setup > General Settings > Security. Therefore, please ensure the Captcha settings are configured there as follows: Captcha Form Protection: "Always On" or "Off when logged in" Captcha Type: reCAPTCHA (Google's reCAPTCHA system) reCAPTCHA Site Key & Secret Key: Provided Remember, Invisible reCAPTCHA may not block all spam submissions, but it should be effective in preventing repeated and high volume submission attempts. We're keen to hear how effective this change is at preventing the spam order submissions you’ve been experiencing recently so please let us know your experiences with the hook. Regards, Matt cart_recaptcha.php
  12. 3 points
    Hi there, quick update our 7.5.1 release is out and contains this fix.
  13. 3 points
    As a continuation and update to the discussion at WHMCS.community, I'm pleased to announce that support for PHP 7.1 and PHP 7.2 is right around the corner! Your automatic update to WHMCS v7.5 will support PHP 5.6, 7.0, 7.1, and 7.2 environments with IonCube loader 10.1. To accomplish this WHMCS is leveraging yet-to-be released IonCube functionality that overcomes the lack of multi-PHP support in the IonCube Encoder. We expect to release WHMCS 7.5 in the first quarter of 2018.WHMCS v7.4.2 is scheduled for release in January 2018. Beyond general maintenance, this release will contain additional checks and notifications to enable the safest automatic update process. These checks will include new functionality to ensure your environment has the appropriate ionCube loaders before a new version of WHMCS is deployed, ensuring that your system is ready to run the new version of WHMCS without issue. As a result, only v7.4.2 (and future v7.4 releases) will be able to automatically update to WHMCS v7.5. Any WHMCS installation prior to V7.4.2 will need to first auto-update to 7.4.2, and only then, will you be able to update to v7.5 when that update becomes available.Supporting the latest versions of PHP is important to us and to you. Long before IonCube released their initial loaders and encoder with PHP 7.1 support, we had been testing WHMCS under PHP 7.1 internally and making sure our product was compatible. In September when IonCube first released their Encoder and Loader products with support for PHP 7.1, we quickly realized there were differences with how previous encoder / loaders work and these differences caused challenges to the automated upgrade process we strive to provide within WHMCS. Specifically files that were encoded for PHP 5.6 and 7.0 could not be read in PHP 7.1; while files encoded for PHP 7.1 could not be read in earlier versions. Despite the WHMCS codebase being PHP 7.1 ready, the tooling and target environments weren't.This would have prevented us from providing the seamless automatic experience we have so far delivered within the WHMCS 7 series. We made the choice not to release multiple builds that might confuse customers and wouldn't work with our automatic updater and instead we began investigating and prototyping ways to provide the most seamless end user experience to bridge the gap, and have been developing and evaluating a number of possible solutions. At the same time we contacted IonCube and they agreed an alternative solution would be preferable. However, they couldn't provide a firm commitment on if or when any changes could be expected. So, we had to explore more complex alternatives, ones that would deliver the environment support and the quality experience you expect from us. These prototypes ranged from a version of WHMCS with double encodings and proxy entry points to complex update mirrors and environment logic to alternating version schemas for different encodings.Last week IonCube contacted us with a beta edition of Encoder and Loader 10.1. Using these products, multiple PHP environment support can be achieved with far less complexity in WHMCS, our build systems, and our update infrastructure. We've already used it to produce alpha builds of WHMCS 7.5, validated those builds running on PHP 7.1 with the beta loaders and are confident it will allow us to provide a viable solution for all WHMCS customers.This bundled encoding is a welcome solution because it not only works for WHMCS, but for the whole PHP community. It reduces the efforts required to maintain up to date environments and software with the least impact on production systems. The downside is the IonCube Loader v10.1 is required.In an effort to mitigate this downside, we've had ongoing discussions with our partner cPanel. They are ready to move quickly and prioritize providing the new 10.1.0 loaders via EasyApache 4 as soon as IonCube releases them for general availability.Some customers have asked us about PHP's release cycle and a resulting warning displayed in the WHMCS System Health Status report. The intent of this systematic warning is to encourage planning for environment maintenance. Since PHP 7.0 will be receiving security patches up to December 2018 you should have adequate time to update both your environment and WHMCS.WHMCS v7.4.2 will be out next month. With that release and the IonCube Loader 10.1 expected shortly, you'll be all set for WHMCS v7.5. Stay tuned to the blog for more v7.5 feature announcements and release news!
  14. 3 points
    thank you all for the reception. Hello, my name is Jarlles, I have a host company in Brazil for 6 years. And I am here in this forum, to help also in developing the best system for host company: WHMCS. Thank you!
  15. 2 points
    With the help from support team, it has been fixed, it looks like a number of extensions were missing from the php 7.1/7.2 branch, I have installed them now. All looking good so far Thanks to all for your input, much appreciated 👍
  16. 2 points
    there won't be a way from the settings, so you'll be left with a one line template edit (basically {if $addon.id neq 'x'} inside the first foreach loop - add closing if) or as a hook... <?php /** * Prevent ordering of specific product addons for existing products * @author brian! */ use Illuminate\Database\Capsule\Manager as Capsule; function cart_prevent_ordering_of_product_addons($vars) { $blocked = [1,9,10]; if ($vars['templatefile']=='addons'){ $addons = $vars['addons']; foreach ($addons as $key => $addon) { if (in_array($addon['id'],$blocked)) { unset($addons[$key]); } } $addons = array_values($addons); return array("addons" => $addons); } } add_hook("ClientAreaPageCart", 1, "cart_prevent_ordering_of_product_addons"); in the above hook example, $blocked is an array of addon IDs that you don't want to let clients add to existing products... addons purchased through the cart via configureproduct won't be affected by this hook.
  17. 2 points
    EWAY have confirmed they will be rolling out a fix tomorrow morning. Not sure on the timing thou. Basically, they screwed up and are going to fix.
  18. 2 points
    this is an unhelpful comment, but it should work! anything in the activity log ? if you have to, you could always use... {$total|replace:'$':''}
  19. 2 points
    @sitesme if you need it as a hook file here it is <?php # Fix Six Template's Content Area add_hook("ClientAreaHeadOutput", 1, function($vars){ return '<style type="text/css">.main-content {min-height: 600px;}</style>'; }); create new php file inside /includes/hooks/ directory called "FixSixTemplateContentArea.php" or anything else as you prefer and place the previous code inside it, now you can forget about fixing this issue again
  20. 2 points
    Hello everyone! We are thrilled to welcome you to this unique meeting space dedicated to absolutely everyone who holds the interest in our ready-made modules and bespoke software gear for WHMCS! The club is open for visiting to all, but we wholeheartedly invite you to join the membership since it will allow you to actively participate in the discussions and will additionally open the door to a whole range of exclusive features. The bigger the group, the more attractions in store for the future! As soon as the club brings together its first 50 members, we will release a truly rare 50% discount on all modules available in our Marketplace. Let the ride begin!
  21. 2 points
    Hello, We have posted a further update on our blog and over in the news and announcements forum - Nate
  22. 2 points
    I finally got to the bottom of this. My environment uses different php.ini files depending on whether php is run from Apache or from CLI. WHMCS uses the php.ini file used by Apache. However, phpmailer (included with WHMCS) apparently uses the php.ini file used when php is run from CLI. When I change the max memory in the php.ini file that the CLI environment uses then phpmailer uses that memory limit. You can check the php.ini file used by CLI by running the following command php --ini
  23. 2 points
    Today, we're pleased to announce Lara v7.2, which is fully compatible with WHMCS v7.2.1 released hours ago! Here's a quick overview of the latest version : Want to change the default WHMCS Admin Template "i.e., Blend" ?! .. Welcome to Lara! Lara, is WHMCS & AdminLTE blended together, resulting in a beautiful WHMCS Admin Theme, that can be used on daily basis, without hurting your eyes! New in version 7.x - (For WHMCS v7.x Only) : New Dashboard: Based on the amazing dashboard, introduced in WHMCS v7.1, with tons of features : Fully customizable interface, with the ability to move, close and resize widgets according to your needs. Smart responsive layout, where the number of widgets per row will change according to your screen size ( 1 widget/row on smartphones, 2 widgets/row on tablets and finally, up-to 4 widgets/row on large screens). [*]Google Analytics Widget: Updated to the latest version, which includes : WHMCS orders/income integration: Now, see a combined graph, with analytics data and WHMCS orders/income. Express Mode: Connect your WHMCS with your Google Analytics in less than 30 seconds, without the need to create your own Google APP. Faster loading times: Combined all required script and css files into 2 files only! [*]Staff Chat Widget: Now supports multilingual and comes with a sound notification for new messages. [*]New Permissions Interface: Control all of the theme settings from one page, including admin groups permissions. [*]Custom Logo: Without the need to edit any files, easily customize the logo of your WHMCS admin interface. [*]Fixed Layout: Allowing the page contents to scroll while the side menus are fixed. [*]Faster Loading Times: Thanks to the new combined assets system, loading time has decreased dramatically! The theme comes with tons of other options, beside the good looks : Compatible with the latest WHMCS, including the latest V6.3.1 & v7.x Menu Search, The Only WHMCS Admin Theme with search in menu, for easy access to all WHMCS options. Intelligent Search, Search in WHMCS by (ticket number, invoice number, customer name, city .. etc). Menu Notifications, Detailed notifications ( number of open tickets, pending invoices .. etc.) shown directly in WHMCS menu. Home Page Widgets, Beautiful home page widgets, using moris.js chart engine. Right Side Bar, Providing easy access to “Advanced Search, Ticket Search, in-ticket menu and built in browser links. User Menu, Custom user menu, with quick links and notifications area. Full Source Code, 100% source code provided. No encoded/encrypted files. Updates & Support, 12 Months of Free updates and support. Including new features, bug fixes and WHMCS Updates. Dashboard Customization, Choose what to see on your dashboard. Hide/Show homepage widgets. 12 Different Skins, Enjoy 12 color-full skins for every taste, with a click of a button! Intelligent Search, Intelligent search as you’ve never seen before, with optional search as you type “Quick Search”. Custom CSS & Javascript, Easily apply your custom modifications without the need to edit the theme files directly. Gravatar integration, Each admin will have his/her own gravatar icon. Google Analytics Widget : Without leaving your WHMCS admin area, check user sessions, countries, operating systems and other Google Analytics metrics. [ Free addon for Limited Time Only ] Staff Chat Widget, Staff members can easily chat with each other, directly from within WHMCS admin interface. [ Free addon for Limited Time Only ] Support Tickets Count : Better algorithm for counting tickets, and including the numbers on every page. Get the theme now for only $14.99 .. That's a 40% discounted price ! .. Act quickly, as THIS OFFER IS LIMITED. Need a discount ?! .. No problem, simply tweet, like or share Lara using the the buttons on the checkout page and you'll join our Fan Club!. By doing so, a 15% discount will be instantly applied to your purchase.
  24. 2 points
    technically, I don't think you need to make an order... yes, doing it on the admin side, you do because, as you say, it's the only method available there... but looking on a live WHMCS installation (not a dev), I can see a whole list of domains in tbldomains with orderid = 0 and no relating order... yet all those domains are invoicing/renewing/manageable without issues. thinking back to over four years ago, i'm pretty sure they were added via an import script supplied by WHMCS Support... I must have imported them from the old billing software we were using back then... yes that's ringing bells... so it was the import script that must have imported them directly into tbldomains and bypassed tblorders. untried, but i'm fairly sure that if you just added a domain straight into tbldomains, it would work fine... I must remember to try that on a dev sometime.
  25. 2 points
    ye of little faith - this is not the WHMCS Feature Requests Dept where you can wait for years and still not see any end result - I said that I was would try to take a look at it on Sunday and I did! so I am now in a position to answer your important questions on this... Q. Can it be done without access to core WHMCS files? A. Yes. Q. Is it perfect and bug-free? A. Not yet. take a look at the video below as to what it can do so far - probably better viewed full screen with captions on... so I won't embed the video here... https://youtu.be/wlGWi3clXcY first let me tell you about the good points before I move on to the current issues... I can create relationships between radio, checkboxes, text boxes and even sliders... I just need to figure out dropdowns and then that's the complete set! any radio or checkbox can manipulate any other (or multiple) radio/checkbox/text/sliders - certainly the radio/checkbox link that you originally asked about works, but I thought i'd take a look at the other options... working on the theory that someone will ask about them! all options auto-calculate the price correctly - you can't see it on the video when I move the sliders because I moved them back to the zero before the summary could update - what an idiot! - but they do work! so to the issues... 1. it doesn't currently work with "standard_cart" - I know why it doesn't, so i'm trying to figure out if there is a way to code around it or whether i'll need to write another version that works with standard_cart... you can't believe the time I wasted on Sunday looking at perfectly good code and wondering why it wasn't working! *sighs* it works with Modern (as shown in the video), probably most custom carts not based on SC and would even work on v5 I suspect - it can also be used on any WHMCS v6 page outside of the cart too... there's nothing really specific to WHMCS about the code, so it would work outside of WHMCS (though that bit I knew already). 2. changing the billingcycle loses the relationships - that's annoying... oh I hate jquery coding! 3. there's an issue with disabled sliders still passing on their values - though that should be easier to fix... disabled radio values aren't passed, but still a lot of test ordering to do before its finished. 4. there's also a problem with default radio values - but there's a simple solution to that though. the changes required so far are just a handful of edits to the configureproduct.tpl template and adding the js code... now that I understand the relationships, I can see that the .js code could be written as a hook and there might be a away to make an addon out of it (e.g some visual way for newbies to link the options)... though whether I would want to do that would depend on if I can iron out the wrinkles, or find a collaborator who's more knowledgeable at jquery... worst case, i'd write what I know as a tutorial and leave others to solve the issues! that will probably wait until v6.3 has had its full release - with WHMCS making changes to the orderforms (though nothing in the release notes yet), i'd be reluctant to release anything public until tested on v6.3 - i'm not going to get the chance to install the RC until at least next week, and I might leave it until the full release anyway. so, all being well, I'll try to work on this further on Sunday.
×

Important Information

By using this site, you agree to our Terms of Use & Guidelines