From 1135573af68d43ebe35d3f46cf7ccb7af887dc4e Mon Sep 17 00:00:00 2001 From: Taras Machyshyn Date: Tue, 28 Apr 2015 11:59:05 +0300 Subject: [PATCH] Metadata changes: generated fields now added to metadata --- .../Core/Utils/Database/Orm/Converter.php | 61 ++----------------- application/Espo/Core/Utils/Metadata.php | 43 +++++++++++++ .../Espo/Core/Utils/Metadata/Utils.php | 54 +++++++++++++++- .../Resources/metadata/fields/address.json | 5 +- .../Resources/metadata/fields/personName.json | 2 +- 5 files changed, 104 insertions(+), 61 deletions(-) diff --git a/application/Espo/Core/Utils/Database/Orm/Converter.php b/application/Espo/Core/Utils/Database/Orm/Converter.php index 580837462d..e83e7cb872 100644 --- a/application/Espo/Core/Utils/Database/Orm/Converter.php +++ b/application/Espo/Core/Utils/Database/Orm/Converter.php @@ -82,7 +82,6 @@ class Converter 'len' => '24', ); - public function __construct(\Espo\Core\Utils\Metadata $metadata, \Espo\Core\Utils\File\Manager $fileManager) { $this->metadata = $metadata; @@ -93,7 +92,6 @@ class Converter $this->metadataUtils = new \Espo\Core\Utils\Metadata\Utils($this->metadata); } - protected function getMetadata() { return $this->metadata; @@ -227,24 +225,9 @@ class Converter /** check if "fields" option exists in $fieldMeta */ $fieldTypeMeta = $this->getMetadataUtils()->getFieldDefsByType($fieldParams); - if (isset($fieldTypeMeta['fields']) && is_array($fieldTypeMeta['fields'])) { - - foreach($fieldTypeMeta['actualFields'] as $subFieldName) { - - $subField = $this->convertActualFields($entityName, $fieldName, $fieldParams, $subFieldName, $fieldTypeMeta); - - if (!isset($outputMeta[ $subField['naming'] ])) { - $subFieldDefs = $this->convertField($entityName, $subField['name'], $subField['params']); - if ($subFieldDefs !== false) { - $outputMeta[ $subField['naming'] ] = $subFieldDefs; //push fieldDefs to the main array - } - } - } - } else { - $fieldDefs = $this->convertField($entityName, $fieldName, $fieldParams, $fieldTypeMeta); - if ($fieldDefs !== false) { - $outputMeta[$fieldName] = $fieldDefs; //push fieldDefs to the main array - } + $fieldDefs = $this->convertField($entityName, $fieldName, $fieldParams, $fieldTypeMeta); + if ($fieldDefs !== false) { + $outputMeta[$fieldName] = $fieldDefs; //push fieldDefs to the main array } /** check and set the linkDefs from 'fields' metadata */ @@ -310,17 +293,12 @@ class Converter if (isset($scopeDefs['stream']) && $scopeDefs['stream']) { if (!isset($entityMeta['fields']['isFollowed'])) { $ormMeta[$entityName]['fields']['isFollowed'] = array( - 'type' => 'bool', + 'type' => 'varchar', 'notStorable' => true, ); } } //END: add a field 'isFollowed' for stream => true - $ormMeta[$entityName]['fields']['isEditable'] = array( - 'type' => 'bool', - 'notStorable' => true - ); - return $ormMeta; } @@ -366,37 +344,6 @@ class Converter return $fieldDefs; } - protected function convertActualFields($entityName, $fieldName, $fieldParams, $subFieldName, $fieldTypeMeta) - { - $subField = array(); - - $subField['params'] = $this->getInitValues($fieldParams); - - if (isset($fieldTypeMeta['fieldDefs'])) { - $subField['params'] = Util::merge($subField['params'], $fieldTypeMeta['fieldDefs']); - } - - //if empty field name, then use the main field - if (trim($subFieldName) == '') { - - $subField['name'] = $fieldName; - $subField['naming'] = $fieldName; - - } else { - - $namingType = isset($fieldTypeMeta['naming']) ? $fieldTypeMeta['naming'] : $this->defaultNaming; - - $subField['name'] = $subFieldName; - $subField['naming'] = Util::getNaming($fieldName, $subFieldName, $namingType); - if (isset($fieldTypeMeta['fields'][$subFieldName])) { - $subField['params'] = Util::merge($subField['params'], $fieldTypeMeta['fields'][$subFieldName]); - } - - } - - return $subField; - } - protected function convertLinks($entityName, $entityMeta, $ormMeta) { if (!isset($entityMeta['links'])) { diff --git a/application/Espo/Core/Utils/Metadata.php b/application/Espo/Core/Utils/Metadata.php index 58a16ba517..236c2da4ca 100644 --- a/application/Espo/Core/Utils/Metadata.php +++ b/application/Espo/Core/Utils/Metadata.php @@ -35,6 +35,7 @@ class Metadata private $fileManager; private $converter; private $moduleConfig; + private $metadataUtils; /** * @var string - uses for loading default values @@ -109,6 +110,15 @@ class Metadata return $this->moduleConfig; } + protected function getMetadataUtils() + { + if (!isset($this->metadataUtils)) { + $this->metadataUtils = new Metadata\Utils($this); + } + + return $this->metadataUtils; + } + public function isCached() { if (!$this->getConfig()->get('useCache')) { @@ -139,6 +149,7 @@ class Metadata } else { $this->meta = $this->getUnifier()->unify($this->name, $this->paths, true); $this->meta = $this->setLanguageFromConfig($this->meta); + $this->meta = $this->addAdditionalFields($this->meta); if ($this->getConfig()->get('useCache')) { $isSaved = $this->getFileManager()->putPhpContents($this->cacheFile, $this->meta); @@ -197,6 +208,7 @@ class Metadata } /** + * todo: move to a separate file * Set language list and default for Settings, Preferences metadata * * @param array $data Meta @@ -222,6 +234,37 @@ class Metadata return $data; } + /** + * todo: move to a separate file + * Add additional fields defined from metadata -> fields + * + * @param array $meta + */ + protected function addAdditionalFields(array $meta) + { + $metaCopy = $meta; + $definitionList = $meta['fields']; + + foreach ($metaCopy['entityDefs'] as $entityName => $entityParams) { + foreach ($entityParams['fields'] as $fieldName => $fieldParams) { + + $additionalFields = $this->getMetadataUtils()->getAdditionalFieldList($fieldName, $fieldParams, $definitionList); + if (!empty($additionalFields)) { + //merge or add to the end of meta array + foreach ($additionalFields as $subFieldName => $subFieldParams) { + if (isset($entityParams['fields'][$subFieldName])) { + $meta['entityDefs'][$entityName]['fields'][$subFieldName] = Util::merge($subFieldParams, $entityParams['fields'][$subFieldName]); + } else { + $meta['entityDefs'][$entityName]['fields'][$subFieldName] = $subFieldParams; + } + } + } + } + } + + return $meta; + } + /** * Set Metadata data * Ex. $key1 = menu, $key2 = Account then will be created a file metadataFolder/menu/Account.json diff --git a/application/Espo/Core/Utils/Metadata/Utils.php b/application/Espo/Core/Utils/Metadata/Utils.php index 56adc7f72d..bc463b66e8 100644 --- a/application/Espo/Core/Utils/Metadata/Utils.php +++ b/application/Espo/Core/Utils/Metadata/Utils.php @@ -22,10 +22,26 @@ namespace Espo\Core\Utils\Metadata; +use Espo\Core\Utils\Util; + class Utils { private $metadata; + protected $defaultNaming = 'postfix'; + + /** + * List of copied params for metadata -> 'fields' from parent items + */ + protected $copiedDefParams = array( + 'readOnly', + 'notStorable', + 'layoutListDisabled', + 'layoutDetailDisabled', + 'layoutMassUpdateDisabled', + 'layoutFiltersDisabled', + ); + public function __construct(\Espo\Core\Utils\Metadata $metadata) { $this->metadata = $metadata; @@ -102,7 +118,41 @@ class Utils return $linkFieldDefsByType; } -} + /** + * Get additional field list based on field definition in metadata 'fields' + * + * @param string $fieldName + * @param array $fieldParams + * @param array|null $definitionList + * + * @return array + */ + public function getAdditionalFieldList($fieldName, array $fieldParams, array $definitionList = null) + { + if (empty($fieldParams['type'])) { + return; + } + $fieldType = $fieldParams['type']; + $fieldDefinition = isset($definitionList[$fieldType]) ? $definitionList[$fieldType] : $this->getMetadata()->get('fields.'.$fieldType); -?> + if (!empty($fieldDefinition['fields']) && is_array($fieldDefinition['fields'])) { + + $copiedParams = array_intersect_key($fieldParams, array_flip($this->copiedDefParams)); + + $additionalFields = array(); + + //add additional fields + foreach ($fieldDefinition['fields'] as $subFieldName => $subFieldParams) { + $namingType = isset($fieldDefinition['naming']) ? $fieldDefinition['naming'] : $this->defaultNaming; + + $subFieldNaming = Util::getNaming($fieldName, $subFieldName, $namingType); + $additionalFields[$subFieldNaming] = array_merge($copiedParams, $subFieldParams); + } + + return $additionalFields; + } + + } + +} \ No newline at end of file diff --git a/application/Espo/Resources/metadata/fields/address.json b/application/Espo/Resources/metadata/fields/address.json index 832b8f3146..b34c546459 100644 --- a/application/Espo/Resources/metadata/fields/address.json +++ b/application/Espo/Resources/metadata/fields/address.json @@ -27,5 +27,8 @@ }, "mergable":false, "notCreatable": false, - "filter": true + "filter": true, + "fieldDefs":{ + "skip":true + } } diff --git a/application/Espo/Resources/metadata/fields/personName.json b/application/Espo/Resources/metadata/fields/personName.json index 1b5d713851..d09f8421f3 100644 --- a/application/Espo/Resources/metadata/fields/personName.json +++ b/application/Espo/Resources/metadata/fields/personName.json @@ -20,6 +20,6 @@ "notCreatable": true, "filter": true, "fieldDefs":{ - "default":"" + "notStorable":true } }