104fd306cSNickeau<?php 204fd306cSNickeau 304fd306cSNickeau 404fd306cSNickeaunamespace ComboStrap\Meta\Form; 504fd306cSNickeau 604fd306cSNickeau 704fd306cSNickeauuse ComboStrap\Canonical; 804fd306cSNickeauuse ComboStrap\DataType; 904fd306cSNickeauuse ComboStrap\ExceptionBadArgument; 1004fd306cSNickeauuse ComboStrap\ExceptionNotFound; 1104fd306cSNickeauuse ComboStrap\ExceptionRuntimeInternal; 1204fd306cSNickeauuse ComboStrap\Html; 1304fd306cSNickeauuse ComboStrap\LogUtility; 1404fd306cSNickeauuse ComboStrap\Meta\Api\Metadata; 1504fd306cSNickeauuse ComboStrap\Meta\Api\MetadataSystem; 1604fd306cSNickeauuse ComboStrap\Meta\Api\MetadataMultiple; 1704fd306cSNickeauuse ComboStrap\Meta\Api\MetadataTabular; 1804fd306cSNickeauuse ComboStrap\PageDescription; 1904fd306cSNickeauuse ComboStrap\PluginUtility; 2004fd306cSNickeauuse ComboStrap\ResourceName; 2104fd306cSNickeauuse ComboStrap\Web\Url; 2204fd306cSNickeau 2304fd306cSNickeau/** 2404fd306cSNickeau * Class FormField 2504fd306cSNickeau * @package ComboStrap 2604fd306cSNickeau * 2704fd306cSNickeau * A class that represents a tree of form field. 2804fd306cSNickeau * 2904fd306cSNickeau * Each field can be a scalar, a list or 3004fd306cSNickeau * tabular by adding child fields. 3104fd306cSNickeau * 3204fd306cSNickeau * 3304fd306cSNickeau */ 3404fd306cSNickeauclass FormMetaField 3504fd306cSNickeau{ 3604fd306cSNickeau 3704fd306cSNickeau 3804fd306cSNickeau /** 3904fd306cSNickeau * The JSON attribute 4004fd306cSNickeau */ 4104fd306cSNickeau public const TAB_ATTRIBUTE = "tab"; 4204fd306cSNickeau public const LABEL_ATTRIBUTE = "label"; 4304fd306cSNickeau public const URL_ATTRIBUTE = "url"; 4404fd306cSNickeau public const MUTABLE_ATTRIBUTE = "mutable"; 4504fd306cSNickeau /** 4604fd306cSNickeau * A value may be a scalar or an array 4704fd306cSNickeau */ 4804fd306cSNickeau public const VALUE_ATTRIBUTE = "value"; 4904fd306cSNickeau public const DEFAULT_VALUE_ATTRIBUTE = "default"; 5004fd306cSNickeau 5104fd306cSNickeau public const DOMAIN_VALUES_ATTRIBUTE = "domain-values"; 5204fd306cSNickeau public const WIDTH_ATTRIBUTE = "width"; 5304fd306cSNickeau public const CHILDREN_ATTRIBUTE = "children"; 5404fd306cSNickeau const DESCRIPTION_ATTRIBUTE = PageDescription::PROPERTY_NAME; 5504fd306cSNickeau const NAME_ATTRIBUTE = ResourceName::PROPERTY_NAME; 5604fd306cSNickeau const MULTIPLE_ATTRIBUTE = "multiple"; 5704fd306cSNickeau const TYPE_ATTRIBUTE = DataType::PROPERTY_NAME; 5804fd306cSNickeau 5904fd306cSNickeau 6004fd306cSNickeau private $name; 6104fd306cSNickeau /** 6204fd306cSNickeau * @var bool 6304fd306cSNickeau */ 6404fd306cSNickeau private $mutable; 6504fd306cSNickeau /** 6604fd306cSNickeau * @var string 6704fd306cSNickeau */ 6804fd306cSNickeau private $tab; 6904fd306cSNickeau /** 7004fd306cSNickeau * @var string 7104fd306cSNickeau */ 7204fd306cSNickeau private $label; 7304fd306cSNickeau private $description; 7404fd306cSNickeau /** 7504fd306cSNickeau * If canonical is set, an url is also send 7604fd306cSNickeau */ 7704fd306cSNickeau private string $canonical; 7804fd306cSNickeau private array $values = []; 7904fd306cSNickeau private array $defaults = []; 8004fd306cSNickeau /** 8104fd306cSNickeau * @var string 8204fd306cSNickeau */ 8304fd306cSNickeau private $type; 8404fd306cSNickeau /** 8504fd306cSNickeau * @var array 8604fd306cSNickeau */ 8704fd306cSNickeau private $domainValues; 8804fd306cSNickeau /** 8904fd306cSNickeau * @var FormMetaField[] 9004fd306cSNickeau */ 9104fd306cSNickeau private $children; 9204fd306cSNickeau /** 9304fd306cSNickeau * @var int 9404fd306cSNickeau */ 9504fd306cSNickeau private $width; 9604fd306cSNickeau /** 9704fd306cSNickeau * Multiple value can be chosen 9804fd306cSNickeau * @var bool 9904fd306cSNickeau */ 10004fd306cSNickeau private $multiple = false; 10104fd306cSNickeau 10204fd306cSNickeau 10304fd306cSNickeau /** 10404fd306cSNickeau * FormField constructor. 10504fd306cSNickeau * The name is mandatory 10604fd306cSNickeau * and the type to be able to control the values 10704fd306cSNickeau */ 10804fd306cSNickeau public function __construct($name, $type) 10904fd306cSNickeau { 11004fd306cSNickeau $this->name = $name; 11104fd306cSNickeau $this->label = ucfirst($name); 11204fd306cSNickeau $this->description = $name; 11304fd306cSNickeau if (!in_array($type, DataType::TYPES)) { 11404fd306cSNickeau throw new ExceptionRuntimeInternal("The type ($type) is not a known field type"); 11504fd306cSNickeau } 11604fd306cSNickeau $this->type = $type; 11704fd306cSNickeau $this->mutable = true; 11804fd306cSNickeau } 11904fd306cSNickeau 12004fd306cSNickeau public static function create(string $name, string $type): FormMetaField 12104fd306cSNickeau { 12204fd306cSNickeau return new FormMetaField($name, $type); 12304fd306cSNickeau } 12404fd306cSNickeau 12504fd306cSNickeau /** 12604fd306cSNickeau * Almost because a form does not allow hierarchical data 12704fd306cSNickeau * We send an error in this case 12804fd306cSNickeau * @param Metadata $metadata 12904fd306cSNickeau * @return FormMetaField 13004fd306cSNickeau */ 13104fd306cSNickeau public static function createFromMetadata(Metadata $metadata): FormMetaField 13204fd306cSNickeau { 13304fd306cSNickeau $field = FormMetaField::create($metadata->getName(), $metadata->getDataType()); 13404fd306cSNickeau 13504fd306cSNickeau self::setCommonDataToFieldFromMetadata($field, $metadata); 13604fd306cSNickeau 13704fd306cSNickeau $childrenMetadata = $metadata->getChildrenClass(); 13804fd306cSNickeau 13904fd306cSNickeau try { 14004fd306cSNickeau $metadata->getParent(); 14104fd306cSNickeau } catch (ExceptionNotFound $e) { 14204fd306cSNickeau /** 14304fd306cSNickeau * Only the top field have a tab value 14404fd306cSNickeau */ 14504fd306cSNickeau $field->setTab($metadata->getTab()); 14604fd306cSNickeau } 14704fd306cSNickeau 14804fd306cSNickeau 14904fd306cSNickeau /** 15004fd306cSNickeau * No children 15104fd306cSNickeau */ 15204fd306cSNickeau if (count($childrenMetadata) === 0) { 15304fd306cSNickeau 15404fd306cSNickeau static::setLeafDataToFieldFromMetadata($field, $metadata); 15504fd306cSNickeau 15604fd306cSNickeau /** 15704fd306cSNickeau * When tabular, the value comes from the parent 15804fd306cSNickeau */ 15904fd306cSNickeau if ($metadata->isScalar()) { 16004fd306cSNickeau $value = $metadata->toStoreValue(); 16104fd306cSNickeau $defaultValue = $metadata->toStoreDefaultValue(); 16204fd306cSNickeau $field->addValue($value, $defaultValue); 16304fd306cSNickeau } 16404fd306cSNickeau 16504fd306cSNickeau } else { 16604fd306cSNickeau 16704fd306cSNickeau if ($metadata instanceof MetadataTabular) { 16804fd306cSNickeau 16904fd306cSNickeau $childFields = []; 17004fd306cSNickeau foreach ($metadata->getChildrenClass() as $childMetadataClass) { 17104fd306cSNickeau 17204fd306cSNickeau try { 17304fd306cSNickeau $childMetadata = MetadataSystem::toMetadataObject($childMetadataClass, $metadata); 17404fd306cSNickeau } catch (ExceptionBadArgument $e) { 17504fd306cSNickeau // should happen only internally 17604fd306cSNickeau LogUtility::internalError("The metadata class/object ($childMetadataClass) is not a metadata class"); 17704fd306cSNickeau continue; 17804fd306cSNickeau } 17904fd306cSNickeau $childField = FormMetaField::createFromMetadata($childMetadata); 18004fd306cSNickeau static::setCommonDataToFieldFromMetadata($childField, $childMetadata); 18104fd306cSNickeau static::setLeafDataToFieldFromMetadata($childField, $childMetadata); 18204fd306cSNickeau $field->addColumn($childField); 18304fd306cSNickeau $childFields[$childMetadata::getPersistentName()] = $childField; 18404fd306cSNickeau } 18504fd306cSNickeau try { 18604fd306cSNickeau $rows = $metadata->getValue(); 18704fd306cSNickeau } catch (ExceptionNotFound $e) { 18804fd306cSNickeau $rows = null; 18904fd306cSNickeau } 19004fd306cSNickeau if ($rows !== null) { 19104fd306cSNickeau $defaultRow = null; 19204fd306cSNickeau try { 19304fd306cSNickeau $defaultRows = $metadata->getDefaultValue(); 19404fd306cSNickeau $defaultRow = $defaultRows[0]; 19504fd306cSNickeau } catch (ExceptionNotFound $e) { 19604fd306cSNickeau // no default row 19704fd306cSNickeau } 19804fd306cSNickeau foreach ($rows as $row) { 19904fd306cSNickeau foreach ($childFields as $childName => $childField) { 200*70bbd7f1Sgerardnico $colValue = $row[$childName] ?? null; 20104fd306cSNickeau if ($colValue === null) { 20204fd306cSNickeau if ($defaultRow === null) { 20304fd306cSNickeau continue; 20404fd306cSNickeau } 20504fd306cSNickeau $colValue = $defaultRow[$childName]; 20604fd306cSNickeau if ($colValue === null) { 20704fd306cSNickeau continue; 20804fd306cSNickeau } 20904fd306cSNickeau } 21004fd306cSNickeau $storeValue = $colValue->toStoreValue(); 21104fd306cSNickeau $defaultStoreValue = $colValue->toStoreDefaultValue(); 21204fd306cSNickeau $childField->addValue($storeValue, $defaultStoreValue); 21304fd306cSNickeau } 21404fd306cSNickeau 21504fd306cSNickeau } 21604fd306cSNickeau 21704fd306cSNickeau // Add an extra empty row to allow adding an image 21804fd306cSNickeau if ($defaultRow !== null) { 21904fd306cSNickeau foreach ($defaultRow as $colName => $colMetadata) { 22004fd306cSNickeau if ($colName === null) { 22104fd306cSNickeau LogUtility::internalError("The persistence name (column name) should be set as key for the default rows"); 22204fd306cSNickeau continue; 22304fd306cSNickeau } 22404fd306cSNickeau $defaultColValue = null; 22504fd306cSNickeau if ($colMetadata !== null) { 22604fd306cSNickeau $defaultColValue = $colMetadata->toStoreDefaultValue(); 22704fd306cSNickeau } 22804fd306cSNickeau $childField = $childFields[$colName]; 22904fd306cSNickeau $childField->addValue(null, $defaultColValue); 23004fd306cSNickeau } 23104fd306cSNickeau } 23204fd306cSNickeau } else { 23304fd306cSNickeau 23404fd306cSNickeau 23504fd306cSNickeau // No rows, show the default rows 23604fd306cSNickeau try { 23704fd306cSNickeau $rows = $metadata->getDefaultValue(); 23804fd306cSNickeau } catch (ExceptionNotFound $e) { 23904fd306cSNickeau // no default row ok 24004fd306cSNickeau $rows = []; 24104fd306cSNickeau } 24204fd306cSNickeau foreach ($rows as $row) { 24304fd306cSNickeau foreach ($row as $colName => $colValue) { 24404fd306cSNickeau if ($colValue === null) { 24504fd306cSNickeau continue; 24604fd306cSNickeau } 24704fd306cSNickeau $childField = $childFields[$colName]; 24804fd306cSNickeau $childField->addValue(null, $colValue->toStoreValue()); 24904fd306cSNickeau } 25004fd306cSNickeau } 25104fd306cSNickeau 25204fd306cSNickeau } 25304fd306cSNickeau 25404fd306cSNickeau 25504fd306cSNickeau } else { 25604fd306cSNickeau 25704fd306cSNickeau LogUtility::msg("Hierarchical data is not supported in a form. Metadata ($metadata) has children and is not tabular"); 25804fd306cSNickeau } 25904fd306cSNickeau } 26004fd306cSNickeau return $field; 26104fd306cSNickeau 26204fd306cSNickeau } 26304fd306cSNickeau 26404fd306cSNickeau 26504fd306cSNickeau public 26604fd306cSNickeau function toAssociativeArray(): array 26704fd306cSNickeau { 26804fd306cSNickeau /** 26904fd306cSNickeau * Mandatory attributes 27004fd306cSNickeau */ 27104fd306cSNickeau $associative = [ 27204fd306cSNickeau self::NAME_ATTRIBUTE => $this->name, 27304fd306cSNickeau self::LABEL_ATTRIBUTE => $this->label, 27404fd306cSNickeau self::TYPE_ATTRIBUTE => $this->type 27504fd306cSNickeau ]; 27604fd306cSNickeau 27704fd306cSNickeau try { 27804fd306cSNickeau $associative[self::URL_ATTRIBUTE] = $this->getUrl()->toString(); 27904fd306cSNickeau } catch (ExceptionNotFound $e) { 28004fd306cSNickeau // ok 28104fd306cSNickeau } 28204fd306cSNickeau 28304fd306cSNickeau if ($this->description != null) { 28404fd306cSNickeau $associative[self::DESCRIPTION_ATTRIBUTE] = $this->description; 28504fd306cSNickeau } 28604fd306cSNickeau /** 28704fd306cSNickeau * For child form field (ie column), there is no tab 28804fd306cSNickeau */ 28904fd306cSNickeau if ($this->tab != null) { 29004fd306cSNickeau $associative[self::TAB_ATTRIBUTE] = $this->tab; 29104fd306cSNickeau } 29204fd306cSNickeau 29304fd306cSNickeau 29404fd306cSNickeau if ($this->width !== null) { 29504fd306cSNickeau $associative[self::WIDTH_ATTRIBUTE] = $this->width; 29604fd306cSNickeau } 29704fd306cSNickeau if ($this->children !== null) { 29804fd306cSNickeau foreach ($this->children as $column) { 29904fd306cSNickeau $associative[self::CHILDREN_ATTRIBUTE][] = $column->toAssociativeArray(); 30004fd306cSNickeau } 30104fd306cSNickeau } else { 30204fd306cSNickeau 30304fd306cSNickeau /** 30404fd306cSNickeau * Only valid for leaf field 30504fd306cSNickeau */ 30604fd306cSNickeau if ($this->getValue() !== null && $this->getValue() !== "") { 30704fd306cSNickeau $associative[self::VALUE_ATTRIBUTE] = $this->getValue(); 30804fd306cSNickeau } 30904fd306cSNickeau 31004fd306cSNickeau if ($this->getDefaultValue() !== null) { 31104fd306cSNickeau $associative[self::DEFAULT_VALUE_ATTRIBUTE] = $this->getDefaultValue(); 31204fd306cSNickeau } 31304fd306cSNickeau 31404fd306cSNickeau if ($this->domainValues !== null) { 31504fd306cSNickeau $associative[self::DOMAIN_VALUES_ATTRIBUTE] = $this->domainValues; 31604fd306cSNickeau if ($this->multiple) { 31704fd306cSNickeau $associative[self::MULTIPLE_ATTRIBUTE] = $this->multiple; 31804fd306cSNickeau } 31904fd306cSNickeau } 32004fd306cSNickeau 32104fd306cSNickeau $associative[self::MUTABLE_ATTRIBUTE] = $this->mutable; 32204fd306cSNickeau 32304fd306cSNickeau 32404fd306cSNickeau } 32504fd306cSNickeau 32604fd306cSNickeau 32704fd306cSNickeau return $associative; 32804fd306cSNickeau } 32904fd306cSNickeau 33004fd306cSNickeau public 33104fd306cSNickeau function setMutable(bool $bool): FormMetaField 33204fd306cSNickeau { 33304fd306cSNickeau $this->mutable = $bool; 33404fd306cSNickeau return $this; 33504fd306cSNickeau } 33604fd306cSNickeau 33704fd306cSNickeau 33804fd306cSNickeau public 33904fd306cSNickeau function setTab(string $tabName): FormMetaField 34004fd306cSNickeau { 34104fd306cSNickeau Html::validNameGuard($tabName); 34204fd306cSNickeau $this->tab = $tabName; 34304fd306cSNickeau return $this; 34404fd306cSNickeau } 34504fd306cSNickeau 34604fd306cSNickeau public 34704fd306cSNickeau function setLabel(string $label): FormMetaField 34804fd306cSNickeau { 34904fd306cSNickeau $this->label = $label; 35004fd306cSNickeau return $this; 35104fd306cSNickeau } 35204fd306cSNickeau 35304fd306cSNickeau /** 35404fd306cSNickeau * @throws ExceptionNotFound 35504fd306cSNickeau */ 35604fd306cSNickeau public 35704fd306cSNickeau function getUrl(): Url 35804fd306cSNickeau { 35904fd306cSNickeau if (!isset($this->canonical)) { 36004fd306cSNickeau throw new ExceptionNotFound(); 36104fd306cSNickeau } 36204fd306cSNickeau 36304fd306cSNickeau return Canonical::createFromValue($this->canonical) 36404fd306cSNickeau ->getComboStrapUrlForDocumentation(); 36504fd306cSNickeau 36604fd306cSNickeau } 36704fd306cSNickeau 36804fd306cSNickeau public 36904fd306cSNickeau function setCanonical(string $canonical): FormMetaField 37004fd306cSNickeau { 37104fd306cSNickeau $this->canonical = $canonical; 37204fd306cSNickeau return $this; 37304fd306cSNickeau } 37404fd306cSNickeau 37504fd306cSNickeau public 37604fd306cSNickeau function setDescription(string $string): FormMetaField 37704fd306cSNickeau { 37804fd306cSNickeau $this->description = $string; 37904fd306cSNickeau return $this; 38004fd306cSNickeau } 38104fd306cSNickeau 38204fd306cSNickeau /** 38304fd306cSNickeau * @param boolean|string|null $value 38404fd306cSNickeau * @param boolean|string|null $defaultValuePlaceholderOrReturned - the value set as placeholder or return value for a checked checkbox 38504fd306cSNickeau * @return $this 38604fd306cSNickeau */ 38704fd306cSNickeau public 38804fd306cSNickeau function addValue($value, $defaultValuePlaceholderOrReturned = null): FormMetaField 38904fd306cSNickeau { 39004fd306cSNickeau if ($this->getType() === DataType::BOOLEAN_TYPE_VALUE) { 39104fd306cSNickeau if ($value != null && !DataType::isBoolean($value)) { 39204fd306cSNickeau throw new ExceptionRuntimeInternal("The value ($value) is not a boolean"); 39304fd306cSNickeau } 39404fd306cSNickeau if ($defaultValuePlaceholderOrReturned != null && !DataType::isBoolean($defaultValuePlaceholderOrReturned)) { 39504fd306cSNickeau throw new ExceptionRuntimeInternal("The default value ($defaultValuePlaceholderOrReturned) is not a boolean"); 39604fd306cSNickeau } 39704fd306cSNickeau } 39804fd306cSNickeau $this->values[] = $value; 39904fd306cSNickeau $this->defaults[] = $defaultValuePlaceholderOrReturned; 40004fd306cSNickeau return $this; 40104fd306cSNickeau } 40204fd306cSNickeau 40304fd306cSNickeau 40404fd306cSNickeau public 40504fd306cSNickeau function setDomainValues(array $domainValues): FormMetaField 40604fd306cSNickeau { 40704fd306cSNickeau $this->domainValues = $domainValues; 40804fd306cSNickeau return $this; 40904fd306cSNickeau } 41004fd306cSNickeau 41104fd306cSNickeau public 41204fd306cSNickeau function addColumn(FormMetaField $formField): FormMetaField 41304fd306cSNickeau { 41404fd306cSNickeau $this->type = DataType::TABULAR_TYPE_VALUE; 41504fd306cSNickeau // A parent node is not mutable 41604fd306cSNickeau $this->mutable = false; 41704fd306cSNickeau $this->children[] = $formField; 41804fd306cSNickeau return $this; 41904fd306cSNickeau } 42004fd306cSNickeau 42104fd306cSNickeau public 42204fd306cSNickeau function setWidth(int $int): FormMetaField 42304fd306cSNickeau { 42404fd306cSNickeau $this->width = $int; 42504fd306cSNickeau return $this; 42604fd306cSNickeau } 42704fd306cSNickeau 42804fd306cSNickeau public 42904fd306cSNickeau function getTab(): string 43004fd306cSNickeau { 43104fd306cSNickeau return $this->tab; 43204fd306cSNickeau } 43304fd306cSNickeau 43404fd306cSNickeau public 43504fd306cSNickeau function getName() 43604fd306cSNickeau { 43704fd306cSNickeau return $this->name; 43804fd306cSNickeau } 43904fd306cSNickeau 44004fd306cSNickeau public 44104fd306cSNickeau function getValue() 44204fd306cSNickeau { 44304fd306cSNickeau switch (sizeof($this->values)) { 44404fd306cSNickeau case 0: 44504fd306cSNickeau return null; 44604fd306cSNickeau case 1: 44704fd306cSNickeau $value = $this->values[0]; 44804fd306cSNickeau if ($value !== null) { 44904fd306cSNickeau return $this->values[0]; 45004fd306cSNickeau } 45104fd306cSNickeau return null; 45204fd306cSNickeau default: 45304fd306cSNickeau return $this->values; 45404fd306cSNickeau } 45504fd306cSNickeau } 45604fd306cSNickeau 45704fd306cSNickeau public 45804fd306cSNickeau function isMutable(): bool 45904fd306cSNickeau { 46004fd306cSNickeau return $this->mutable; 46104fd306cSNickeau } 46204fd306cSNickeau 46304fd306cSNickeau public 46404fd306cSNickeau function getChildren(): ?array 46504fd306cSNickeau { 46604fd306cSNickeau return $this->children; 46704fd306cSNickeau } 46804fd306cSNickeau 46904fd306cSNickeau public 47004fd306cSNickeau function getType(): string 47104fd306cSNickeau { 47204fd306cSNickeau return $this->type; 47304fd306cSNickeau } 47404fd306cSNickeau 47504fd306cSNickeau public 47604fd306cSNickeau function getDefaultValue() 47704fd306cSNickeau { 47804fd306cSNickeau switch (sizeof($this->defaults)) { 47904fd306cSNickeau case 0: 48004fd306cSNickeau return null; 48104fd306cSNickeau case 1: 48204fd306cSNickeau $value = $this->defaults[0]; 48304fd306cSNickeau if ($value !== null) { 48404fd306cSNickeau return $value; 48504fd306cSNickeau } 48604fd306cSNickeau return null; 48704fd306cSNickeau default: 48804fd306cSNickeau return $this->defaults; 48904fd306cSNickeau } 49004fd306cSNickeau } 49104fd306cSNickeau 49204fd306cSNickeau public 49304fd306cSNickeau function setMultiple(bool $bool): FormMetaField 49404fd306cSNickeau { 49504fd306cSNickeau $this->multiple = $bool; 49604fd306cSNickeau return $this; 49704fd306cSNickeau } 49804fd306cSNickeau 49904fd306cSNickeau public 50004fd306cSNickeau function isMultiple(): bool 50104fd306cSNickeau { 50204fd306cSNickeau return $this->multiple; 50304fd306cSNickeau } 50404fd306cSNickeau 50504fd306cSNickeau /** 50604fd306cSNickeau * If this is a scalar value, you can set/overwrite the value 50704fd306cSNickeau * with this function 50804fd306cSNickeau * @param $value 50904fd306cSNickeau * @param null $default 51004fd306cSNickeau * @return $this 51104fd306cSNickeau */ 51204fd306cSNickeau public 51304fd306cSNickeau function setValue($value, $default = null): FormMetaField 51404fd306cSNickeau { 51504fd306cSNickeau $this->values = []; 51604fd306cSNickeau $this->defaults = []; 51704fd306cSNickeau return $this->addValue($value, $default); 51804fd306cSNickeau 51904fd306cSNickeau } 52004fd306cSNickeau 52104fd306cSNickeau /** 52204fd306cSNickeau * Common metadata to all field from a leaf to a tabular 52304fd306cSNickeau * @param FormMetaField $field 52404fd306cSNickeau * @param Metadata $metadata 52504fd306cSNickeau */ 52604fd306cSNickeau private 52704fd306cSNickeau static 52804fd306cSNickeau function setCommonDataToFieldFromMetadata(FormMetaField $field, Metadata $metadata) 52904fd306cSNickeau { 53004fd306cSNickeau $field 53104fd306cSNickeau ->setCanonical($metadata->getCanonical()) 53204fd306cSNickeau ->setLabel($metadata->getLabel()) 53304fd306cSNickeau ->setDescription($metadata->getDescription()); 53404fd306cSNickeau } 53504fd306cSNickeau 53604fd306cSNickeau /** 53704fd306cSNickeau * @param FormMetaField $field 53804fd306cSNickeau * @param Metadata $metadata 53904fd306cSNickeau * Add the field metadata that are only available for leaf metadata 54004fd306cSNickeau */ 54104fd306cSNickeau private 54204fd306cSNickeau static 54304fd306cSNickeau function setLeafDataToFieldFromMetadata(FormMetaField $field, Metadata $metadata) 54404fd306cSNickeau { 54504fd306cSNickeau $field->setMutable($metadata->isMutable()); 54604fd306cSNickeau 54704fd306cSNickeau $formControlWidth = $metadata->getFormControlWidth(); 54804fd306cSNickeau if ($formControlWidth !== null) { 54904fd306cSNickeau $field->setWidth($formControlWidth); 55004fd306cSNickeau } 55104fd306cSNickeau $possibleValues = $metadata->getPossibleValues(); 55204fd306cSNickeau if ($possibleValues !== null) { 55304fd306cSNickeau $field->setDomainValues($possibleValues); 55404fd306cSNickeau if ($metadata instanceof MetadataMultiple) { 55504fd306cSNickeau $field->setMultiple(true); 55604fd306cSNickeau } 55704fd306cSNickeau } 55804fd306cSNickeau 55904fd306cSNickeau } 56004fd306cSNickeau 56104fd306cSNickeau public function __toString() 56204fd306cSNickeau { 56304fd306cSNickeau return $this->getName(); 56404fd306cSNickeau } 56504fd306cSNickeau 56604fd306cSNickeau 56704fd306cSNickeau} 568