wp-toolkit-plesk.tpl 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414
  1. <div class="wp-toolkit">
  2. <div class="hero-cta">
  3. <div class="container">
  4. <h1>
  5. {lang key='store.addon.wptk.pleskTitle'}
  6. <img src="{$WEB_ROOT}/assets/img/store/wp-toolkit/plesk.png" class="logo-plesk">
  7. </h1>
  8. <h2>{lang key='store.addon.wptk.pleskTagline'}</h2>
  9. <button class="btn btn-success btn-cta" onclick="smoothScroll('#pricing')">
  10. {lang key='store.addon.wptk.getItNow'}
  11. </button>
  12. {if $hasCpanelWptk}
  13. <p class="pt-3">
  14. {lang key='store.addon.wptk.switchCpanel'}
  15. <a href="{fqdnRoutePath('store-addon', 'wp-toolkit-deluxe')}">{lang key='clickHere'}</a>
  16. </p>
  17. {/if}
  18. </div>
  19. </div>
  20. <div class="hero-image light">
  21. <div class="container">
  22. <img src="{$WEB_ROOT}/assets/img/store/wp-toolkit/feature-laptop-plesk.png" class="logo">
  23. </div>
  24. </div>
  25. <div class="body-intro bg-primary">
  26. <div class="container">
  27. <div class="row">
  28. <div class="col-lg-6">
  29. <p class="lead">{lang key='store.addon.wptk.pleskIntroTitle'}</p>
  30. <p>{lang key='store.addon.wptk.pleskIntroBody'}</p>
  31. </div>
  32. <div class="col-lg-6">
  33. <img src="{$WEB_ROOT}/assets/img/store/wp-toolkit/graphic-plesk.png" class="d-none d-lg-block">
  34. </div>
  35. </div>
  36. </div>
  37. </div>
  38. <div class="features">
  39. <div class="container">
  40. <div class="smart-updates">
  41. <div class="row">
  42. <div class="col-md-6 col-lg-4">
  43. <div class="feature-block">
  44. <img src="{$WEB_ROOT}/assets/img/store/wp-toolkit/icon-how.png">
  45. <div class="title">{lang key='store.addon.wptk.smartUpdates.featureTitle1'}</div>
  46. <div class="description">{lang key='store.addon.wptk.smartUpdates.featureBody1'}</div>
  47. </div>
  48. </div>
  49. <div class="col-md-6 col-lg-4">
  50. <div class="feature-block">
  51. <img src="{$WEB_ROOT}/assets/img/store/wp-toolkit/icon-safe.png">
  52. <div class="title">{lang key='store.addon.wptk.smartUpdates.featureTitle2'}</div>
  53. <div class="description">{lang key='store.addon.wptk.smartUpdates.featureBody2'}</div>
  54. </div>
  55. </div>
  56. <div class="col-lg-4">
  57. <div class="feature-block">
  58. <img src="{$WEB_ROOT}/assets/img/store/wp-toolkit/icon-unsafe.png">
  59. <div class="title">{lang key='store.addon.wptk.smartUpdates.featureTitle3'}</div>
  60. <div class="description">{lang key='store.addon.wptk.smartUpdates.featureBody3'}</div>
  61. </div>
  62. </div>
  63. </div>
  64. </div>
  65. <h3 class="text-center">{lang key='store.addon.wptk.midTitle1' breaktag=''}</h3>
  66. <div class="row">
  67. <div class="col-md-6 col-lg-4">
  68. <div class="feature-block">
  69. <img src="{$WEB_ROOT}/assets/img/store/wp-toolkit/icon-create.png">
  70. <div class="title">{lang key='store.addon.wptk.plesk.featureTitle1'}</div>
  71. <div class="description">{lang key='store.addon.wptk.plesk.featureBody1'}</div>
  72. </div>
  73. </div>
  74. <div class="col-md-6 col-lg-4">
  75. <div class="feature-block">
  76. <img src="{$WEB_ROOT}/assets/img/store/wp-toolkit/icon-experiment.png">
  77. <div class="title">{lang key='store.addon.wptk.plesk.featureTitle2'}</div>
  78. <div class="description">{lang key='store.addon.wptk.plesk.featureBody2'}</div>
  79. </div>
  80. </div>
  81. <div class="col-md-6 col-lg-4">
  82. <div class="feature-block">
  83. <img src="{$WEB_ROOT}/assets/img/store/wp-toolkit/icon-security.png">
  84. <div class="title">{lang key='store.addon.wptk.plesk.featureTitle3'}</div>
  85. <div class="description">{lang key='store.addon.wptk.plesk.featureBody3'}</div>
  86. </div>
  87. </div>
  88. <div class="col-md-6 col-lg-4">
  89. <div class="feature-block">
  90. <img src="{$WEB_ROOT}/assets/img/store/wp-toolkit/icon-updates.png">
  91. <div class="title">{lang key='store.addon.wptk.plesk.featureTitle4'}</div>
  92. <div class="description">{lang key='store.addon.wptk.plesk.featureBody4'}</div>
  93. </div>
  94. </div>
  95. <div class="col-md-6 col-lg-4">
  96. <div class="feature-block">
  97. <img src="{$WEB_ROOT}/assets/img/store/wp-toolkit/icon-focus.png">
  98. <div class="title">{lang key='store.addon.wptk.plesk.featureTitle5'}</div>
  99. <div class="description">{lang key='store.addon.wptk.plesk.featureBody5'}</div>
  100. </div>
  101. </div>
  102. <div class="col-md-6 col-lg-4">
  103. <div class="feature-block">
  104. <img src="{$WEB_ROOT}/assets/img/store/wp-toolkit/icon-star.png">
  105. <div class="title">{lang key='store.addon.wptk.plesk.featureTitle6'}</div>
  106. <div class="description">{lang key='store.addon.wptk.plesk.featureBody6'}</div>
  107. </div>
  108. </div>
  109. </div>
  110. </div>
  111. </div>
  112. <div class="pre-screenshots bg-primary">
  113. <div class="container">
  114. <div class="title">{lang key='store.addon.wptk.midTitle2'}</div>
  115. <div class="row justify-content-center">
  116. <div class="col-sm-10">
  117. {if $firstMatchingAddon && !$firstMatchingAddon->pricing()->first()->isFree()}
  118. {lang key='store.addon.wptk.smartUpdates.screenshotDesc' price=$firstMatchingAddon->pricing()->first()->price()}
  119. {else}
  120. {lang key='store.addon.wptk.smartUpdates.screenshotDescFree'}
  121. {/if}
  122. </div>
  123. </div>
  124. </div>
  125. </div>
  126. <div class="screenshots">
  127. <div class="container">
  128. <div class="row justify-content-center">
  129. <div class="col-xl-10">
  130. <div class="row screenshots-row">
  131. <div class="col-md-6">
  132. <a href="{$WEB_ROOT}/assets/img/store/wp-toolkit/screen-01-full.png" class="screenshot-thumb" data-lightbox="wptoolkit">
  133. <img src="{$WEB_ROOT}/assets/img/store/wp-toolkit/screen-01.png">
  134. <div class="overlay">
  135. <img src="{$WEB_ROOT}/assets/img/store/wp-toolkit/zoom.png">
  136. </div>
  137. </a>
  138. </div>
  139. <div class="col-md-6">
  140. <a href="{$WEB_ROOT}/assets/img/store/wp-toolkit/screen-02-full.png" class="screenshot-thumb" data-lightbox="wptoolkit">
  141. <img src="{$WEB_ROOT}/assets/img/store/wp-toolkit/screen-02.png">
  142. <div class="overlay">
  143. <img src="{$WEB_ROOT}/assets/img/store/wp-toolkit/zoom.png">
  144. </div>
  145. </a>
  146. </div>
  147. <div class="col-md-6">
  148. <a href="{$WEB_ROOT}/assets/img/store/wp-toolkit/screen-03-full.png" class="screenshot-thumb" data-lightbox="wptoolkit">
  149. <img src="{$WEB_ROOT}/assets/img/store/wp-toolkit/screen-03.png">
  150. <div class="overlay">
  151. <img src="{$WEB_ROOT}/assets/img/store/wp-toolkit/zoom.png">
  152. </div>
  153. </a>
  154. </div>
  155. <div class="col-md-6">
  156. <a href="{$WEB_ROOT}/assets/img/store/wp-toolkit/screen-04-full.png" class="screenshot-thumb" data-lightbox="wptoolkit">
  157. <img src="{$WEB_ROOT}/assets/img/store/wp-toolkit/screen-04.png">
  158. <div class="overlay">
  159. <img src="{$WEB_ROOT}/assets/img/store/wp-toolkit/zoom.png">
  160. </div>
  161. </a>
  162. </div>
  163. </div>
  164. </div>
  165. </div>
  166. </div>
  167. </div>
  168. <div class="modal lightbox-modal fade" id="wptkLightboxModal" tabindex="-1" role="dialog" aria-hidden="true">
  169. <div class="modal-dialog" role="document">
  170. <div class="modal-content">
  171. <div class="modal-body">
  172. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  173. <span aria-hidden="true">&times;</span>
  174. </button>
  175. <img src="" class="lightbox-image">
  176. </div>
  177. </div>
  178. </div>
  179. </div>
  180. <div class="pricing" id="pricing">
  181. <div class="container">
  182. {if $loggedin && count($clientServices)}
  183. <div class="starting-from">{lang key='store.addon.wptk.smartUpdates.getStartedToday'}</div>
  184. <div class="subtitle">{lang key='store.addon.wptk.chooseDomains'}</div>
  185. <div class="service-selector justify-content-center">
  186. {foreach $clientServices as $service}
  187. <div class="service serviceid-{$service['service']->id}">
  188. <div class="inner-content">
  189. <div class="product-name truncate">{$service['service']->product->name}</div>
  190. <div class="divider"></div>
  191. <div class="domain-name truncate">{$service['service']->domain}</div>
  192. {if $service['addon']}
  193. <div class="description">{lang key='store.addon.wptk.addAddonFor' addon={$service['addon']->name}}</div>
  194. <div class="price">
  195. {if $service['addon']->isFree()}
  196. {lang key='orderfree'}
  197. {else}
  198. {$service['addonPrice']->price()}{($service['addon']->isOneTime()) ? '' : "/{$service['addonPrice']->getShortCycle()}"}
  199. {/if}
  200. </div>
  201. {else}
  202. <div class="unavailable">{lang key='store.addon.wptk.unavailable'}</div>
  203. {/if}
  204. </div>
  205. {if $service['addon']}
  206. <button class="btn btn-warning btn-add-to-cart"
  207. data-product-name="{$service['addon']->name}"
  208. data-serviceid="{$service['service']->id}"
  209. data-addonid="{$service['addon']->id}"
  210. data-domain-name="{$service['service']->domain}"
  211. data-price="{$service['addonPrice']->price()->toNumeric()}">
  212. {lang key='addtocart'}
  213. </button>
  214. {else}
  215. <button class="btn btn-warning btn-add-to-cart disabled">
  216. {lang key='addtocart'}
  217. </button>
  218. {/if}
  219. <div class="in-cart-indicator">
  220. <img src="{$WEB_ROOT}/assets/img/store/wp-toolkit/in-cart.png" alt="{lang key='domainchecker.alreadyincarttitle'}">
  221. </div>
  222. </div>
  223. {/foreach}
  224. </div>
  225. <div class="cart">
  226. <form method="post" data-role="cart-form" action="{fqdnRoutePath('store-add-addons')}">
  227. <input type="hidden" name="servicemap">
  228. <div class="cart-items">
  229. <div class="item template">
  230. <div class="product-info">
  231. <span class="product-name"></span>
  232. {lang key='store.addon.wptk.for'}
  233. <span class="domain-name"></span>
  234. </div>
  235. {$activeCurrency->prefix}<span class="price"></span>
  236. <button class="btn btn-remove float-right">
  237. <i class="fas fa-times"></i>
  238. </button>
  239. </div>
  240. </div>
  241. <div class="cart-totals">
  242. {lang key='store.addon.wptk.totalInCart'}
  243. {$activeCurrency->prefix}<span class="cart-total-amount"></span>
  244. <button type="submit" class="btn btn-success btn-checkout float-right">
  245. {lang key='store.addon.wptk.proceedToCheckout'}
  246. </button>
  247. </div>
  248. </form>
  249. </div>
  250. {else}
  251. {if $firstMatchingAddon && !$firstMatchingAddon->pricing()->first()->isFree()}
  252. <div class="starting-from">{lang key='startingfrom'} {$firstMatchingAddon->pricing()->first()->price()}/{$firstMatchingAddon->pricing()->first()->getShortCycle()}</div>
  253. {/if}
  254. {if !$loggedin}
  255. <div class="subtitle">{lang key='store.addon.wptk.loginToSeePricing'}</div>
  256. {/if}
  257. <div class="action-btns">
  258. <form method="post" action="{$browsePackagesAction}">
  259. {if !$loggedin}
  260. <a href="{routePath('store-addon-login', $addonSlug, $serviceId)}" class="btn btn-success">
  261. {lang key='store.addon.wptk.loginNow'}
  262. </a>
  263. {/if}
  264. <button type="submit" class="btn btn-warning">
  265. {lang key='store.addon.wptk.browsePackages'}
  266. </button>
  267. </form>
  268. </div>
  269. {/if}
  270. </div>
  271. </div>
  272. <div class="faqs">
  273. <div class="container">
  274. <div class="row justify-content-around">
  275. <div class="col-lg-5">
  276. <div class="border-line"></div>
  277. <div class="faq-title">{lang key='store.addon.wptk.faqQ1'}</div>
  278. <div class="faq-answer">{lang key='store.addon.wptk.faqA1'}</div>
  279. <div class="border-line"></div>
  280. <div class="faq-title">{lang key='store.addon.wptk.faqQ3'}</div>
  281. <div class="faq-answer">{lang key='store.addon.wptk.faqA3'}</div>
  282. </div>
  283. <div class="col-lg-5">
  284. <div class="border-line"></div>
  285. <div class="faq-title">{lang key='store.addon.wptk.faqQ6'}</div>
  286. <div class="faq-answer">{lang key='store.addon.wptk.faqA6' webRoot=$WEB_ROOT}</div>
  287. </div>
  288. </div>
  289. </div>
  290. </div>
  291. </div>
  292. <script>
  293. $(document).ready(function() {
  294. var cartTotal = 0;
  295. var ssoServiceId = {if $ssoService}{$ssoService->id}{else}0{/if};
  296. var changeServiceMap = function(callback)
  297. {
  298. var field = $('form[data-role="cart-form"]').find('input[name="servicemap"]');
  299. var value = $(field).val();
  300. try {
  301. value = JSON.parse(value);
  302. } catch (e) {
  303. value = {};
  304. }
  305. $(field).val(
  306. JSON.stringify(
  307. callback(value)
  308. )
  309. );
  310. };
  311. $('.wp-toolkit .service-selector .btn-add-to-cart').click(function(e) {
  312. e.preventDefault();
  313. if ($(this).hasClass('disabled')) {
  314. return;
  315. }
  316. var serviceId = $(this).data('serviceid'),
  317. addonId = $(this).data('addonid');
  318. var row = $('.wp-toolkit .cart-items .item.template').clone()
  319. .removeClass('template')
  320. .find('.product-name').text($(this).data('product-name')).end()
  321. .find('.domain-name').text($(this).data('domain-name')).end()
  322. .find('.price').text($(this).data('price')).end()
  323. .attr('data-serviceid', $(this).data('serviceid'))
  324. .attr('data-price', $(this).data('price'));
  325. changeServiceMap(function(serviceMap) {
  326. serviceMap[serviceId] = addonId;
  327. return serviceMap;
  328. });
  329. $('.wp-toolkit .cart-items').append(row);
  330. $('.wp-toolkit .cart').slideDown();
  331. cartTotal += parseFloat($(this).data('price'));
  332. $('.wp-toolkit .cart-total-amount').text(cartTotal.toFixed(2));
  333. $(this).closest('.service').addClass('in-cart');
  334. });
  335. $(document).on('click', '.wp-toolkit .cart-items .btn-remove', function (e) {
  336. e.preventDefault();
  337. var $removeItem = $(this).closest('.item');
  338. var serviceId = $removeItem.data('serviceid');
  339. cartTotal -= $removeItem.data('price');
  340. $('.wp-toolkit .cart-total-amount').text(cartTotal.toFixed(2));
  341. $('.serviceid-' + serviceId).removeClass('in-cart');
  342. changeServiceMap(function(serviceMap) {
  343. if (serviceMap.hasOwnProperty(serviceId)) {
  344. delete serviceMap[serviceId];
  345. }
  346. return serviceMap;
  347. });
  348. if ($('.wp-toolkit .cart-items .item:not(.template)').length <= 1) {
  349. $('.wp-toolkit .cart').slideUp('', function() {
  350. $removeItem.remove();
  351. });
  352. } else {
  353. $removeItem.slideUp('', function() {
  354. $(this).remove();
  355. });
  356. }
  357. });
  358. // pre-add the service we used to SSO from
  359. if (ssoServiceId) {
  360. $('.btn-add-to-cart[data-serviceid="' + ssoServiceId + '"]').click();
  361. }
  362. // lightbox
  363. jQuery('.screenshots a.screenshot-thumb').each(function() {
  364. jQuery(this).attr('data-toggle', 'modal')
  365. .attr('data-target', '#wptkLightboxModal');
  366. });
  367. jQuery('.screenshots a.screenshot-thumb').click(function(event) {
  368. event.preventDefault();
  369. $('<img>').attr({
  370. src: jQuery(this).attr('href'),
  371. class: 'lightbox-image'
  372. }).load(function() {
  373. var resizePercent = ($(window).width() < 768 ? 100 : 75);
  374. jQuery('.lightbox-image').replaceWith(this);
  375. jQuery('#wptkLightboxModal .modal-dialog').css({
  376. 'max-width': (this.width * (resizePercent/100)),
  377. 'width': 'initial'
  378. });
  379. jQuery('#wptkLightboxModal').modal('show');
  380. });
  381. });
  382. jQuery('#wptkLightboxModal').on('hidden.bs.modal', function() {
  383. jQuery('.lightbox-image').attr('src','');
  384. });
  385. });
  386. </script>