'; $tableHtml .= sprintf('%s', __('ID')); $tableHtml .= sprintf('%s', __('Template')); $tableHtml .= sprintf('%s', __('Version')); $tableHtml .= sprintf('%s', __('New Template')); $tableHtml .= sprintf('%s', __('Update available')); $tableHtml .= sprintf('%s', __('Has Conflicts')); $tableHtml .= sprintf('%s', __('Will be updated')); $tableHtml .= ''; $numberOfUpdates = 0; $numberOfSkippedUpdates = 0; foreach ($templatesUpdateStatus as $uuid => $status) { $tableHtml .= ''; if (!empty($status['new'])) { $tableHtml .= sprintf('%s', __('N/A')); } else { $tableHtml .= sprintf('%s', Router::url(['controller' => 'MetaTemplates', 'action' => 'view', 'plugin' => null, h($status['existing_template']->id)]), h($status['existing_template']->id) ); } if (!empty($status['new'])) { $tableHtml .= sprintf('%s', h($uuid)); } else { $tableHtml .= sprintf('%s', Router::url(['controller' => 'MetaTemplates', 'action' => 'view', 'plugin' => null, h($status['existing_template']->id)]), h($status['existing_template']->name) ); } if (!empty($status['new'])) { $tableHtml .= sprintf('%s', __('N/A')); } else { $tableHtml .= sprintf('%s %s %s', h($status['current_version']), $this->Bootstrap->icon('arrow-right', ['class' => 'fs-8']), h($status['next_version']) ); } if (!empty($status['new'])) { $numberOfUpdates += 1; $tableHtml .= sprintf('%s', $this->Bootstrap->icon('check')); } else { $tableHtml .= sprintf('%s', $this->Bootstrap->icon('times')); } if (!empty($status['new'])) { $tableHtml .= sprintf('%s', __('N/A')); } else { $tableHtml .= sprintf('%s', empty($status['up-to-date']) ? $this->Bootstrap->icon('check') : $this->Bootstrap->icon('times')); } if (!empty($status['new'])) { $tableHtml .= sprintf('%s', __('N/A')); } else { $tableHtml .= sprintf('%s', !empty($status['conflicts']) ? $this->Bootstrap->icon('check') : $this->Bootstrap->icon('times')); } if (!empty($status['new'])) { $tableHtml .= sprintf('%s', $this->Bootstrap->icon('check', ['class' => 'text-success'])); } else { // Depends on the strategy used by the update_all function. Right now, every update create a brand new template // leaving existing data untouched. So regardless of the conflict, the new template will be created if (!empty($status['new']) || empty($status['up-to-date'])) { $numberOfUpdates += 1; $tableHtml .= sprintf('%s', $this->Bootstrap->icon('check', ['class' => 'text-success'])); } else { $numberOfSkippedUpdates += 1; $tableHtml .= sprintf('%s', $this->Bootstrap->icon('times', ['class' => 'text-danger'])); } } $tableHtml .= ''; } $tableHtml .= ''; if (empty($numberOfSkippedUpdates) && empty($numberOfUpdates)) { $bodyHtml .= $this->Bootstrap->alert([ 'variant' => 'success', 'text' => __('All meta-templates are already up-to-date!'), 'dismissible' => false, ]); $modalType = 'ok-only'; } elseif ($numberOfSkippedUpdates == 0) { $bodyHtml .= $this->Bootstrap->alert([ 'variant' => 'success', 'text' => __('All {0} meta-templates can be updated', $numberOfUpdates), 'dismissible' => false, ]); } else { $modalSize = 'xl'; $alertHtml = ''; if (!empty($numberOfUpdates)) { $alertHtml .= sprintf('
%s
', __('{0} meta-templates can be updated.', sprintf('%s', $numberOfUpdates))); } if (!empty($numberOfSkippedUpdates)) { $alertHtml .= sprintf('
%s
', __('{0} meta-templates will be skipped.', sprintf('%s', $numberOfSkippedUpdates))); $alertHtml .= sprintf('
%s
', __('You can still choose the update strategy when updating each conflicting template manually.')); } $bodyHtml .= $this->Bootstrap->alert([ 'variant' => 'warning', 'html' => $alertHtml, 'dismissible' => false, ]); } $bodyHtml .= $tableHtml; echo $this->Bootstrap->modal([ 'title' => h($title), 'bodyHtml' => $bodyHtml, 'size' => $modalSize, 'type' => $modalType, 'confirmText' => __('Update meta-templates'), 'confirmFunction' => 'updateMetaTemplate', ]); ?>