Przeglądaj źródła

Merge branch 'nextcloud' of andre/whmcsZimbraSingle into master

andre 4 lat temu
rodzic
commit
0d6bb0d1fe

+ 0 - 122
templates/checkconfigureproduct.tpl

@@ -1,122 +0,0 @@
-<script>
-    function checkMailAddress ( mailname, maildomain, pid) {
-        var xhttp = new XMLHttpRequest();
-        xhttp.onreadystatechange = function() {
-            if (this.readyState == 4 && this.status == 200) {
-                if( this.responseText.trim() == 'yes') {
-                    console.log(this.responseText);
-                    $(customFields[4]).prop("disabled",false);
-                    $(customFields[5]).prop("disabled",true);
-                    $(customFields[2]).addClass('has-success');
-                    $(customFields[2]).css('background-color', '#0f03');;
-                    $("#hintHead").text('');
-                    $("#hintLength").text('');
-                    $("#hintNumeric").text('');
-                    $("#hintSymbols").text('');
-                    $("#hintUpperLower").text('');
-                } else {
-                    console.log(this.responseText);
-                    $(customFields[4]).prop("disabled",true);
-                    $(customFields[5]).prop("disabled",true);
-                    $(customFields[2]).addClass('has-error');
-                    $(customFields[2]).css('background-color', '#f003');;
-                    $("#hintHead").text('Mailadresse ' + $(customFields[2]).val() + '@' + $(customFields[3]).val() + ' nicht verfügbar!');
-                    $("#hintLength").text('');
-                    $("#hintNumeric").text('');
-                    $("#hintSymbols").text('');
-                    $("#hintUpperLower").text('');
-                }
-            }
-        };
-        xhttp.open("GET", "modules/servers/zimbraSingle/zimbraAddressAvailable.php?name=" + mailname + '&domain=' + maildomain + '&pid=' + pid, true);
-        xhttp.send();
-    };
-    jQuery(document).ready(function(){
-        $("#btnCompleteProductConfig").prop("disabled",true);
-        customFields = $("*[id^='customfield']");
-        $(customFields[4]).prop("disabled",true);
-        $(customFields[5]).prop("disabled",true);
-        $(customFields[2]).blur(function () {
-            checkMailAddress( $(customFields[2]).val(), $(customFields[3]).val(), {$productinfo['pid']});
-        });
-        $(customFields[3]).change(function () {
-            checkMailAddress( $(customFields[2]).val(), $(customFields[3]).val(), {$productinfo['pid']});
-        });
-        $(customFields[4]).focus (function () {
-            $("#hintHead").text('Tipps für ein gutes Passwort');
-            $("#hintLength").text('Benutzen Sie mindestens 8 Zeichen');
-            $("#hintNumeric").text('Benutzen Sie mindestens eine Zahl');
-            $("#hintSymbols").text('Benutzen Sie auch mindestens eines der folgenden Symbole (# $ ! % + - etc...)');
-            $("#hintUpperLower").text('Benutzen Sie Groß- und Kleinschreibung');
-        });
-        $(customFields[4]).keyup(function () {
-            var pwlengthOK = false;
-            var numericOK = false;
-            var symbolsOK = false;
-            var upperOK = false;
-            var pw = $(customFields[4]).val();
-            var pwlength = (pw.length);
-            if (pwlength > 7) {
-                pwlengthOK = true;
-                $("#hintLength").text('');
-            } else {
-                pwlengthOK = false;
-                $("#hintLength").text('Benutzen Sie mindestens 8 Zeichen');
-            }
-            var numeric = pw.replace(/[0-9]/g, "");
-            var numnumeric = (pw.length - numeric.length);
-            if (numnumeric > 0) {
-                numericOK = true;
-                $("#hintNumeric").text('');
-            } else {
-                numericOK = false;
-                $("#hintNumeric").text('Benutzen Sie mindestens eine Zahl');
-            }
-            var symbols = pw.replace(/\W/g, "");
-            var numsymbols = (pw.length - symbols.length);
-            if (numsymbols > 0) {
-                symbolsOK = true;
-                $("#hintSymbols").text('');
-            } else {
-                symbolsOK = false;
-                $("#hintSymbols").text('Benutzen Sie auch mindestens ein Symbol oder Sonderzeichen (# $ ! % & + - etc...)');
-            }
-            var upper = pw.replace(/[A-Z]/g, "");
-            var numupper = (pw.length - upper.length);
-            var lower = pw.replace(/[a-z]/g, "");
-            var numlower = (pw.length - lower.length);
-            if ((numupper > 0) && (numlower > 0)) {
-                upperlowerOK = true;
-                $("#hintUpperLower").text('');
-            } else {
-                upperlowerOK = false;
-                $("#hintUpperLower").text('Benutzen Sie Groß- und Kleinschreibung');
-            }
-            $(customFields[4]).removeClass('has-error has-warning has-success');
-            if (pwlengthOK && numericOK && symbolsOK && upperlowerOK) {
-                $(customFields[5]).prop("disabled",false);
-                $(customFields[4]).addClass('has-success');
-                $(customFields[4]).css('background-color', '#0f03');;
-                $("#hintHead").text('');
-            } else {
-                $(customFields[5]).prop("disabled",true);
-                $(customFields[4]).addClass('has-error');
-                $(customFields[4]).css('background-color', '#f003');;
-                $("#hintHead").text('Tipps für ein gutes Passwort');
-            }
-        });
-        $(customFields[5]).keyup(function () {
-            if ($(customFields[5]).val() == $(customFields[4]).val()) {
-                $("#btnCompleteProductConfig").prop("disabled",false);
-                $(customFields[5]).addClass('has-success');
-                $(customFields[5]).css('background-color', '#0f03');;
-                $("#hintHead").text('');
-            } else {
-                $("#btnCompleteProductConfig").prop("disabled",true);
-                $(customFields[5]).addClass('has-error');
-                $(customFields[5]).css('background-color', '#f003');;
-                $("#hintHead").text('Passworte stimmen nicht überein!');
-            }
-        });
-    });
-</script>

+ 139 - 108
templates/clientarea.tpl

