diff --git a/src/Controller/MetaTemplatesController.php b/src/Controller/MetaTemplatesController.php index e986e45..dc5607b 100644 --- a/src/Controller/MetaTemplatesController.php +++ b/src/Controller/MetaTemplatesController.php @@ -10,6 +10,8 @@ use Cake\ORM\TableRegistry; use \Cake\Database\Expression\QueryExpression; use Cake\Http\Exception\NotFoundException; use Cake\Http\Exception\MethodNotAllowedException; +use Cake\Routing\Router; + class MetaTemplatesController extends AppController { @@ -17,50 +19,6 @@ class MetaTemplatesController extends AppController public $filterFields = ['name', 'uuid', 'scope', 'namespace']; public $containFields = ['MetaTemplateFields']; - // public function update($template_uuid=null) - // { - // $metaTemplate = false; - // if (!is_null($template_uuid)) { - // $metaTemplate = $this->MetaTemplates->find()->where([ - // 'uuid' => $template_uuid - // ])->first(); - // if (empty($metaTemplate)) { - // throw new NotFoundException(__('Invalid {0}.', $this->MetaTemplates->getAlias())); - // } - // } - // if ($this->request->is('post')) { - // $updateStrategy = $this->request->getData('update_strategy', null); - // $result = $this->MetaTemplates->update($template_uuid, $updateStrategy); - // if ($this->ParamHandler->isRest()) { - // return $this->RestResponse->viewData($result, 'json'); - // } else { - // if ($result['success']) { - // $message = __n('{0} templates updated.', 'The template has been updated.', empty($template_uuid), $result['files_processed']); - // } else { - // $message = __n('{0} templates could not be updated.', 'The template could not be updated.', empty($template_uuid), $result['files_processed']); - // } - // $this->CRUD->setResponseForController('update', $result['success'], $message, $result['files_processed'], $result['update_errors'], ['redirect' => $this->referer()]); - // $responsePayload = $this->CRUD->getResponsePayload(); - // if (!empty($responsePayload)) { - // return $responsePayload; - // } - // } - // } else { - // if (!$this->ParamHandler->isRest()) { - // if (!is_null($template_uuid)) { - // $this->set('metaTemplate', $metaTemplate); - // $this->setUpdateStatus($metaTemplate->id); - // } else { - // $this->set('title', __('Update Meta Templates')); - // $this->set('question', __('Are you sure you wish to update the Meta Template definitions')); - // $templatesUpdateStatus = $this->MetaTemplates->getUpdateStatusForTemplates(); - // $this->set('templatesUpdateStatus', $templatesUpdateStatus); - // $this->render('updateAll'); - // } - // } - // } - // } - public function updateAllTemplates() { if ($this->request->is('post')) { @@ -180,10 +138,12 @@ class MetaTemplatesController extends AppController { $metaTemplate = $this->MetaTemplates->get($template_id); $newestMetaTemplate = $this->MetaTemplates->getNewestVersion($metaTemplate); - $entities = $this->MetaTemplates->getEntitiesHavingMetaFieldsFromTemplate($template_id); + $amountOfEntitiesToUpdate = 0; + $entities = $this->MetaTemplates->getEntitiesHavingMetaFieldsFromTemplate($template_id, 10, $amountOfEntitiesToUpdate); $this->set('metaTemplate', $metaTemplate); $this->set('newestMetaTemplate', $newestMetaTemplate); $this->set('entities', $entities); + $this->set('amountOfEntitiesToUpdate', $amountOfEntitiesToUpdate); } public function migrateOldMetaTemplateToNewestVersionForEntity($template_id, $entity_id) @@ -232,9 +192,12 @@ class MetaTemplatesController extends AppController $message, $savedData, [], - ['redirect' => [ - 'controller' => $className, - 'action' => 'view', $entity_id] + [ + 'redirect' => [ + 'controller' => $className, + 'action' => 'view', $entity_id, + 'url' => Router::url(['controller' => $className, 'action' => 'view', $entity_id]) + ] ] ); $responsePayload = $this->CRUD->getResponsePayload(); @@ -242,7 +205,7 @@ class MetaTemplatesController extends AppController return $responsePayload; } } - $conflicts = $this->MetaTemplates->getMetaTemplateConflictsForMetaTemplate($metaTemplate, $newestMetaTemplate); + $conflicts = $this->MetaTemplates->getMetaFieldsConflictsUnderTemplate($entity->meta_fields, $newestMetaTemplate); foreach ($conflicts as $conflict) { if (!empty($conflict['existing_meta_template_field'])) { $existingMetaTemplateField = $conflict['existing_meta_template_field']; @@ -257,7 +220,7 @@ class MetaTemplatesController extends AppController if (!empty($conflicts[$metaTemplateField->field]['conflicts'])) { continue; } - foreach ($newestMetaTemplate->meta_template_fields as $newMetaTemplateField) { + foreach ($newestMetaTemplate->meta_template_fields as $i => $newMetaTemplateField) { if ($metaTemplateField->field == $newMetaTemplateField->field && empty($newMetaTemplateField->metaFields)) { $movedMetaTemplateFields[] = $metaTemplateField->id; $copiedMetaFields = array_map(function ($e) use ($newMetaTemplateField) { @@ -298,14 +261,12 @@ class MetaTemplatesController extends AppController ] ], 'contain' => $this->containFields, - 'afterFind' => function($data) use ($templatesUpdateStatus) { - foreach ($data as $i => $metaTemplate) { - if (!empty($templatesUpdateStatus[$metaTemplate->uuid])) { - $templateStatus = $this->MetaTemplates->getStatusForMetaTemplate($templatesUpdateStatus[$metaTemplate->uuid]['template'], $metaTemplate); - $metaTemplate->set('updateStatus', $this->MetaTemplates->computeFullUpdateStatusForMetaTemplate($templateStatus, $metaTemplate)); - } + 'afterFind' => function($metaTemplate) use ($templatesUpdateStatus) { + if (!empty($templatesUpdateStatus[$metaTemplate->uuid])) { + $templateStatus = $this->MetaTemplates->getStatusForMetaTemplate($templatesUpdateStatus[$metaTemplate->uuid]['template'], $metaTemplate); + $metaTemplate->set('updateStatus', $this->MetaTemplates->computeFullUpdateStatusForMetaTemplate($templateStatus, $metaTemplate)); } - return $data; + return $metaTemplate; } ]); $responsePayload = $this->CRUD->getResponsePayload(); diff --git a/src/Model/Table/MetaTemplatesTable.php b/src/Model/Table/MetaTemplatesTable.php index b02e95c..de8a5c7 100644 --- a/src/Model/Table/MetaTemplatesTable.php +++ b/src/Model/Table/MetaTemplatesTable.php @@ -595,9 +595,10 @@ class MetaTemplatesTable extends AppTable * Collect all enties having meta-fields belonging to the provided template * * @param integer $template_id + * @param integer|bool $limit The limit of entities to be returned. Pass null to be ignore the limit * @return array List of entities */ - public function getEntitiesHavingMetaFieldsFromTemplate(int $metaTemplateId): array + public function getEntitiesHavingMetaFieldsFromTemplate(int $metaTemplateId, $limit=10, int &$totalAmount=0): array { $metaTemplate = $this->get($metaTemplateId); $queryParentEntities = $this->MetaTemplateFields->MetaFields->find(); @@ -618,6 +619,10 @@ class MetaTemplatesTable extends AppTable ] ] ]); + if (!is_null($limit)) { + $totalAmount = $entityQuery->all()->count(); + $entityQuery->limit($limit); + } $entities = $entityQuery->all()->toList(); return $entities; } @@ -876,7 +881,7 @@ class MetaTemplatesTable extends AppTable $this->updateMetaTemplate($metaTemplate, $template, $errors); return !empty($errors) ? $errors[0] : true; } - $entities = $this->getEntitiesHavingMetaFieldsFromTemplate($metaTemplate->id); + $entities = $this->getEntitiesHavingMetaFieldsFromTemplate($metaTemplate->id, null); $conflictingEntities = []; foreach ($entities as $entity) { @@ -935,7 +940,7 @@ class MetaTemplatesTable extends AppTable $this->updateMetaTemplate($metaTemplate, $template, $errors); return !empty($errors) ? $errors[0] : true; } - $entities = $this->getEntitiesHavingMetaFieldsFromTemplate($metaTemplate->id); + $entities = $this->getEntitiesHavingMetaFieldsFromTemplate($metaTemplate->id, null); foreach ($entities as $entity) { $conflicts = $this->getMetaFieldsConflictsUnderTemplate($entity['meta_fields'], $template); @@ -1002,11 +1007,18 @@ class MetaTemplatesTable extends AppTable */ public function getMetaFieldsConflictsUnderTemplate(array $metaFields, $template): array { + if (!is_array($template) && get_class($template) == 'App\Model\Entity\MetaTemplate') { + $metaTemplateFields = $template->meta_template_fields; + $existingMetaTemplate = true; + } else { + $metaTemplateFields = $template['metaFields']; + } $conflicting = []; $metaTemplateFieldByName = []; - $existingMetaTemplate = !is_array($template); - $metaTemplateFields = !$existingMetaTemplate ? $template['metaFields'] : $template->meta_template_fields; foreach ($metaTemplateFields as $metaTemplateField) { + if (!is_array($template)) { + $metaTemplateField = $metaTemplateField->toArray(); + } $metaTemplateFieldByName[$metaTemplateField['field']] = $this->MetaTemplateFields->newEntity($metaTemplateField); } foreach ($metaFields as $metaField) { @@ -1026,7 +1038,7 @@ class MetaTemplatesTable extends AppTable /** * Compute the potential conflict that would be introduced by updating an existing meta-template-field with the provided one. - * This will go through all instanciation of the existing meta-template-field and checking their validaty against the provided one. + * This will go through all instanciation of the existing meta-template-field and checking their validity against the provided one. * * @param \App\Model\Entity\MetaTemplateField $metaTemplateField * @param array $templateField diff --git a/templates/MetaTemplates/get_meta_fields_to_update.php b/templates/MetaTemplates/get_meta_fields_to_update.php index 7b17b5a..07d7b6a 100644 --- a/templates/MetaTemplates/get_meta_fields_to_update.php +++ b/templates/MetaTemplates/get_meta_fields_to_update.php @@ -28,6 +28,9 @@ foreach ($entities as $entity) { __('has {0} meta-fields to update', count($entity->meta_fields)) ); } +if ($amountOfEntitiesToUpdate > 0) { + $bodyHtml .= sprintf('
  • %s
  • ', __('{0} more entities', h($amountOfEntitiesToUpdate))); +} $bodyHtml .= ''; echo $this->Bootstrap->modal([ diff --git a/templates/MetaTemplates/migrate_old_meta_template_to_newest_version_for_entity.php b/templates/MetaTemplates/migrate_old_meta_template_to_newest_version_for_entity.php index a5b8b13..8a7ee11 100644 --- a/templates/MetaTemplates/migrate_old_meta_template_to_newest_version_for_entity.php +++ b/templates/MetaTemplates/migrate_old_meta_template_to_newest_version_for_entity.php @@ -1,5 +1,7 @@ -

    name) ?>

    @@ -7,7 +9,13 @@

    - version)) ?> + 'view', + $oldMetaTemplate->id + ]); + ?> + version)) ?> Bootstrap->badge([ 'text' => __('Data to be migrated over'), @@ -32,7 +40,13 @@

    - version)) ?> + 'view', + $newMetaTemplate->id + ]); + ?> + version)) ?> Bootstrap->badge([ 'text' => __('Data to be saved'), @@ -86,7 +100,10 @@ echo $this->Html->scriptBlock(sprintf( function submitMigration() { const $form = $('.to-save-container form') console.log($form.attr('action')); - AJAXApi.quickPostForm($form[0]) - // $form.submit() + AJAXApi.quickPostForm($form[0]).then((postResult) => { + if (postResult.additionalData.redirect.url !== undefined) { + window.location = postResult.additionalData.redirect.url + } + }) } \ No newline at end of file diff --git a/templates/element/genericElements/Form/metaTemplateForm.php b/templates/element/genericElements/Form/metaTemplateForm.php index c70996d..0a4d934 100644 --- a/templates/element/genericElements/Form/metaTemplateForm.php +++ b/templates/element/genericElements/Form/metaTemplateForm.php @@ -30,9 +30,13 @@ foreach ($metaTemplate->meta_template_fields as $metaTemplateField) { } else { $metaField = reset($metaTemplateField->metaFields); $fieldData = [ - 'field' => sprintf('MetaTemplates.%s.meta_template_fields.%s.metaFields.%s.value', $metaField->meta_template_id, $metaField->meta_template_field_id, $metaField->id), 'label' => $metaTemplateField->label, ]; + if (isset($metaField->id)) { + $fieldData['field'] = sprintf('MetaTemplates.%s.meta_template_fields.%s.metaFields.%s.value', $metaField->meta_template_id, $metaField->meta_template_field_id, $metaField->id); + } else { + $fieldData['field'] = sprintf('MetaTemplates.%s.meta_template_fields.%s.metaFields.%s.value', $metaField->meta_template_id, $metaField->meta_template_field_id, array_key_first($metaTemplateField->metaFields)); + } $this->Form->setTemplates($backupTemplates); $fieldsHtml .= $this->element( 'genericElements/Form/fieldScaffold',