Metadata changes: generated fields now added to metadata

This commit is contained in:
Taras Machyshyn
2015-04-28 11:59:05 +03:00
parent 6dbeba3473
commit 1135573af6
5 changed files with 104 additions and 61 deletions

View File

@@ -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'])) {

View File

@@ -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

View File

@@ -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;
}
}
}

View File

@@ -27,5 +27,8 @@
},
"mergable":false,
"notCreatable": false,
"filter": true
"filter": true,
"fieldDefs":{
"skip":true
}
}

View File

@@ -20,6 +20,6 @@
"notCreatable": true,
"filter": true,
"fieldDefs":{
"default":""
"notStorable":true
}
}