@@ -46,9 +46,13 @@
               <div class="product-holder product-status-{$rawstatus|strtolower}">
                 <div class="product-content">
                   <div class="product-image">
-    								<div class="feature-icon">
-											<img src="https://portal.thurdata.ch/templates/croster/assets/images/zimbra-only-logo.svg" class="img-fluid">
-										</div>
+                    <div class="feature-icon">
+                      {if $moduleParams.configoption3 == 'on'}
+                        <img src="https://portal.thurdata.ch/templates/croster/assets/images/zimbra-nextcloud-logo4.svg" class="img-fluid">
+                      {else}
+                        <img src="https://portal.thurdata.ch/templates/croster/assets/images/zimbra-only-logo.svg" class="img-fluid">
+                      {/if}
+                    </div>
                   </div>
                   <h4><small>{$groupname}</small> - {$product}</h4>
                   <div class="status-sticker-wrapper">
@@ -183,17 +187,12 @@
                                 <td align='left'>E-Mail Speicher gesamt</td>
                                 <td align="left">{$userquota} GB</td>
                               </tr>
+                              {if $moduleParams.configoption3 == 'on'}
                               <tr>
-                                <td align='left'>Webmail</td>
-                                <td align="left"><a href="{$webmailurl}" target="_blank">{$webmailurl}</a></td>
-                              </tr>
-                              <tr>
-                                <td colspan=2 align='center'>
-                                  <a href="{$systemurl}clientarea.php?action=productdetails&id={$serviceid}&dosinglesignon=1" class="btn btn-primary" target=_blank color="white">
-                                    <i class="fas fa-sign-in fa-fw"></i> Login to Zimbra
-                                  </a>
-                                </td>
+                                <td align='left'>NextCloud Speicher</td>
+                                <td align="left">{$userquota * 2} GB</a></td>
                               </tr>
+                              {/if}
                             </table>
                           </td>
                         </tr>
@@ -208,6 +207,41 @@
                   {if $customfields}
                     <div class="tab-pane fade{if !$domain && !$moduleclientarea && !$configurableoptions && !$metricStats} show active{/if}" role="tabpanel" id="additionalinfo">
                       <table width="100%" cellspacing="0" cellpadding="0" class="frame">
+                        <tr>
+                          <td align='left'>Webmail URL</td>
+                          <td align="left"><a href="{$webmailurl}" target="_blank">{$webmailurl}</a></td>
+                        </tr>
+                        {if $moduleParams.configoption3 == 'on'}
+                        <tr>
+                          <td align='left'>NextCloud URL</td>
+                          <td align="left"><a href="{$moduleParams.configoption4}" target="_blank">{$moduleParams.configoption4}</a></td>
+                        </tr>
+                        {/if}
+                        <tr>
+                          <td>
+                          </td>
+                          <td>
+                            <a style="margin-top:1em;" href="{$systemurl}clientarea.php?action=productdetails&id={$serviceid}&dosinglesignon=1" class="btn btn-primary" target=_blank color="white">
+                              <i class="fas fa-sign-in fa-fw"></i> Mailbox Login
+                            </a>
+                          </td>
+                        </tr>
+                        <tr>
+                          <td colspan=2 align='left'>
+                            <hr>
+                          </td>
+                        </tr>
+                        <tr><td colspan=2 align='center'>
+                        <img style="margin-left:3em;margin-right:3em;" width="64" alt="Outlook hi-res icon (2019)" src="https://upload.wikimedia.org/wikipedia/commons/thumb/b/b1/Outlook_hi-res_icon_%282019%29.svg/64px-Outlook_hi-res_icon_%282019%29.svg.png">
+                        <img style="margin-left:3em;margin-right:3em;" width="64" alt="Mozilla Thunderbird logo" src="https://upload.wikimedia.org/wikipedia/commons/f/f7/Mozilla_Thunderbird_logo.png">
+                        <img style="margin-left:3em;margin-right:3em;" width="64" alt="Mail (iOS)" src="https://upload.wikimedia.org/wikipedia/commons/thumb/4/4e/Mail_%28iOS%29.svg/64px-Mail_%28iOS%29.svg.png">
+                        <img style="margin-left:3em;margin-right:3em;" width="64" alt="Logo Gmail (2015-2020)" src="https://upload.wikimedia.org/wikipedia/commons/thumb/0/0b/Logo_Gmail_%282015-2020%29.svg/64px-Logo_Gmail_%282015-2020%29.svg.png">
+                        </td></tr>
+                        <tr>
+                          <td colspan=2 align='left'>
+                            <hr>
+                          </td>
+                        </tr>
                         <tr>
                           <td colspan=2 align='left'>
                             <h6 class="heading">Integrieren Sie Ihr Postfach auf Ihr Mobiltelefon oder Ihren PC</h6>
@@ -224,108 +258,102 @@
                           </td>
                         </tr>
                         <tr>
