PageRenderTime 23ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/web/concrete/single_pages/dashboard/system/backup/update.php

https://github.com/Remo/concrete5
PHP | 300 lines | 267 code | 33 blank | 0 comment | 21 complexity | 2ad03adb4071771f47bf97f1a3027a34 MD5 | raw file
  1. <?php
  2. defined('C5_EXECUTE') or die("Access Denied.");
  3. $h = Loader::helper('concrete/dashboard');
  4. $ih = Loader::helper('concrete/ui');
  5. $form = Loader::helper('form');
  6. $view = View::getInstance();
  7. if ($canUpgrade) { ?>
  8. <div class="ccm-dashboard-header-buttons">
  9. <a href="<?= $view->action('check_for_updates') ?>" class="btn btn-primary">
  10. <?= t('Check For Updates') ?>
  11. </a>
  12. </div>
  13. <? if (is_object($update)) { ?>
  14. <div class="ccm-dashboard-update-details-wrapper">
  15. <div class="ccm-dashboard-update-details">
  16. <div class="ccm-dashboard-update-thumbnail"><img src="<?=ASSETS_URL_IMAGES?>/logo.png" /></div>
  17. <h2><?=t('Version %s', $update->getVersion())?></h2>
  18. <div><i class="fa fa-cog"></i> <span class="ccm-dashboard-update-details-testing-text"><?=t('Testing System...')?></span></div>
  19. </div>
  20. <div class="ccm-dashboard-update-nav">
  21. <form method="post" action="<?=$view->action('do_update')?>">
  22. <?=$token->output('do_update')?>
  23. <input type="hidden" name="version" value="<?=$update->getVersion()?>" />
  24. <div class="ccm-dashboard-update-apply">
  25. <button class="btn btn-primary" disabled="disabled" type="submit" name="update" value="1"><?=t('Checking...')?></button>
  26. </div>
  27. </form>
  28. </div>
  29. </div>
  30. <div class="ccm-dashboard-update-detail-columns">
  31. <div class="row">
  32. <div class="col-md-4">
  33. <ul class="list-group">
  34. <li class="list-group-item"><span data-href="#notes" class="text-muted"><?php echo t('Release Notes')?></span></li>
  35. <li class="list-group-item"><span data-href="#addons" class="text-muted"><?php echo t('Add-On Compatibility')?></span></li>
  36. <li class="list-group-item"><span data-href="#notices" class="text-muted"><?php echo t('Important Notices')?></span></li>
  37. </ul>
  38. </div>
  39. <div class="col-md-7 col-md-offset-1 ccm-dashboard-update-detail-main">
  40. <a name="notes"></a>
  41. <a href="#" target="_blank" data-url="info" style="display: none" class="btn btn-default pull-right btn-xs "><?=t('View Full Release Notes')?></a>
  42. <h3><?=t('Release Notes')?></h3>
  43. <div class="ccm-dashboard-update-detail-release-notes"><?=t('Retrieving Release Notes...')?></div>
  44. <div class="spacer-row-5"></div>
  45. <a name="addons"></a>
  46. <a href="<?=URL::to('/dashboard/extend/update')?>" class="btn btn-default pull-right btn-xs "><?=t('Update Add-Ons')?></a>
  47. <h3><?=t('Add-On Compatibility')?></h3>
  48. <? $list = \Package::getInstalledList();
  49. $ci = Core::make('helper/concrete/urls');
  50. if (count($list) == 0) { ?>
  51. <p><?=t('No add-ons installed.')?></p>
  52. <? }
  53. foreach($list as $pkg) { ?>
  54. <div class="media" data-addon="<?=$pkg->getPackageHandle()?>">
  55. <div class="pull-left"><img style="width: 49px" src="<?= $ci->getPackageIconURL($pkg); ?>" class"media-object" /></div>
  56. <div class="media-body">
  57. <i class="fa fa-question-circle text-muted pull-right"></i>
  58. <h4 class="media-heading"><?= $pkg->getPackageName(); ?> <span class="badge badge-info" style="margin-right: 10px"><?= tc('AddonVersion', 'v.%s', $pkg->getPackageVersion()); ?></span></h4>
  59. <div class="ccm-dashboard-update-detail-status-text"></div>
  60. </div>
  61. </div>
  62. <? } ?>
  63. <div class="spacer-row-5"></div>
  64. <h3><?=t('Upgrade Notices')?></h3>
  65. <a name="notices"></a>
  66. <div class="ccm-dashboard-update-detail-notices"><?=t('Loading...')?></div>
  67. </div>
  68. </div>
  69. </div>
  70. <script type="text/javascript">
  71. $(function() {
  72. handleError = function(r) {
  73. var $statusIcon = $('.ccm-dashboard-update-details i'),
  74. $statusText = $('.ccm-dashboard-update-details-testing-text');
  75. $statusIcon.removeClass().addClass('fa fa-warning text-info');
  76. $statusText.removeClass().addClass('text-info').text(<?=json_encode(t('Unable to retrieve information about this update from concrete5.org. You may upgrade but do so with caution.'))?>);
  77. $('.ccm-dashboard-update-detail-release-notes').html(<?=json_encode(t('Unable to retrieve release notes from concrete5.org.'))?>);
  78. $('.ccm-dashboard-update-detail-notices').html(<?=json_encode(t('Unable to retrieve upgrade notices from concrete5.org.'))?>);
  79. }
  80. $.ajax({
  81. dataType: 'json',
  82. type: 'post',
  83. data: {
  84. 'version': '<?=$update->getVersion()?>'
  85. },
  86. complete: function() {
  87. $('.ccm-dashboard-update-apply button').prop('disabled', false).text(<?=json_encode(t('Install Update'))?>);
  88. },
  89. url: '<?=$view->action('get_update_diagnostic_information')?>',
  90. error: function(r) {
  91. handleError(r);
  92. },
  93. success: function(r) {
  94. if (!r.requestedVersion) {
  95. handleError(r);
  96. return false;
  97. }
  98. $('a[data-url=info]').attr('href', r.releaseNotesUrl).show();
  99. $('.ccm-dashboard-update-detail-release-notes').html(r.releaseNotes);
  100. $('span[data-href]').each(function() {
  101. var $tag = $('<a />', {'href': $(this).attr('data-href'), text: $(this).text()});
  102. $(this).replaceWith($tag);
  103. });
  104. var $wrapper = $('.ccm-dashboard-update-detail-notices');
  105. $wrapper.html('');
  106. if (r.notices && r.notices.length) {
  107. $.each(r.notices, function(i, notice) {
  108. var className = '';
  109. var textClassName = '';
  110. switch(notice.safety) {
  111. case 'info':
  112. className = 'fa fa-question-circle text-info';
  113. textClassName = '';
  114. break;
  115. case 'warning':
  116. className = 'fa fa-warning text-warning';
  117. textClassName = 'text-warning';
  118. break;
  119. case 'danger':
  120. className = 'fa fa-exclamation-circle text-danger';
  121. textClassName = 'text-danger';
  122. break;
  123. }
  124. $wrapper.append('<div class="media"><div class="pull-left"><i class="' + className + '"></i></div><div class="media-body ' + textClassName + '">' + notice.status + '</div></div>');
  125. });
  126. } else {
  127. $wrapper.append(<?=json_encode(t('No upgrade notices found.'))?>);
  128. }
  129. var $statusIcon = $('.ccm-dashboard-update-details i'),
  130. $statusText = $('.ccm-dashboard-update-details-testing-text');
  131. if (r.status) {
  132. var className = '';
  133. var textClassName = '';
  134. switch(r.status.safety) {
  135. case 'success':
  136. className = 'fa fa-check text-success';
  137. textClassName = 'text-success';
  138. break;
  139. case 'warning':
  140. className = 'fa fa-warning text-warning';
  141. textClassName = 'text-warning';
  142. break;
  143. case 'danger':
  144. className = 'fa fa-exclamation-circle text-danger';
  145. textClassName = 'text-danger';
  146. break;
  147. default:
  148. className = 'fa fa-arrow-circle-right';
  149. textClassName = '';
  150. }
  151. $statusIcon.removeClass().addClass(className);
  152. $statusText.removeClass().addClass(textClassName).text(r.status.status);
  153. } else {
  154. $statusIcon.removeClass().addClass('fa fa-arrow-circle-right');
  155. $statusText.removeClass().addClass(textClassName).text(<?=json_encode(t('Update Ready'))?>);
  156. }
  157. $('[data-addon]').each(function() {
  158. var $addon = $(this);
  159. var item = false;
  160. var textClassName = '';
  161. var mpHandle = $addon.attr('data-addon');
  162. if (r.marketplaceItemStatuses) {
  163. var item = _.find(r.marketplaceItemStatuses, function(item) {
  164. return item.mpHandle == mpHandle;
  165. });
  166. if (item) {
  167. var className = '';
  168. switch(item.safety) {
  169. case 'success':
  170. className = 'fa fa-check text-success pull-right';
  171. textClassName = 'text-success';
  172. break;
  173. case 'warning':
  174. className = 'fa fa-warning text-warning pull-right';
  175. textClassName = 'text-warning';
  176. break;
  177. case 'danger':
  178. className = 'fa fa-exclamation-circle text-danger pull-right';
  179. textClassName = 'text-danger';
  180. break;
  181. }
  182. if (className) {
  183. $addon.find('i').removeClass().addClass(className);
  184. }
  185. }
  186. }
  187. if (item) {
  188. $addon.find('.ccm-dashboard-update-detail-status-text').addClass(textClassName).html(item.status);
  189. } else {
  190. $addon.find('.ccm-dashboard-update-detail-status-text').html(<?=json_encode(t('No information about this add-on available.'))?>);
  191. }
  192. });
  193. }
  194. });
  195. });
  196. </script>
  197. <? } else { ?>
  198. <? if ($downloadableUpgradeAvailable) { ?>
  199. <h2><?= t('Available Update for Download') ?></h2>
  200. <form method="post" action="<?= $view->action('download_update') ?>" id="ccm-download-update-form">
  201. <?= Loader::helper('validation/token')->output('download_update') ?>
  202. <legend style="line-height:40px">
  203. <?= t('Version: %s', $remoteUpdate->getVersion()) ?>.
  204. <?= t('Release Date: %s', date(t('F d, Y'), strtotime($remoteUpdate->getDate()))) ?>
  205. <?= Loader::helper('concrete/ui')->submit(
  206. t('Download'),
  207. 'ccm-download-update-form',
  208. 'right',
  209. 'btn-success') ?>
  210. </legend>
  211. <div id="ccm-release-notes">
  212. <?= $remoteUpdate->getNotes() ?>
  213. </div>
  214. <hr/>
  215. <span class="help-block"><?= t('Note: Downloading an update will NOT automatically install it.') ?></span>
  216. </form>
  217. <script>
  218. $('header.ccm-dashboard-page-header').children().text(<?=json_encode(t('Currently Running %s', config::get('concrete.version'))) ?>);
  219. </script>
  220. <?
  221. }
  222. ?>
  223. <h2><?= t('Apply Downloaded Update') ?></h2>
  224. <? if (count($updates)) {
  225. ?>
  226. <div class="alert alert-warning">
  227. <i class="fa fa-warning"></i> <?= t(
  228. 'Make sure you <a href="%s">backup your database</a> before updating.',
  229. $view->url('/dashboard/system/backup/backup')) ?>
  230. </div>
  231. <?php
  232. $ih = Loader::helper('concrete/ui');
  233. ?>
  234. <p><?= t('Several updates are available. Please choose the desired update from the list below.') ?></p>
  235. <span class="label"><?= t('Current Version') ?> <?= config::get('concrete.version') ?></span>
  236. <form method="post" class="form" action="<?= $view->action('start') ?>" id="ccm-update-form">
  237. <?php
  238. $checked = true;
  239. foreach ($updates as $upd) {
  240. ?>
  241. <div class="radio">
  242. <label>
  243. <input type="radio" name="updateVersion"
  244. value="<?= $upd->getUpdateVersion() ?>" <?= (!$checked ? '' : "checked") ?> />
  245. <?= $upd->getUpdateVersion() ?>
  246. </label>
  247. </div>
  248. <?php
  249. $checked = false;
  250. }
  251. ?>
  252. <div class="ccm-dashboard-form-actions-wrapper">
  253. <div class="ccm-dashboard-form-actions">
  254. <?= $ih->submit(t('Update'), false, 'right', 'btn-primary') ?>
  255. </div>
  256. </div>
  257. </form>
  258. </div>
  259. <div class="clearfix">&nbsp;</div>
  260. <?
  261. } else { ?>
  262. <p><?=t('No updates are ready to be installed.')?></p>
  263. <? } ?>
  264. <? } ?>
  265. <? } else { ?>
  266. <p><?=t('You do not have permission to upgrade this installation of concrete5.')?></p>
  267. <? } ?>