1*04fd306cSNickeau<?php 2*04fd306cSNickeau 3*04fd306cSNickeau 4*04fd306cSNickeaunamespace ComboStrap\Meta\Form; 5*04fd306cSNickeau 6*04fd306cSNickeau 7*04fd306cSNickeauuse ComboStrap\Canonical; 8*04fd306cSNickeauuse ComboStrap\DataType; 9*04fd306cSNickeauuse ComboStrap\ExceptionBadArgument; 10*04fd306cSNickeauuse ComboStrap\ExceptionNotFound; 11*04fd306cSNickeauuse ComboStrap\ExceptionRuntimeInternal; 12*04fd306cSNickeauuse ComboStrap\Html; 13*04fd306cSNickeauuse ComboStrap\LogUtility; 14*04fd306cSNickeauuse ComboStrap\Meta\Api\Metadata; 15*04fd306cSNickeauuse ComboStrap\Meta\Api\MetadataSystem; 16*04fd306cSNickeauuse ComboStrap\Meta\Api\MetadataMultiple; 17*04fd306cSNickeauuse ComboStrap\Meta\Api\MetadataTabular; 18*04fd306cSNickeauuse ComboStrap\PageDescription; 19*04fd306cSNickeauuse ComboStrap\PluginUtility; 20*04fd306cSNickeauuse ComboStrap\ResourceName; 21*04fd306cSNickeauuse ComboStrap\Web\Url; 22*04fd306cSNickeau 23*04fd306cSNickeau/** 24*04fd306cSNickeau * Class FormField 25*04fd306cSNickeau * @package ComboStrap 26*04fd306cSNickeau * 27*04fd306cSNickeau * A class that represents a tree of form field. 28*04fd306cSNickeau * 29*04fd306cSNickeau * Each field can be a scalar, a list or 30*04fd306cSNickeau * tabular by adding child fields. 31*04fd306cSNickeau * 32*04fd306cSNickeau * 33*04fd306cSNickeau */ 34*04fd306cSNickeauclass FormMetaField 35*04fd306cSNickeau{ 36*04fd306cSNickeau 37*04fd306cSNickeau 38*04fd306cSNickeau /** 39*04fd306cSNickeau * The JSON attribute 40*04fd306cSNickeau */ 41*04fd306cSNickeau public const TAB_ATTRIBUTE = "tab"; 42*04fd306cSNickeau public const LABEL_ATTRIBUTE = "label"; 43*04fd306cSNickeau public const URL_ATTRIBUTE = "url"; 44*04fd306cSNickeau public const MUTABLE_ATTRIBUTE = "mutable"; 45*04fd306cSNickeau /** 46*04fd306cSNickeau * A value may be a scalar or an array 47*04fd306cSNickeau */ 48*04fd306cSNickeau public const VALUE_ATTRIBUTE = "value"; 49*04fd306cSNickeau public const DEFAULT_VALUE_ATTRIBUTE = "default"; 50*04fd306cSNickeau 51*04fd306cSNickeau public const DOMAIN_VALUES_ATTRIBUTE = "domain-values"; 52*04fd306cSNickeau public const WIDTH_ATTRIBUTE = "width"; 53*04fd306cSNickeau public const CHILDREN_ATTRIBUTE = "children"; 54*04fd306cSNickeau const DESCRIPTION_ATTRIBUTE = PageDescription::PROPERTY_NAME; 55*04fd306cSNickeau const NAME_ATTRIBUTE = ResourceName::PROPERTY_NAME; 56*04fd306cSNickeau const MULTIPLE_ATTRIBUTE = "multiple"; 57*04fd306cSNickeau const TYPE_ATTRIBUTE = DataType::PROPERTY_NAME; 58*04fd306cSNickeau 59*04fd306cSNickeau 60*04fd306cSNickeau private $name; 61*04fd306cSNickeau /** 62*04fd306cSNickeau * @var bool 63*04fd306cSNickeau */ 64*04fd306cSNickeau private $mutable; 65*04fd306cSNickeau /** 66*04fd306cSNickeau * @var string 67*04fd306cSNickeau */ 68*04fd306cSNickeau private $tab; 69*04fd306cSNickeau /** 70*04fd306cSNickeau * @var string 71*04fd306cSNickeau */ 72*04fd306cSNickeau private $label; 73*04fd306cSNickeau private $description; 74*04fd306cSNickeau /** 75*04fd306cSNickeau * If canonical is set, an url is also send 76*04fd306cSNickeau */ 77*04fd306cSNickeau private string $canonical; 78*04fd306cSNickeau private array $values = []; 79*04fd306cSNickeau private array $defaults = []; 80*04fd306cSNickeau /** 81*04fd306cSNickeau * @var string 82*04fd306cSNickeau */ 83*04fd306cSNickeau private $type; 84*04fd306cSNickeau /** 85*04fd306cSNickeau * @var array 86*04fd306cSNickeau */ 87*04fd306cSNickeau private $domainValues; 88*04fd306cSNickeau /** 89*04fd306cSNickeau * @var FormMetaField[] 90*04fd306cSNickeau */ 91*04fd306cSNickeau private $children; 92*04fd306cSNickeau /** 93*04fd306cSNickeau * @var int 94*04fd306cSNickeau */ 95*04fd306cSNickeau private $width; 96*04fd306cSNickeau /** 97*04fd306cSNickeau * Multiple value can be chosen 98*04fd306cSNickeau * @var bool 99*04fd306cSNickeau */ 100*04fd306cSNickeau private $multiple = false; 101*04fd306cSNickeau 102*04fd306cSNickeau 103*04fd306cSNickeau /** 104*04fd306cSNickeau * FormField constructor. 105*04fd306cSNickeau * The name is mandatory 106*04fd306cSNickeau * and the type to be able to control the values 107*04fd306cSNickeau */ 108*04fd306cSNickeau public function __construct($name, $type) 109*04fd306cSNickeau { 110*04fd306cSNickeau $this->name = $name; 111*04fd306cSNickeau $this->label = ucfirst($name); 112*04fd306cSNickeau $this->description = $name; 113*04fd306cSNickeau if (!in_array($type, DataType::TYPES)) { 114*04fd306cSNickeau throw new ExceptionRuntimeInternal("The type ($type) is not a known field type"); 115*04fd306cSNickeau } 116*04fd306cSNickeau $this->type = $type; 117*04fd306cSNickeau $this->mutable = true; 118*04fd306cSNickeau } 119*04fd306cSNickeau 120*04fd306cSNickeau public static function create(string $name, string $type): FormMetaField 121*04fd306cSNickeau { 122*04fd306cSNickeau return new FormMetaField($name, $type); 123*04fd306cSNickeau } 124*04fd306cSNickeau 125*04fd306cSNickeau /** 126*04fd306cSNickeau * Almost because a form does not allow hierarchical data 127*04fd306cSNickeau * We send an error in this case 128*04fd306cSNickeau * @param Metadata $metadata 129*04fd306cSNickeau * @return FormMetaField 130*04fd306cSNickeau */ 131*04fd306cSNickeau public static function createFromMetadata(Metadata $metadata): FormMetaField 132*04fd306cSNickeau { 133*04fd306cSNickeau $field = FormMetaField::create($metadata->getName(), $metadata->getDataType()); 134*04fd306cSNickeau 135*04fd306cSNickeau self::setCommonDataToFieldFromMetadata($field, $metadata); 136*04fd306cSNickeau 137*04fd306cSNickeau $childrenMetadata = $metadata->getChildrenClass(); 138*04fd306cSNickeau 139*04fd306cSNickeau try { 140*04fd306cSNickeau $metadata->getParent(); 141*04fd306cSNickeau } catch (ExceptionNotFound $e) { 142*04fd306cSNickeau /** 143*04fd306cSNickeau * Only the top field have a tab value 144*04fd306cSNickeau */ 145*04fd306cSNickeau $field->setTab($metadata->getTab()); 146*04fd306cSNickeau } 147*04fd306cSNickeau 148*04fd306cSNickeau 149*04fd306cSNickeau /** 150*04fd306cSNickeau * No children 151*04fd306cSNickeau */ 152*04fd306cSNickeau if (count($childrenMetadata) === 0) { 153*04fd306cSNickeau 154*04fd306cSNickeau static::setLeafDataToFieldFromMetadata($field, $metadata); 155*04fd306cSNickeau 156*04fd306cSNickeau /** 157*04fd306cSNickeau * When tabular, the value comes from the parent 158*04fd306cSNickeau */ 159*04fd306cSNickeau if ($metadata->isScalar()) { 160*04fd306cSNickeau $value = $metadata->toStoreValue(); 161*04fd306cSNickeau $defaultValue = $metadata->toStoreDefaultValue(); 162*04fd306cSNickeau $field->addValue($value, $defaultValue); 163*04fd306cSNickeau } 164*04fd306cSNickeau 165*04fd306cSNickeau } else { 166*04fd306cSNickeau 167*04fd306cSNickeau if ($metadata instanceof MetadataTabular) { 168*04fd306cSNickeau 169*04fd306cSNickeau $childFields = []; 170*04fd306cSNickeau foreach ($metadata->getChildrenClass() as $childMetadataClass) { 171*04fd306cSNickeau 172*04fd306cSNickeau try { 173*04fd306cSNickeau $childMetadata = MetadataSystem::toMetadataObject($childMetadataClass, $metadata); 174*04fd306cSNickeau } catch (ExceptionBadArgument $e) { 175*04fd306cSNickeau // should happen only internally 176*04fd306cSNickeau LogUtility::internalError("The metadata class/object ($childMetadataClass) is not a metadata class"); 177*04fd306cSNickeau continue; 178*04fd306cSNickeau } 179*04fd306cSNickeau $childField = FormMetaField::createFromMetadata($childMetadata); 180*04fd306cSNickeau static::setCommonDataToFieldFromMetadata($childField, $childMetadata); 181*04fd306cSNickeau static::setLeafDataToFieldFromMetadata($childField, $childMetadata); 182*04fd306cSNickeau $field->addColumn($childField); 183*04fd306cSNickeau $childFields[$childMetadata::getPersistentName()] = $childField; 184*04fd306cSNickeau } 185*04fd306cSNickeau try { 186*04fd306cSNickeau $rows = $metadata->getValue(); 187*04fd306cSNickeau } catch (ExceptionNotFound $e) { 188*04fd306cSNickeau $rows = null; 189*04fd306cSNickeau } 190*04fd306cSNickeau if ($rows !== null) { 191*04fd306cSNickeau $defaultRow = null; 192*04fd306cSNickeau try { 193*04fd306cSNickeau $defaultRows = $metadata->getDefaultValue(); 194*04fd306cSNickeau $defaultRow = $defaultRows[0]; 195*04fd306cSNickeau } catch (ExceptionNotFound $e) { 196*04fd306cSNickeau // no default row 197*04fd306cSNickeau } 198*04fd306cSNickeau foreach ($rows as $row) { 199*04fd306cSNickeau foreach ($childFields as $childName => $childField) { 200*04fd306cSNickeau $colValue = $row[$childName]; 201*04fd306cSNickeau if ($colValue === null) { 202*04fd306cSNickeau if ($defaultRow === null) { 203*04fd306cSNickeau continue; 204*04fd306cSNickeau } 205*04fd306cSNickeau $colValue = $defaultRow[$childName]; 206*04fd306cSNickeau if ($colValue === null) { 207*04fd306cSNickeau continue; 208*04fd306cSNickeau } 209*04fd306cSNickeau } 210*04fd306cSNickeau $storeValue = $colValue->toStoreValue(); 211*04fd306cSNickeau $defaultStoreValue = $colValue->toStoreDefaultValue(); 212*04fd306cSNickeau $childField->addValue($storeValue, $defaultStoreValue); 213*04fd306cSNickeau } 214*04fd306cSNickeau 215*04fd306cSNickeau } 216*04fd306cSNickeau 217*04fd306cSNickeau // Add an extra empty row to allow adding an image 218*04fd306cSNickeau if ($defaultRow !== null) { 219*04fd306cSNickeau foreach ($defaultRow as $colName => $colMetadata) { 220*04fd306cSNickeau if($colName===null){ 221*04fd306cSNickeau LogUtility::internalError("The persistence name (column name) should be set as key for the default rows"); 222*04fd306cSNickeau continue; 223*04fd306cSNickeau } 224*04fd306cSNickeau $defaultColValue = null; 225*04fd306cSNickeau if ($colMetadata !== null) { 226*04fd306cSNickeau $defaultColValue = $colMetadata->toStoreDefaultValue(); 227*04fd306cSNickeau } 228*04fd306cSNickeau $childField = $childFields[$colName]; 229*04fd306cSNickeau $childField->addValue(null, $defaultColValue); 230*04fd306cSNickeau } 231*04fd306cSNickeau } 232*04fd306cSNickeau } else { 233*04fd306cSNickeau 234*04fd306cSNickeau 235*04fd306cSNickeau // No rows, show the default rows 236*04fd306cSNickeau try { 237*04fd306cSNickeau $rows = $metadata->getDefaultValue(); 238*04fd306cSNickeau } catch (ExceptionNotFound $e) { 239*04fd306cSNickeau // no default row ok 240*04fd306cSNickeau $rows = []; 241*04fd306cSNickeau } 242*04fd306cSNickeau foreach ($rows as $row) { 243*04fd306cSNickeau foreach ($row as $colName => $colValue) { 244*04fd306cSNickeau if ($colValue === null) { 245*04fd306cSNickeau continue; 246*04fd306cSNickeau } 247*04fd306cSNickeau $childField = $childFields[$colName]; 248*04fd306cSNickeau $childField->addValue(null, $colValue->toStoreValue()); 249*04fd306cSNickeau } 250*04fd306cSNickeau } 251*04fd306cSNickeau 252*04fd306cSNickeau } 253*04fd306cSNickeau 254*04fd306cSNickeau 255*04fd306cSNickeau } else { 256*04fd306cSNickeau 257*04fd306cSNickeau LogUtility::msg("Hierarchical data is not supported in a form. Metadata ($metadata) has children and is not tabular"); 258*04fd306cSNickeau } 259*04fd306cSNickeau } 260*04fd306cSNickeau return $field; 261*04fd306cSNickeau 262*04fd306cSNickeau } 263*04fd306cSNickeau 264*04fd306cSNickeau 265*04fd306cSNickeau public 266*04fd306cSNickeau function toAssociativeArray(): array 267*04fd306cSNickeau { 268*04fd306cSNickeau /** 269*04fd306cSNickeau * Mandatory attributes 270*04fd306cSNickeau */ 271*04fd306cSNickeau $associative = [ 272*04fd306cSNickeau self::NAME_ATTRIBUTE => $this->name, 273*04fd306cSNickeau self::LABEL_ATTRIBUTE => $this->label, 274*04fd306cSNickeau self::TYPE_ATTRIBUTE => $this->type 275*04fd306cSNickeau ]; 276*04fd306cSNickeau 277*04fd306cSNickeau try { 278*04fd306cSNickeau $associative[self::URL_ATTRIBUTE] = $this->getUrl()->toString(); 279*04fd306cSNickeau } catch (ExceptionNotFound $e) { 280*04fd306cSNickeau // ok 281*04fd306cSNickeau } 282*04fd306cSNickeau 283*04fd306cSNickeau if ($this->description != null) { 284*04fd306cSNickeau $associative[self::DESCRIPTION_ATTRIBUTE] = $this->description; 285*04fd306cSNickeau } 286*04fd306cSNickeau /** 287*04fd306cSNickeau * For child form field (ie column), there is no tab 288*04fd306cSNickeau */ 289*04fd306cSNickeau if ($this->tab != null) { 290*04fd306cSNickeau $associative[self::TAB_ATTRIBUTE] = $this->tab; 291*04fd306cSNickeau } 292*04fd306cSNickeau 293*04fd306cSNickeau 294*04fd306cSNickeau if ($this->width !== null) { 295*04fd306cSNickeau $associative[self::WIDTH_ATTRIBUTE] = $this->width; 296*04fd306cSNickeau } 297*04fd306cSNickeau if ($this->children !== null) { 298*04fd306cSNickeau foreach ($this->children as $column) { 299*04fd306cSNickeau $associative[self::CHILDREN_ATTRIBUTE][] = $column->toAssociativeArray(); 300*04fd306cSNickeau } 301*04fd306cSNickeau } else { 302*04fd306cSNickeau 303*04fd306cSNickeau /** 304*04fd306cSNickeau * Only valid for leaf field 305*04fd306cSNickeau */ 306*04fd306cSNickeau if ($this->getValue() !== null && $this->getValue() !== "") { 307*04fd306cSNickeau $associative[self::VALUE_ATTRIBUTE] = $this->getValue(); 308*04fd306cSNickeau } 309*04fd306cSNickeau 310*04fd306cSNickeau if ($this->getDefaultValue() !== null) { 311*04fd306cSNickeau $associative[self::DEFAULT_VALUE_ATTRIBUTE] = $this->getDefaultValue(); 312*04fd306cSNickeau } 313*04fd306cSNickeau 314*04fd306cSNickeau if ($this->domainValues !== null) { 315*04fd306cSNickeau $associative[self::DOMAIN_VALUES_ATTRIBUTE] = $this->domainValues; 316*04fd306cSNickeau if ($this->multiple) { 317*04fd306cSNickeau $associative[self::MULTIPLE_ATTRIBUTE] = $this->multiple; 318*04fd306cSNickeau } 319*04fd306cSNickeau } 320*04fd306cSNickeau 321*04fd306cSNickeau $associative[self::MUTABLE_ATTRIBUTE] = $this->mutable; 322*04fd306cSNickeau 323*04fd306cSNickeau 324*04fd306cSNickeau } 325*04fd306cSNickeau 326*04fd306cSNickeau 327*04fd306cSNickeau return $associative; 328*04fd306cSNickeau } 329*04fd306cSNickeau 330*04fd306cSNickeau public 331*04fd306cSNickeau function setMutable(bool $bool): FormMetaField 332*04fd306cSNickeau { 333*04fd306cSNickeau $this->mutable = $bool; 334*04fd306cSNickeau return $this; 335*04fd306cSNickeau } 336*04fd306cSNickeau 337*04fd306cSNickeau 338*04fd306cSNickeau public 339*04fd306cSNickeau function setTab(string $tabName): FormMetaField 340*04fd306cSNickeau { 341*04fd306cSNickeau Html::validNameGuard($tabName); 342*04fd306cSNickeau $this->tab = $tabName; 343*04fd306cSNickeau return $this; 344*04fd306cSNickeau } 345*04fd306cSNickeau 346*04fd306cSNickeau public 347*04fd306cSNickeau function setLabel(string $label): FormMetaField 348*04fd306cSNickeau { 349*04fd306cSNickeau $this->label = $label; 350*04fd306cSNickeau return $this; 351*04fd306cSNickeau } 352*04fd306cSNickeau 353*04fd306cSNickeau /** 354*04fd306cSNickeau * @throws ExceptionNotFound 355*04fd306cSNickeau */ 356*04fd306cSNickeau public 357*04fd306cSNickeau function getUrl(): Url 358*04fd306cSNickeau { 359*04fd306cSNickeau if (!isset($this->canonical)) { 360*04fd306cSNickeau throw new ExceptionNotFound(); 361*04fd306cSNickeau } 362*04fd306cSNickeau 363*04fd306cSNickeau return Canonical::createFromValue($this->canonical) 364*04fd306cSNickeau ->getComboStrapUrlForDocumentation(); 365*04fd306cSNickeau 366*04fd306cSNickeau } 367*04fd306cSNickeau 368*04fd306cSNickeau public 369*04fd306cSNickeau function setCanonical(string $canonical): FormMetaField 370*04fd306cSNickeau { 371*04fd306cSNickeau $this->canonical = $canonical; 372*04fd306cSNickeau return $this; 373*04fd306cSNickeau } 374*04fd306cSNickeau 375*04fd306cSNickeau public 376*04fd306cSNickeau function setDescription(string $string): FormMetaField 377*04fd306cSNickeau { 378*04fd306cSNickeau $this->description = $string; 379*04fd306cSNickeau return $this; 380*04fd306cSNickeau } 381*04fd306cSNickeau 382*04fd306cSNickeau /** 383*04fd306cSNickeau * @param boolean|string|null $value 384*04fd306cSNickeau * @param boolean|string|null $defaultValuePlaceholderOrReturned - the value set as placeholder or return value for a checked checkbox 385*04fd306cSNickeau * @return $this 386*04fd306cSNickeau */ 387*04fd306cSNickeau public 388*04fd306cSNickeau function addValue($value, $defaultValuePlaceholderOrReturned = null): FormMetaField 389*04fd306cSNickeau { 390*04fd306cSNickeau if ($this->getType() === DataType::BOOLEAN_TYPE_VALUE) { 391*04fd306cSNickeau if ($value != null && !DataType::isBoolean($value)) { 392*04fd306cSNickeau throw new ExceptionRuntimeInternal("The value ($value) is not a boolean"); 393*04fd306cSNickeau } 394*04fd306cSNickeau if ($defaultValuePlaceholderOrReturned != null && !DataType::isBoolean($defaultValuePlaceholderOrReturned)) { 395*04fd306cSNickeau throw new ExceptionRuntimeInternal("The default value ($defaultValuePlaceholderOrReturned) is not a boolean"); 396*04fd306cSNickeau } 397*04fd306cSNickeau } 398*04fd306cSNickeau $this->values[] = $value; 399*04fd306cSNickeau $this->defaults[] = $defaultValuePlaceholderOrReturned; 400*04fd306cSNickeau return $this; 401*04fd306cSNickeau } 402*04fd306cSNickeau 403*04fd306cSNickeau 404*04fd306cSNickeau public 405*04fd306cSNickeau function setDomainValues(array $domainValues): FormMetaField 406*04fd306cSNickeau { 407*04fd306cSNickeau $this->domainValues = $domainValues; 408*04fd306cSNickeau return $this; 409*04fd306cSNickeau } 410*04fd306cSNickeau 411*04fd306cSNickeau public 412*04fd306cSNickeau function addColumn(FormMetaField $formField): FormMetaField 413*04fd306cSNickeau { 414*04fd306cSNickeau $this->type = DataType::TABULAR_TYPE_VALUE; 415*04fd306cSNickeau // A parent node is not mutable 416*04fd306cSNickeau $this->mutable = false; 417*04fd306cSNickeau $this->children[] = $formField; 418*04fd306cSNickeau return $this; 419*04fd306cSNickeau } 420*04fd306cSNickeau 421*04fd306cSNickeau public 422*04fd306cSNickeau function setWidth(int $int): FormMetaField 423*04fd306cSNickeau { 424*04fd306cSNickeau $this->width = $int; 425*04fd306cSNickeau return $this; 426*04fd306cSNickeau } 427*04fd306cSNickeau 428*04fd306cSNickeau public 429*04fd306cSNickeau function getTab(): string 430*04fd306cSNickeau { 431*04fd306cSNickeau return $this->tab; 432*04fd306cSNickeau } 433*04fd306cSNickeau 434*04fd306cSNickeau public 435*04fd306cSNickeau function getName() 436*04fd306cSNickeau { 437*04fd306cSNickeau return $this->name; 438*04fd306cSNickeau } 439*04fd306cSNickeau 440*04fd306cSNickeau public 441*04fd306cSNickeau function getValue() 442*04fd306cSNickeau { 443*04fd306cSNickeau switch (sizeof($this->values)) { 444*04fd306cSNickeau case 0: 445*04fd306cSNickeau return null; 446*04fd306cSNickeau case 1: 447*04fd306cSNickeau $value = $this->values[0]; 448*04fd306cSNickeau if ($value !== null) { 449*04fd306cSNickeau return $this->values[0]; 450*04fd306cSNickeau } 451*04fd306cSNickeau return null; 452*04fd306cSNickeau default: 453*04fd306cSNickeau return $this->values; 454*04fd306cSNickeau } 455*04fd306cSNickeau } 456*04fd306cSNickeau 457*04fd306cSNickeau public 458*04fd306cSNickeau function isMutable(): bool 459*04fd306cSNickeau { 460*04fd306cSNickeau return $this->mutable; 461*04fd306cSNickeau } 462*04fd306cSNickeau 463*04fd306cSNickeau public 464*04fd306cSNickeau function getChildren(): ?array 465*04fd306cSNickeau { 466*04fd306cSNickeau return $this->children; 467*04fd306cSNickeau } 468*04fd306cSNickeau 469*04fd306cSNickeau public 470*04fd306cSNickeau function getType(): string 471*04fd306cSNickeau { 472*04fd306cSNickeau return $this->type; 473*04fd306cSNickeau } 474*04fd306cSNickeau 475*04fd306cSNickeau public 476*04fd306cSNickeau function getDefaultValue() 477*04fd306cSNickeau { 478*04fd306cSNickeau switch (sizeof($this->defaults)) { 479*04fd306cSNickeau case 0: 480*04fd306cSNickeau return null; 481*04fd306cSNickeau case 1: 482*04fd306cSNickeau $value = $this->defaults[0]; 483*04fd306cSNickeau if ($value !== null) { 484*04fd306cSNickeau return $value; 485*04fd306cSNickeau } 486*04fd306cSNickeau return null; 487*04fd306cSNickeau default: 488*04fd306cSNickeau return $this->defaults; 489*04fd306cSNickeau } 490*04fd306cSNickeau } 491*04fd306cSNickeau 492*04fd306cSNickeau public 493*04fd306cSNickeau function setMultiple(bool $bool): FormMetaField 494*04fd306cSNickeau { 495*04fd306cSNickeau $this->multiple = $bool; 496*04fd306cSNickeau return $this; 497*04fd306cSNickeau } 498*04fd306cSNickeau 499*04fd306cSNickeau public 500*04fd306cSNickeau function isMultiple(): bool 501*04fd306cSNickeau { 502*04fd306cSNickeau return $this->multiple; 503*04fd306cSNickeau } 504*04fd306cSNickeau 505*04fd306cSNickeau /** 506*04fd306cSNickeau * If this is a scalar value, you can set/overwrite the value 507*04fd306cSNickeau * with this function 508*04fd306cSNickeau * @param $value 509*04fd306cSNickeau * @param null $default 510*04fd306cSNickeau * @return $this 511*04fd306cSNickeau */ 512*04fd306cSNickeau public 513*04fd306cSNickeau function setValue($value, $default = null): FormMetaField 514*04fd306cSNickeau { 515*04fd306cSNickeau $this->values = []; 516*04fd306cSNickeau $this->defaults = []; 517*04fd306cSNickeau return $this->addValue($value, $default); 518*04fd306cSNickeau 519*04fd306cSNickeau } 520*04fd306cSNickeau 521*04fd306cSNickeau /** 522*04fd306cSNickeau * Common metadata to all field from a leaf to a tabular 523*04fd306cSNickeau * @param FormMetaField $field 524*04fd306cSNickeau * @param Metadata $metadata 525*04fd306cSNickeau */ 526*04fd306cSNickeau private 527*04fd306cSNickeau static 528*04fd306cSNickeau function setCommonDataToFieldFromMetadata(FormMetaField $field, Metadata $metadata) 529*04fd306cSNickeau { 530*04fd306cSNickeau $field 531*04fd306cSNickeau ->setCanonical($metadata->getCanonical()) 532*04fd306cSNickeau ->setLabel($metadata->getLabel()) 533*04fd306cSNickeau ->setDescription($metadata->getDescription()); 534*04fd306cSNickeau } 535*04fd306cSNickeau 536*04fd306cSNickeau /** 537*04fd306cSNickeau * @param FormMetaField $field 538*04fd306cSNickeau * @param Metadata $metadata 539*04fd306cSNickeau * Add the field metadata that are only available for leaf metadata 540*04fd306cSNickeau */ 541*04fd306cSNickeau private 542*04fd306cSNickeau static 543*04fd306cSNickeau function setLeafDataToFieldFromMetadata(FormMetaField $field, Metadata $metadata) 544*04fd306cSNickeau { 545*04fd306cSNickeau $field->setMutable($metadata->isMutable()); 546*04fd306cSNickeau 547*04fd306cSNickeau $formControlWidth = $metadata->getFormControlWidth(); 548*04fd306cSNickeau if ($formControlWidth !== null) { 549*04fd306cSNickeau $field->setWidth($formControlWidth); 550*04fd306cSNickeau } 551*04fd306cSNickeau $possibleValues = $metadata->getPossibleValues(); 552*04fd306cSNickeau if ($possibleValues !== null) { 553*04fd306cSNickeau $field->setDomainValues($possibleValues); 554*04fd306cSNickeau if ($metadata instanceof MetadataMultiple) { 555*04fd306cSNickeau $field->setMultiple(true); 556*04fd306cSNickeau } 557*04fd306cSNickeau } 558*04fd306cSNickeau 559*04fd306cSNickeau } 560*04fd306cSNickeau 561*04fd306cSNickeau public function __toString() 562*04fd306cSNickeau { 563*04fd306cSNickeau return $this->getName(); 564*04fd306cSNickeau } 565*04fd306cSNickeau 566*04fd306cSNickeau 567*04fd306cSNickeau} 568