-                          <td>
-                            <table width="100%" border="0" cellpadding="10" cellspacing="0" class="table table-striped table-framed">
-                              <tr>
-                                <td colspan=2 align='left'>
-                                  <h6 class="heading">Exchange ActivSync</h6>
-                                </td>
-                              </tr>
-                              <tr>
-                                <td align='left'>Exchange Server</td>
-                                <td align="left">{$zimbraserver}</td>
-                              </tr>
-                              <tr>
-                                <td align='left'>Sicherheit</td>
-                                <td align="left">SSL/TLS</td>
-                              </tr>
-                              <tr>
-                                <td colspan=2 align='left'>
-                                  <hr>
-                                </td>
-                              </tr>
-                              <tr>
-                                <td colspan=2 align='left'>
-                                  <h6 class="heading">IMAP4</h6>
-                                </td>
-                              </tr>
-                              <tr>
-                                <td align='left'>Server Name</td>
-                                <td align="left">{$zimbraserver}</td>
-                              </tr>
-                              <tr>
-                                <td align='left'>Server Type</td>
-                                <td align="left">IMAP</td>
-                              </tr>
-                              <tr>
-                                <td align='left'>Server Port</td>
-                                <td align="left">993</td>
-                              </tr>
-                              <tr>
-                                <td align='left'>Sicherheit</td>
-                                <td align="left">SSL/TLS</td>
-                              </tr>
-                              <tr>
-                                <td colspan=2 align='left'>
-                                  <hr>
-                                </td>
-                              </tr>
-                              <tr>
-                                <td colspan=2 align='left'>
-                                  <h6 class="heading">POP3</h6>
-                                </td>
-                              </tr>
-                              <tr>
-                                <td align='left'>Server Name</td>
-                                <td align="left">{$zimbraserver}</td>
-                              </tr>
-                              <tr>
-                                <td align='left'>Server Type</td>
-                                <td align="left">POP3</td>
-                              </tr>
-                              <tr>
-                                <td align='left'>Server Port</td>
-                                <td align="left">995</td>
-                              </tr>
-                              <tr>
-                                <td align='left'>Sicherheit</td>
-                                <td align="left">SSL/TLS</td>
-                              </tr>
-                              <tr>
-                                <td colspan=2 align='left'>
-                                  <hr>
-                                </td>
-                              </tr>
-                              <tr>
-                                <td colspan=2 align='left'>
-                                  <h6 class="heading">SMTP</h6>
-                                </td>
-                              </tr>
-                              <tr>
-                                <td align='left'>Server Name</td>
-                                <td align="left">{$zimbraserver}</td>
-                              </tr>
-                              <tr>
-                                <td align='left'>Server Type</td>
-                                <td align="left">SMTP</td>
-                              </tr>
-                              <tr>
-                                <td align='left'>Server Port</td>
-                                <td align="left">25</td>
-                              </tr>
-                              <tr>
-                                <td align='left'>Sicherheit</td>
-                                <td align="left">STARTTLS</td>
-                              </tr>
-                            </table>
+                          <td colspan=2 align='left'>
+                            <h6 class="heading">Exchange ActivSync</h6>
+                          </td>
+                        </tr>
+                        <tr>
+                          <td align='left'>Exchange Server</td>
+                          <td align="left">{$zimbraserver}</td>
+                        </tr>
+                        <tr>
+                          <td align='left'>Sicherheit</td>
+                          <td align="left">SSL/TLS</td>
+                        </tr>
+                        <tr>
+                          <td colspan=2 align='left'>
+                            <hr>
+                          </td>
+                        </tr>
+                        <tr>
+                          <td colspan=2 align='left'>
+                            <h6 class="heading">IMAP4</h6>
+                          </td>
+                        </tr>
+                        <tr>
+                          <td align='left'>Server Name</td>
+                          <td align="left">{$zimbraserver}</td>
+                        </tr>
+                        <tr>
+                          <td align='left'>Server Type</td>
+                          <td align="left">IMAP</td>
+                        </tr>
+                        <tr>
+                          <td align='left'>Server Port</td>
+                          <td align="left">993</td>
+                        </tr>
+                        <tr>
+                          <td align='left'>Sicherheit</td>
+                          <td align="left">SSL/TLS</td>
+                        </tr>
+                        <tr>
+                          <td colspan=2 align='left'>
+                            <hr>
+                          </td>
+                        </tr>
+                        <tr>
+                          <td colspan=2 align='left'>
+                            <h6 class="heading">POP3</h6>
                           </td>
                         </tr>
+                        <tr>
+                          <td align='left'>Server Name</td>
+                          <td align="left">{$zimbraserver}</td>
+                        </tr>
+                        <tr>
+                          <td align='left'>Server Type</td>
+                          <td align="left">POP3</td>
+                        </tr>
+                        <tr>
+                          <td align='left'>Server Port</td>
+                          <td align="left">995</td>
+                        </tr>
+                        <tr>
+                          <td align='left'>Sicherheit</td>
+                          <td align="left">SSL/TLS</td>
+                        </tr>
+                        <tr>
+                          <td colspan=2 align='left'>
+                            <hr>
+                          </td>
+                        </tr>
+                        <tr>
+                          <td colspan=2 align='left'>
+                            <h6 class="heading">SMTP</h6>
+                          </td>
+                        </tr>
+                        <tr>
+                          <td align='left'>Server Name</td>
+                          <td align="left">{$zimbraserver}</td>
+                        </tr>
+                        <tr>
+                          <td align='left'>Server Type</td>
+                          <td align="left">SMTP</td>
+                        </tr>
+                        <tr>
+                          <td align='left'>Server Port</td>
+                          <td align="left">25</td>
+                        </tr>
+                        <tr>
+                          <td align='left'>Sicherheit</td>
+                          <td align="left">STARTTLS</td>
+                        </tr>
                       </table>
                     </div>
                   {/if}
                   {if $lastupdate}
-                    <div class="tab-pane fade" role="tabpanel" id="resourceusage">
-                      <div class="col-sm-10 offset-sm-1">
+                    <div class="tab-pane fade" role="tabpanel" id="resourceusage" align="center">
+                      <div class="col-sm-10">
                         <div class="col-sm-6">
                           <h4>{lang key='diskSpace'}</h4>
                           <input type="text" value="{$diskpercent|substr:0:-1}" class="dial-usage" data-width="100" data-height="100" data-min="0" data-readOnly="true" />
@@ -345,6 +373,9 @@
                           });
                         });
                       </script>
+                      <div class="col-xs-{if $showcancelbutton}6{else}12{/if}">
+                        <a href="upgrade.php?type=configoptions&amp;id={$id}" class="btn btn-block btn-primary">Weiteren Speicher hinzubuchen</a>
+                      </div>
                     </div>
                   {/if}
                 </div>

+ 0 - 455
templates/configureproduct.tpl

