diff --git a/src/Controller/Component/CRUDComponent.php b/src/Controller/Component/CRUDComponent.php index 3378ad2..5df6396 100644 --- a/src/Controller/Component/CRUDComponent.php +++ b/src/Controller/Component/CRUDComponent.php @@ -48,7 +48,7 @@ class CRUDComponent extends Component private function getMetaTemplates() { - $metaFields = []; + $metaTemplates = []; if (!empty($this->Table->metaFields)) { $metaQuery = $this->MetaTemplates->find(); $metaQuery->where([ @@ -57,13 +57,8 @@ class CRUDComponent extends Component ]); $metaQuery->contain(['MetaTemplateFields']); $metaTemplates = $metaQuery->all(); - foreach ($metaTemplates as $metaTemplate) { - foreach ($metaTemplate->meta_template_fields as $field) { - $metaFields[$field['field']] = $field; - } - } } - $this->Controller->set('metaFields', $metaFields); + $this->Controller->set('metaTemplates', $metaTemplates); return true; } @@ -136,18 +131,30 @@ class CRUDComponent extends Component private function saveMetaFields($id, $input) { - foreach ($input['metaFields'] as $metaField => $values) { - if (!is_array($values)) { - $values = [$values]; + foreach ($input['metaFields'] as $templateID => $metaFields) { + $metaTemplates = $this->MetaTemplates->find()->where([ + 'id' => $templateID, + 'enabled' => 1 + ])->contain(['MetaTemplateFields'])->first(); + $fieldNameToId = []; + foreach ($metaTemplates->meta_template_fields as $i => $metaTemplateField) { + $fieldNameToId[$metaTemplateField->field] = $metaTemplateField->id; } - foreach ($values as $value) { - if ($value !== '') { - $temp = $this->MetaFields->newEmptyEntity(); - $temp->field = $metaField; - $temp->value = $value; - $temp->scope = $this->Table->metaFields; - $temp->parent_id = $id; - $this->MetaFields->save($temp); + foreach ($metaFields as $metaField => $values) { + if (!is_array($values)) { + $values = [$values]; + } + foreach ($values as $value) { + if ($value !== '') { + $temp = $this->MetaFields->newEmptyEntity(); + $temp->field = $metaField; + $temp->value = $value; + $temp->scope = $this->Table->metaFields; + $temp->parent_id = $id; + $temp->meta_template_id = $templateID; + $temp->meta_template_field_id = $fieldNameToId[$metaField]; + $this->MetaFields->save($temp); + } } } } @@ -227,7 +234,7 @@ class CRUDComponent extends Component return $data; } $query = $this->MetaFields->find(); - $query->where(['scope' => $this->Table->metaFields, 'parent_id' => $id]); + $query->where(['MetaFields.scope' => $this->Table->metaFields, 'MetaFields.parent_id' => $id]); $metaFields = $query->all(); $data['metaFields'] = []; foreach($metaFields as $metaField) { diff --git a/src/Model/Table/MetaFieldsTable.php b/src/Model/Table/MetaFieldsTable.php index e0abcab..765c8dd 100644 --- a/src/Model/Table/MetaFieldsTable.php +++ b/src/Model/Table/MetaFieldsTable.php @@ -13,6 +13,8 @@ class MetaFieldsTable extends AppTable parent::initialize($config); $this->addBehavior('UUID'); $this->setDisplayField('field'); + $this->hasOne('MetaTemplates'); + $this->belongsTo('MetaTemplateFields'); } public function validationDefault(Validator $validator): Validator @@ -22,7 +24,9 @@ class MetaFieldsTable extends AppTable ->notEmptyString('field') ->notEmptyString('uuid') ->notEmptyString('value') - ->requirePresence(['scope', 'field', 'value', 'uuid'], 'create'); + ->notEmptyString('meta_template_id') + ->notEmptyString('meta_template_field_id') + ->requirePresence(['scope', 'field', 'value', 'uuid', 'meta_template_id', 'meta_template_field_id'], 'create'); return $validator; } } diff --git a/src/View/Helper/BootstrapHelper.php b/src/View/Helper/BootstrapHelper.php index b44c0f4..a451959 100644 --- a/src/View/Helper/BootstrapHelper.php +++ b/src/View/Helper/BootstrapHelper.php @@ -138,6 +138,13 @@ class BootstrapTabs extends Helper $this->data['navs'][$activeTab]['active'] = true; $this->options['vertical-size'] = $this->options['vertical-size'] < 0 || $this->options['vertical-size'] > 11 ? 3 : $this->options['vertical-size']; + + if (!is_array($this->options['nav-class'])) { + $this->options['nav-class'] = [$this->options['nav-class']]; + } + if (!is_array($this->options['content-class'])) { + $this->options['content-class'] = [$this->options['content-class']]; + } } private function checkOptionValidity() diff --git a/templates/Organisations/add.php b/templates/Organisations/add.php index 37fefe7..654e367 100644 --- a/templates/Organisations/add.php +++ b/templates/Organisations/add.php @@ -29,7 +29,8 @@ 'field' => 'type' ) ), - 'metaFields' => empty($metaFields) ? [] : $metaFields, + // 'metaFields' => empty($metaFields) ? [] : $metaFields, + 'metaTemplates' => empty($metaTemplates) ? [] : $metaTemplates, 'submit' => array( 'action' => $this->request->getParam('action') ) diff --git a/templates/element/genericElements/Form/genericForm.php b/templates/element/genericElements/Form/genericForm.php index ed73cf1..864aca7 100644 --- a/templates/element/genericElements/Form/genericForm.php +++ b/templates/element/genericElements/Form/genericForm.php @@ -62,19 +62,12 @@ ); } } - $metaFieldString = ''; - if (!empty($data['metaFields'])) { - foreach ($data['metaFields'] as $metaField) { - $metaField['label'] = \Cake\Utility\Inflector::humanize($metaField['field']); - $metaField['field'] = 'metaFields.' . $metaField['field']; - $metaFieldString .= $this->element( - 'genericElements/Form/fieldScaffold', [ - 'fieldData' => $metaField->toArray(), - 'form' => $this->Form - ] - ); - } - } + $metaTemplateString = $this->element( + 'genericElements/Form/metaTemplateScaffold', [ + 'metaTemplatesData' => $data['metaTemplates'], + 'form' => $this->Form, + ] + ); $submitButtonData = ['model' => $modelForForm, 'formRandomValue' => $formRandomValue]; if (!empty($data['submit'])) { $submitButtonData = array_merge($submitButtonData, $data['submit']); @@ -104,9 +97,9 @@ $ajaxFlashMessage, $formCreate, $fieldsString, - empty($metaFieldString) ? '' : $this->element( + empty($metaTemplateString) ? '' : $this->element( 'genericElements/accordion_scaffold', [ - 'body' => $metaFieldString, + 'body' => $metaTemplateString, 'title' => 'Meta fields' ] ), diff --git a/templates/element/genericElements/Form/metaTemplateScaffold.php b/templates/element/genericElements/Form/metaTemplateScaffold.php new file mode 100644 index 0000000..cf32d35 --- /dev/null +++ b/templates/element/genericElements/Form/metaTemplateScaffold.php @@ -0,0 +1,26 @@ + $metaTemplate) { + $tabData['navs'][$i] = [ + 'text' => $metaTemplate->name + ]; + $fieldsHtml = ''; + foreach ($metaTemplate->meta_template_fields as $metaField) { + $metaField->label = Inflector::humanize($metaField->field); + $metaField->field = sprintf('%s.%s.%s', 'metaFields', $metaTemplate->id, $metaField->field); + $fieldsHtml .= $this->element( + 'genericElements/Form/fieldScaffold', [ + 'fieldData' => $metaField->toArray(), + 'form' => $this->Form + ] + ); + } + $tabData['content'][$i] = $fieldsHtml; +} +echo $this->Bootstrap->Tabs([ + 'pills' => true, + 'data' => $tabData, + 'nav-class' => ['pb-1'] +]); \ No newline at end of file