@@ -1,455 +0,0 @@
-{include file="orderforms/{$carttpl}/common.tpl"}
-
-<script>
-var _localLang = {
-    'addToCart': '{$LANG.orderForm.addToCart|escape}',
-    'addedToCartRemove': '{$LANG.orderForm.addedToCartRemove|escape}'
-}
-</script>
-
-{if file_exists("templates/orderforms/{$carttpl}/layouts/head.tpl")}
-	{include file="templates/orderforms/{$carttpl}/layouts/head.tpl"}
-{/if}
-
-<div id="order-standard_cart">
-
-    <div class="row">
-
-        <div class="col-md-12">
-			{if file_exists("templates/orderforms/{$carttpl}/layouts/head.tpl")}
-			{else}
-            <div class="header-lined">
-                <h1>{$LANG.orderconfigure}</h1>
-            </div>
-			{/if}
-			
-			{include file="orderforms/{$carttpl}/sidebar-categories-collapsed.tpl"}
-
-        </div>
-
-        <div class="col-md-12">
-
-            <form id="frmConfigureProduct">
-                <input type="hidden" name="configure" value="true" />
-                <input type="hidden" name="i" value="{$i}" />
-
-                <div class="row ajaxcart_cont">
-                    <div class="col-md-8 col-lg-9">
-
-                        <h3>{$LANG.orderForm.configureDesiredOptions}</h3>
-
-                        <div class="panel panel-default">
-							<div class="panel-body">
-								<p class="product-title"><strong><i>{$productinfo.group_name}</i> - {$productinfo.name}</strong></p>
-								<p>{$productinfo.description}</p>
-							</div>
-                        </div>
-
-                        <div class="alert alert-danger w-hidden" role="alert" id="containerProductValidationErrors">
-                            <p>{$LANG.orderForm.correctErrors}:</p>
-                            <ul id="containerProductValidationErrorsList"></ul>
-                        </div>
-
-                        {if $pricing.type eq "recurring"}
-                            <div class="field-container">
-                                <div class="form-group">
-                                    <label for="inputBillingcycle">{$LANG.cartchoosecycle}</label><br />
-                                    <select name="billingcycle" id="inputBillingcycle" class="form-control" onchange="{if $configurableoptions}updateConfigurableOptions({$i}, this.value);{else}recalctotals();{/if}">
-                                        {if $pricing.monthly}
-                                            <option value="monthly"{if $billingcycle eq "monthly"} selected{/if}>
-                                                {$pricing.monthly}
-                                            </option>
-                                        {/if}
-                                        {if $pricing.quarterly}
-                                            <option value="quarterly"{if $billingcycle eq "quarterly"} selected{/if}>
-                                                {$pricing.quarterly}
-                                            </option>
-                                        {/if}
-                                        {if $pricing.semiannually}
-                                            <option value="semiannually"{if $billingcycle eq "semiannually"} selected{/if}>
-                                                {$pricing.semiannually}
-                                            </option>
-                                        {/if}
-                                        {if $pricing.annually}
-                                            <option value="annually"{if $billingcycle eq "annually"} selected{/if}>
-                                                {$pricing.annually}
-                                            </option>
-                                        {/if}
-                                        {if $pricing.biennially}
-                                            <option value="biennially"{if $billingcycle eq "biennially"} selected{/if}>
-                                                {$pricing.biennially}
-                                            </option>
-                                        {/if}
-                                        {if $pricing.triennially}
-                                            <option value="triennially"{if $billingcycle eq "triennially"} selected{/if}>
-                                                {$pricing.triennially}
-                                            </option>
-                                        {/if}
-                                    </select>
-                                </div>
-                            </div>
-                        {/if}
-
-                        {if count($metrics) > 0}
-                            <div class="sub-heading">
-                                <span>{$LANG.metrics.title}</span>
-                            </div>
-
-                            <p>{$LANG.metrics.explanation}</p>
-
-                            <ul>
-                                {foreach $metrics as $metric}
-                                    <li>
-                                        {$metric.displayName}
-                                        -
-                                        {if count($metric.pricing) > 1}
-                                            {$LANG.metrics.startingFrom} {$metric.lowestPrice} / {if $metric.unitName}{$metric.unitName}{else}{$LANG.metrics.unit}{/if}
-                                            <button type="button" class="btn btn-default btn-sm" data-toggle="modal" data-target="#modalMetricPricing-{$metric.systemName}">
-                                                {$LANG.metrics.viewPricing}
-                                            </button>
-                                        {elseif count($metric.pricing) == 1}
-                                            {$metric.lowestPrice} / {if $metric.unitName}{$metric.unitName}{else}{$LANG.metrics.unit}{/if}
-                                            {if $metric.includedQuantity > 0} ({$metric.includedQuantity} {$LANG.metrics.includedNotCounted}){/if}
-                                        {/if}
-                                        {include file="$template/usagebillingpricing.tpl"}
-                                    </li>
-                                {/foreach}
-                            </ul>
-
-                            <br>
-                        {/if}
-
-                        {if $productinfo.type eq "server"}
-                            <div class="sub-heading">
-                                <span>{$LANG.cartconfigserver}</span>
-                            </div>
-
-                            <div class="field-container">
-
-                                <div class="row">
-                                    <div class="col-sm-6">
-                                        <div class="form-group">
-                                            <label for="inputHostname">{$LANG.serverhostname}</label>
-                                            <input type="text" name="hostname" class="form-control" id="inputHostname" value="{$server.hostname}" placeholder="servername.yourdomain.com">
-                                        </div>
-                                    </div>
-                                    <div class="col-sm-6">
-                                        <div class="form-group">
-                                            <label for="inputRootpw">{$LANG.serverrootpw}</label>
-                                            <input type="password" name="rootpw" class="form-control" id="inputRootpw" value="{$server.rootpw}">
-                                        </div>
-                                    </div>
-                                </div>
-
-                                <div class="row">
-                                    <div class="col-sm-6">
-                                        <div class="form-group">
-                                            <label for="inputNs1prefix">{$LANG.serverns1prefix}</label>
-                                            <input type="text" name="ns1prefix" class="form-control" id="inputNs1prefix" value="{$server.ns1prefix}" placeholder="ns1">
-                                        </div>
-                                    </div>
-                                    <div class="col-sm-6">
-                                        <div class="form-group">
-                                            <label for="inputNs2prefix">{$LANG.serverns2prefix}</label>
-                                            <input type="text" name="ns2prefix" class="form-control" id="inputNs2prefix" value="{$server.ns2prefix}" placeholder="ns2">
-                                        </div>
-                                    </div>
-                                </div>
-
-                            </div>
-                        {/if}
-
-                        {if $configurableoptions}
-                            <div class="sub-heading">
-                                <span>{$LANG.orderconfigpackage}</span>
-                            </div>
-                            <div class="product-configurable-options" id="productConfigurableOptions">
-                                <div class="row">
-                                    {foreach $configurableoptions as $num => $configoption}
-                                        {if $configoption.optiontype eq 1}
-                                            <div class="col-sm-12">
-                                                <div class="form-group">
-                                                    <label for="inputConfigOption{$configoption.id}">{$configoption.optionname}</label>
-                                                    <select name="configoption[{$configoption.id}]" id="inputConfigOption{$configoption.id}" class="form-control">
-                                                        {foreach key=num2 item=options from=$configoption.options}
-                                                            <option value="{$options.id}"{if $configoption.selectedvalue eq $options.id} selected="selected"{/if}>
-                                                                {$options.name}
-                                                            </option>
-                                                        {/foreach}
-                                                    </select>
-                                                </div>
-                                            </div>
-                                        {elseif $configoption.optiontype eq 2}
-                                            <div class="col-sm-12">
-                                                <div class="form-group">
-                                                    <label for="inputConfigOption{$configoption.id}">{$configoption.optionname}</label>
-                                                    {foreach key=num2 item=options from=$configoption.options}
-                                                        <br />
-                                                        <label>
-                                                            <input type="radio" name="configoption[{$configoption.id}]" value="{$options.id}"{if $configoption.selectedvalue eq $options.id} checked="checked"{/if} />
-                                                            {if $options.name}
-                                                                {$options.name}
-                                                            {else}
-                                                                {$LANG.enable}
-                                                            {/if}
-                                                        </label>
-                                                    {/foreach}
-                                                </div>
-                                            </div>
-                                        {elseif $configoption.optiontype eq 3}
-                                            <div class="col-sm-12">
-                                                <div class="form-group">
-                                                    <label for="inputConfigOption{$configoption.id}">{$configoption.optionname}</label>
-                                                    <br />
-                                                    <label>
-                                                        <input type="checkbox" name="configoption[{$configoption.id}]" id="inputConfigOption{$configoption.id}" value="1"{if $configoption.selectedqty} checked{/if} />
-                                                        {if $configoption.options.0.name}
-                                                            {$configoption.options.0.name}
-                                                        {else}
-                                                            {$LANG.enable}
-                                                        {/if}
-                                                    </label>
-                                                </div>
-                                            </div>
-                                        {elseif $configoption.optiontype eq 4}
-                                            <div class="col-sm-12">
-                                                <div class="form-group">
-                                                    <label for="inputConfigOption{$configoption.id}">{$configoption.optionname}</label>
-                                                    {if $configoption.qtymaximum}
-                                                        {if !$rangesliderincluded}
-                                                            <script type="text/javascript" src="{$BASE_PATH_JS}/ion.rangeSlider.min.js"></script>
-                                                            <link href="{$BASE_PATH_CSS}/ion.rangeSlider.css" rel="stylesheet">
-                                                            <link href="{$BASE_PATH_CSS}/ion.rangeSlider.skinModern.css" rel="stylesheet">
-                                                            {assign var='rangesliderincluded' value=true}
-                                                        {/if}
-                                                        <input type="text" name="configoption[{$configoption.id}]" value="{if $configoption.selectedqty}{$configoption.selectedqty}{else}{$configoption.qtyminimum}{/if}" id="inputConfigOption{$configoption.id}" class="form-control" />
-                                                        <script>
-                                                            var sliderTimeoutId = null;
-                                                            var sliderRangeDifference = {$configoption.qtymaximum} - {$configoption.qtyminimum};
-                                                            // The largest size that looks nice on most screens.
-                                                            var sliderStepThreshold = 25;
-                                                            // Check if there are too many to display individually.
-                                                            var setLargerMarkers = sliderRangeDifference > sliderStepThreshold;
-
-                                                            jQuery("#inputConfigOption{$configoption.id}").ionRangeSlider({
-                                                                min: {$configoption.qtyminimum},
-                                                                max: {$configoption.qtymaximum},
-                                                                grid: true,
-                                                                grid_snap: setLargerMarkers ? false : true,
-                                                                onChange: function() {
-                                                                    if (sliderTimeoutId) {
-                                                                        clearTimeout(sliderTimeoutId);
-                                                                    }
-
-                                                                    sliderTimeoutId = setTimeout(function() {
-                                                                        sliderTimeoutId = null;
-                                                                        recalctotals();
-                                                                    }, 250);
-                                                                }
-                                                            });
-                                                        </script>
-                                                    {else}
-                                                        <div>
-                                                            <input type="number" name="configoption[{$configoption.id}]" value="{if $configoption.selectedqty}{$configoption.selectedqty}{else}{$configoption.qtyminimum}{/if}" id="inputConfigOption{$configoption.id}" min="{$configoption.qtyminimum}" onchange="recalctotals()" onkeyup="recalctotals()" class="form-control form-control-qty" />
-                                                            <span class="form-control-static form-control-static-inline">
-                                                                x {$configoption.options.0.name}
-                                                            </span>
-                                                        </div>
-                                                    {/if}
-                                                </div>
-                                            </div>
-                                        {/if}
-                                        {if $num % 2 != 0}
-                                            </div>
-                                            <div class="row">
-                                        {/if}
-                                    {/foreach}
-                                </div>
-                            </div>
-
-                        {/if}
-
-                        {if $customfields}
-            			    {include file="./checkconfigureproduct.tpl"}
-                            <div class="sub-heading">
-                                <span>{$LANG.orderadditionalrequiredinfo}</span>
-                            </div>
-                            <div class="field-container">
-                            <table width="100%" border="0" cellpadding="10" cellspacing="0" class="table table-borderless">
-                              <tr>
-                                <td align='left'>
-                                    <div class="form-group">
-                                        <label for="customfield{$customfields[0].id}">{$customfields[0].name}</label>
-                                        {$customfields[0].input}
-                                        {if $customfields[0].description}
-                                            <span class="field-help-text">
-                                                {$customfields[0].description}
-                                            </span>
-                                        {/if}
-                                    </div>
-                                </td>
-                                <td></td>
-                                <td align='left'>
-                                    <div class="form-group">
-                                        <label for="customfield{$customfields[1].id}">{$customfields[1].name}</label>
-                                        {$customfields[1].input}
-                                        {if $customfields[1].description}
-                                            <span class="field-help-text">
-                                                {$customfields[1].description}
-                                            </span>
-                                        {/if}
-                                    </div>
-                                </td>
-                              </tr>
-                              <tr>
-                                <td align='left'>
-                                    <div class="form-group">
-                                        <label for="customfield{$customfields[2].id}">{$customfields[2].name}</label>
-                                        {$customfields[2].input}
-                                        {if $customfields[2].description}
-                                            <span class="field-help-text">
-                                                {$customfields[2].description}
-                                            </span>
-                                        {/if}
-                                    </div>
-                                </td>
-                                <td style="vertical-align:middle;margin:0;padding:0;">
-                                    <font size=+2px>@</font>
-                                </td>
-                                <td align='left'>
-                                    <div class="form-group">
-                                        <label for="customfield{$customfields[3].id}">{$customfields[3].name}</label>
-                                        {$customfields[3].input}
-                                        {if $customfields[3].description}
-                                            <span class="field-help-text">
-                                                {$customfields[3].description}
-                                            </span>
-                                        {/if}
-                                    </div>
-                                </td>
-                              </tr>
-                              <tr>
-                                <td align='left'>
-                                    <div class="form-group">
-                                        <label for="customfield{$customfields[4].id}">{$customfields[4].name}</label>
-                                        {$customfields[4].input}
-                                        {if $customfields[4].description}
-                                            <span class="field-help-text">
-                                                {$customfields[4].description}
-                                            </span>
-                                        {/if}
-                                    </div>
-                                </td>
-                                <td></td>
-                                <td align='left'>
-                                    <div class="form-group">
-                                        <label for="customfield{$customfields[5].id}">{$customfields[5].name}</label>
-                                        {$customfields[5].input}
-                                        {if $customfields[5].description}
-                                            <span class="field-help-text">
-                                                {$customfields[5].description}
-                                            </span>
-                                        {/if}
-                                    </div>
-                                </td>
-                              </tr>
-                            </table>
-                            </div>
-                            <div class="alert alert-info">
-                                <div id='hints'>
-                                    <strong id='hintHead'></strong>
-                                    <div id='hintLength'></div>
-                                    <div id='hintNumeric'></div>
-                                    <div id='hintSymbols'></div>
-                                    <div id='hintUpperLower'></div>
-                                </div>
-                            </div>
-                        {/if}
-
-                        {if $addons || count($addonsPromoOutput) > 0}
-
-                            <div class="sub-heading">
-                                <span>{$LANG.cartavailableaddons}</span>
-                            </div>
-
-                            {foreach $addonsPromoOutput as $output}
-                                <div>
-                                    {$output}
-                                </div>
-                            {/foreach}
-							
-							
-                            <div class="row addon-products">
-                                {foreach $addons as $addon}
-                                    <div class="col-sm-{if count($addons) > 1}6{else}12{/if}"">
-                                        <div class="panel panel-default panel-addon{if $addon.status} panel-addon-selected{/if}">
-                                            <div class="panel-body">
-                                               <input type="checkbox" name="addons[{$addon.id}]"{if $addon.status} checked{/if} />
-                                                <span class="panel-addon-name">{$addon.name}</span>
-												<span class="panel-addon-price">{$addon.pricing}</span>
-                                                <p class="text-muted">{$addon.description}</p>
-                                            </div>
-                                        </div>
-                                    </div>
-                                {/foreach}
-                            </div>
-
-                        {/if}
-
-                        <div class="alert alert-warning text-center">
-                            <i class="fas fa-question-circle"></i>
-                            {$LANG.orderForm.haveQuestionsContact} <a href="contact.php" target="_blank" class="alert-link">{$LANG.orderForm.haveQuestionsClickHere}</a>
-                        </div>
-
-                    </div>
-                    <div class="col-md-4 col-lg-3">
-						<div  id="sidebar">
-							<div class="sidebar__inner blocks cartsummary">
-								<div>
-									<div class="order-summary">
-										<div class="loader" id="orderSummaryLoader">
-											<i class="fas fa-fw fa-sync fa-spin"></i>
-										</div>
-										<h2>{$LANG.ordersummary}</h2>
-										<div class="summary-container" id="producttotal"></div>
-									</div>
-									<div class="text-center">
-										 <button type="submit" id="btnCompleteProductConfig" class="btn btn-primary btn-lg">
-											{$LANG.continue}
-											<i class="fas fa-arrow-circle-right"></i>
-										</button>
-									</div>
-								</div>
-							</div>
-						</div>
-                    </div>
-
-                </div>
-
-            </form>
-        </div>
-    </div>
-</div>
-
-{if file_exists("templates/orderforms/{$carttpl}/layouts/foot.tpl")}
-	{include file="templates/orderforms/{$carttpl}/layouts/foot.tpl"}
-{/if}
-
-
-<script language="javascript">
-	recalctotals();
-</script>
-
-
-<script type="text/javascript" src="{$WEB_ROOT}/templates/orderforms/{$carttpl}/js/ResizeSensor.js"></script>
-<script type="text/javascript" src="{$WEB_ROOT}/templates/orderforms/{$carttpl}/js/jquery.sticky-sidebar.min.js"></script>
-
-<script>
-    jQuery('#sidebar').stickySidebar({
-        topSpacing: 60,
-        bottomSpacing: 60,
-        minWidth: 992,
-        containerSelector: '.ajaxcart_cont',
-        innerWrapperSelector: '.sidebar__inner'
-    });
-</script>

+ 0 - 173
templates/upgrademailhosting.tpl

@@ -1,173 +0,0 @@
-{*
- **********************************************************
- * Developed by: Team Theme Metro
- * Website: http://www.thememetro.com
- **********************************************************
-*}
-
-{if $overdueinvoice}
-    {include file="$template/includes/alert.tpl" type="warning" msg=$LANG.upgradeerroroverdueinvoice}
-{elseif $existingupgradeinvoice}
-    {include file="$template/includes/alert.tpl" type="warning" msg=$LANG.upgradeexistingupgradeinvoice}
-{elseif $upgradenotavailable}
-    {include file="$template/includes/alert.tpl" type="warning" msg=$LANG.upgradeNotPossible textcenter=true}
-{/if}
-
-{if $overdueinvoice}
-
-
-
-{elseif $existingupgradeinvoice}
-
-    <p>
-        <a href="submitticket.php" class="btn btn-default btn-lg">{$LANG.submitticketdescription}</a>
-    </p>
-
-{elseif $upgradenotavailable}
-
-    <p>
-        <a href="submitticket.php" class="btn btn-default btn-lg">{$LANG.submitticketdescription}</a>
-    </p>
-
-{else}
-    {if $type eq "package"}
-		<div class="section">
-			<div class="section-header">
-				<h4>{$LANG.upgradecurrentconfig}:</h4>
-			</div>
-			<div class="section-body">
-				<div class="panel panel-default">
-					<div class="panel-body">
-						<strong>{$groupname} - {$productname}</strong> {if $domain} ({$domain}){/if}
-					</div>
-				</div>
-			</div>
-		</div>
-		
-		<div class="section">
-			<div class="section-header">
-				<h4>{$LANG.upgradenewconfig}:</h4>
-				<p class="desc">{$LANG.upgradechoosepackage}</p>
-			</div>
-			<div class="section-body">
-				<div class="row row-eq-height">
-					{foreach key=num item=upgradepackage from=$upgradepackages}
-						<div class="col-lg-4 mb-4">
-						<form method="post" action="{$smarty.server.PHP_SELF}">
-							<input type="hidden" name="step" value="2">
-							<input type="hidden" name="type" value="{$type}">
-							<input type="hidden" name="id" value="{$id}">
-							<input type="hidden" name="pid" value="{$upgradepackage.pid}">
-							<div class="card h-100">
-								<div class="card-body">
-									<h4 class="product-name mt-0">{$upgradepackage.groupname} - {$upgradepackage.name}</h4>
-										
-									<div class="product-content">
-										<ul class="product-features list-unstyled">
-											<li>
-												{$upgradepackage.description|replace:"<br/>":"</li>"}
-											</li>
-										</ul>
-									</div>
-								</div>
-								<div class="card-footer">
-									<div class="form-group">
-										{if $upgradepackage.pricing.type eq "free"}
-											{$LANG.orderfree}<br />
-											<input type="hidden" name="billingcycle" value="free">
-											{elseif $upgradepackage.pricing.type eq "onetime"}
-											{$upgradepackage.pricing.onetime} {$LANG.orderpaymenttermonetime}
-											<input type="hidden" name="billingcycle" value="onetime">
-										{elseif $upgradepackage.pricing.type eq "recurring"}
-											<select name="billingcycle" class="form-control">
-												{if $upgradepackage.pricing.monthly}<option value="monthly">{$upgradepackage.pricing.monthly}</option>{/if}
-												{if $upgradepackage.pricing.quarterly}<option value="quarterly">{$upgradepackage.pricing.quarterly}</option>{/if}
-												{if $upgradepackage.pricing.semiannually}<option value="semiannually">{$upgradepackage.pricing.semiannually}</option>{/if}
-												{if $upgradepackage.pricing.annually}<option value="annually">{$upgradepackage.pricing.annually}</option>{/if}
-												{if $upgradepackage.pricing.biennially}<option value="biennially">{$upgradepackage.pricing.biennially}</option>{/if}
-												{if $upgradepackage.pricing.triennially}<option value="triennially">{$upgradepackage.pricing.triennially}</option>{/if}
-											</select>
-										{/if}
-									</div>
-									<input type="submit" value="{$LANG.upgradedowngradechooseproduct}" class="btn btn-block btn-primary" /> 
-								</div>
-							</div>
-						</form>
-						</div>
-					{/foreach}
-				</div>
-			</div>
-		</div>
-
-    {elseif $type eq "configoptions"}
-        <p>Erweitern Sie Ihr Produkt</p>
-        {if $errormessage}
-            {include file="$template/includes/alert.tpl" type="error" errorshtml=$errormessage}
-        {/if}
-        <form method="post" action="{$smarty.server.PHP_SELF}">
-            <input type="hidden" name="step" value="2" />
-            <input type="hidden" name="type" value="{$type}" />
-            <input type="hidden" name="id" value="{$id}" />
-
-			<table class="table table-striped">
-				{foreach $configoptions as $configoption}
-					<tr>
-						<td>
-							<div class="form-group">
-								<div class="col-sm-12">
-									<div class="form-group">
-										<label for="inputConfigOption{$configoption.id}">{$configoption.optionname}</label>
-										{if $configoption.qtymaximum}
-											{if !$rangesliderincluded}
-												<script type="text/javascript" src="{$BASE_PATH_JS}/ion.rangeSlider.min.js"></script>
-												<link href="{$BASE_PATH_CSS}/ion.rangeSlider.css" rel="stylesheet">
-												<link href="{$BASE_PATH_CSS}/ion.rangeSlider.skinModern.css" rel="stylesheet">
-												{assign var='rangesliderincluded' value=true}
-											{/if}
-											<input type="text" name="configoption[{$configoption.id}]" value="{if $configoption.selectedqty}{$configoption.selectedqty}{else}{$configoption.qtyminimum}{/if}" id="inputConfigOption{$configoption.id}" class="form-control" />
-											<script>
-												var sliderTimeoutId = null;
-												var sliderRangeDifference = {$configoption.qtymaximum} - {$configoption.qtyminimum};
-												// The largest size that looks nice on most screens.
-												var sliderStepThreshold = 25;
-												// Check if there are too many to display individually.
-												var setLargerMarkers = sliderRangeDifference > sliderStepThreshold;
-
-												jQuery("#inputConfigOption{$configoption.id}").ionRangeSlider({
-													min: {$configoption.qtyminimum},
-													max: {$configoption.qtymaximum},
-													grid: true,
-													grid_snap: setLargerMarkers ? false : true,
-													onChange: function() {
-														if (sliderTimeoutId) {
-															clearTimeout(sliderTimeoutId);
-														}
-
-														sliderTimeoutId = setTimeout(function() {
-															sliderTimeoutId = null;
-															recalctotals();
-														}, 250);
-													}
-												});
-											</script>
-										{else}
-											<div>
-												<input type="number" name="configoption[{$configoption.id}]" value="{if $configoption.selectedqty}{$configoption.selectedqty}{else}{$configoption.qtyminimum}{/if}" id="inputConfigOption{$configoption.id}" min="{$configoption.qtyminimum}" onchange="recalctotals()" onkeyup="recalctotals()" class="form-control form-control-qty" />
-												<span class="form-control-static form-control-static-inline">
-													x {$configoption.options.0.name}
-												</span>
-											</div>
-										{/if}
-									</div>
-								</div>
-							</div>
-						</td>
-					</tr>
-				{/foreach}
-			</table>
-            <div class="form-actions">
-                <input type="submit" value="{$LANG.ordercontinuebutton}" class="btn btn-primary" />
-            </div>
-        </form>
-    {/if}
-{/if}

+ 58 - 42
zimbraSingle.php

@@ -238,49 +238,50 @@ function zimbraSingle_UsageUpdate($params) {
         ->where('server', '=', $params['serverid'])
         ->where('domainstatus', '=', 'Active')
         ->get();
-    foreach((array)$productsObj as $productObj) {
-        $product = get_object_vars($productObj[0]);
-        $accountQuota = $apiAccountManager->getQuota($product['username']);
-        if(is_a($accountQuota, 'Exception')) {
-            logModuleCall(
-                'zimbrasingle',
-                __FUNCTION__,
-                $params,
-                'Error : could not find quota for ' . $product['username'],
-                $accountQuota
-            );
-            continue;
-        }
-        $mboxInfo = $apiAccountManager->getMailbox($product['username']);
-        if(is_a($mboxInfo, 'Exception')) {
-            logModuleCall(
-                'zimbrasingle',
-                __FUNCTION__,
-                $params,
-                'Error: could not fetch mailbox info for ' . $product['username'],
-                $mboxInfo
-            );
-            continue;
-        }
-        $mboxSize = $mboxInfo['S'];
-        try {
-            Capsule::table('tblhosting')
-                ->where('id', '=', $product['id'])
-                ->update(
-                    array(
-                        'diskusage' => round($mboxSize / 1048576),
-                        'disklimit' => round($accountQuota / 1048576),
-                        'lastupdate' => Capsule::raw('now()')
-                    )
+    foreach((array)$productsObj as $productArray) {
+        foreach($productArray as $product) {
+            $accountQuota = $apiAccountManager->getQuota($product->username);
+            if(is_a($accountQuota, 'Exception')) {
+                logModuleCall(
+                    'zimbrasingle',
+                    __FUNCTION__,
+                    $params,
+                    'Error : could not find quota for ' . $product->username,
+                    $accountQuota
                 );
-        } catch (\Exception $e) {
-            logModuleCall(
-                'zimbrasingle',
-                __FUNCTION__,
-                $params,
-                'Error: could update usage information for ' . $product['username'],
-                $e->getMessage()
-            );
+                continue;
+            }
+            $mboxInfo = $apiAccountManager->getMailbox($product->username);
+            if(is_a($mboxInfo, 'Exception')) {
+                logModuleCall(
+                    'zimbrasingle',
+                    __FUNCTION__,
+                    $params,
+                    'Error: could not fetch mailbox info for ' . $product->username,
+                    $mboxInfo
+                );
+                continue;
+            }
+            $mboxSize = $mboxInfo['S'];
+            try {
+                Capsule::table('tblhosting')
+                    ->where('id', '=', $product->id)
+                    ->update(
+                        array(
+                            'diskusage' => round($mboxSize / 1048576),
+                            'disklimit' => round($accountQuota / 1048576),
+                            'lastupdate' => Capsule::raw('now()')
+                        )
+                    );
+            } catch (\Exception $e) {
+                logModuleCall(
+                    'zimbrasingle',
+                    __FUNCTION__,
+                    $params,
+                    'Error: could update usage information for ' . $product->username,
+                    $e->getMessage()
+                );
+            }
         }
     }
 }
@@ -616,6 +617,9 @@ function zimbraSingle_ChangePackage($params) {
     $addonQuota = $params['configoptions']['addonQuota'] ? $params['configoptions']['addonQuota'] : 0;
     $newAddQuota = $params['configoptions']['newAddQuota'] ? $params['configoptions']['newAddQuota'] : 0;
     $attrs['zimbraMailQuota'] = ($baseQuota + $addonQuota +$newAddQuota) * 1073741824;
+    if(($params['configoptions3'] == 'yes') && ($params['configoptions4'] != '')) {
+        $attrs['zimbraZimletAvailableZimlets'] = array('!com_zextras_drive_open', '!zimbra_zimlet_nextcloud');
+    }
     $response = $apiAccountManager->modifyAccount($params['username'], $attrs);
     if(is_a($response, 'Exception')) {
         logModuleCall(
@@ -728,6 +732,18 @@ function zimbraSingle_ConfigOptions($params) {
         'Size' => '3',
         'FriendlyName' => 'Mailbox Quota',
     );
+    $configOptions['nc'] = array(
+        'Type' => 'yesno',
+        'Description' => 'Nextcloud aktiv',
+        'FriendlyName' => 'Nextcloud URL anzeigen',
+    );
+    $configOptions['ncUrl'] = array(
+        'Type' => 'text',
+        'Description' => 'Nextcloud URL',
+        'Default' => '',
+        'Size' => '50',
+        'FriendlyName' => 'Nextcloud URL',
+    );
     return $configOptions;
 }