(REF) APIv4 FieldSpec - Extract DataTypeSpecTrait (dataType, serialize, fkEntity)
authorTim Otten <totten@civicrm.org>
Fri, 16 Jul 2021 06:23:39 +0000 (23:23 -0700)
committerTim Otten <totten@civicrm.org>
Fri, 16 Jul 2021 06:38:24 +0000 (23:38 -0700)
Also: Update `setSerialize()` to accept types a string.  This is useful if
the info comes from an annotation.

Civi/Api4/Service/Spec/FieldSpec.php
Civi/Schema/Traits/DataTypeSpecTrait.php [new file with mode: 0644]

index 4f5006d931b419b3784623c2e04e8bce1888fa96..ceefef3a4c38b2e9ca9d5740739398da968db2ee 100644 (file)
@@ -13,6 +13,7 @@
 namespace Civi\Api4\Service\Spec;
 
 use Civi\Schema\Traits\BasicSpecTrait;
+use Civi\Schema\Traits\DataTypeSpecTrait;
 use Civi\Schema\Traits\GuiSpecTrait;
 use Civi\Schema\Traits\SqlSpecTrait;
 
@@ -21,6 +22,9 @@ class FieldSpec {
   // BasicSpecTrait: name, title, description
   use BasicSpecTrait;
 
+  // DataTypeSpecTrait: dataType, serialize, fkEntity
+  use DataTypeSpecTrait;
+
   // GuiSpecTrait: label, inputType, inputAttrs, helpPre, helpPost
   use GuiSpecTrait;
 
@@ -62,21 +66,6 @@ class FieldSpec {
    */
   private $optionsCallback;
 
-  /**
-   * @var string
-   */
-  public $dataType;
-
-  /**
-   * @var string
-   */
-  public $fkEntity;
-
-  /**
-   * @var int
-   */
-  public $serialize;
-
   /**
    * @var array
    */
@@ -92,17 +81,6 @@ class FieldSpec {
    */
   public $outputFormatters;
 
-  /**
-   * Aliases for the valid data types
-   *
-   * @var array
-   */
-  public static $typeAliases = [
-    'Int' => 'Integer',
-    'Link' => 'Url',
-    'Memo' => 'Text',
-  ];
-
   /**
    * @param string $name
    * @param string $entity
@@ -186,50 +164,6 @@ class FieldSpec {
     return $this;
   }
 
-  /**
-   * @return string
-   */
-  public function getDataType() {
-    return $this->dataType;
-  }
-
-  /**
-   * @param $dataType
-   *
-   * @return $this
-   * @throws \Exception
-   */
-  public function setDataType($dataType) {
-    if (array_key_exists($dataType, self::$typeAliases)) {
-      $dataType = self::$typeAliases[$dataType];
-    }
-
-    if (!in_array($dataType, $this->getValidDataTypes())) {
-      throw new \Exception(sprintf('Invalid data type "%s', $dataType));
-    }
-
-    $this->dataType = $dataType;
-
-    return $this;
-  }
-
-  /**
-   * @return int
-   */
-  public function getSerialize() {
-    return $this->serialize;
-  }
-
-  /**
-   * @param int|null $serialize
-   * @return $this
-   */
-  public function setSerialize($serialize) {
-    $this->serialize = $serialize;
-
-    return $this;
-  }
-
   /**
    * @param array $permission
    * @return $this
@@ -289,18 +223,6 @@ class FieldSpec {
     return $this;
   }
 
-  /**
-   * Add valid types that are not not part of \CRM_Utils_Type::dataTypes
-   *
-   * @return array
-   */
-  private function getValidDataTypes() {
-    $extraTypes = ['Boolean', 'Text', 'Float', 'Url', 'Array', 'Blob', 'Mediumblob'];
-    $extraTypes = array_combine($extraTypes, $extraTypes);
-
-    return array_merge(\CRM_Utils_Type::dataTypes(), $extraTypes);
-  }
-
   /**
    * @param array $values
    * @param array|bool $return
@@ -339,24 +261,6 @@ class FieldSpec {
     return $this;
   }
 
-  /**
-   * @return string
-   */
-  public function getFkEntity() {
-    return $this->fkEntity;
-  }
-
-  /**
-   * @param string $fkEntity
-   *
-   * @return $this
-   */
-  public function setFkEntity($fkEntity) {
-    $this->fkEntity = $fkEntity;
-
-    return $this;
-  }
-
   /**
    * Gets all public variables, converted to snake_case
    *
diff --git a/Civi/Schema/Traits/DataTypeSpecTrait.php b/Civi/Schema/Traits/DataTypeSpecTrait.php
new file mode 100644 (file)
index 0000000..6b0a00a
--- /dev/null
@@ -0,0 +1,142 @@
+<?php
+
+/*
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC. All rights reserved.                        |
+ |                                                                    |
+ | This work is published under the GNU AGPLv3 license with some      |
+ | permitted exceptions and without any warranty. For full license    |
+ | and copyright information, see https://civicrm.org/licensing       |
+ +--------------------------------------------------------------------+
+ */
+
+namespace Civi\Schema\Traits;
+
+/**
+ * Describe what values are allowed to be stored in this field.
+ *
+ * @package CRM
+ * @copyright CiviCRM LLC https://civicrm.org/licensing
+ */
+trait DataTypeSpecTrait {
+
+  /**
+   * The type of data stored in this field.
+   *
+   * Ex: 'Integer', 'Boolean', 'Float', 'String', 'Text', 'Blob'
+   *
+   * @var string
+   */
+  public $dataType;
+
+  /**
+   * @var int
+   * @see CRM_Core_DAO::SERIALIZE_SEPARATOR_BOOKEND,
+   *   CRM_Core_DAO::SERIALIZE_JSON, etc
+   */
+  public $serialize;
+
+  /**
+   * @var string
+   */
+  public $fkEntity;
+
+  /**
+   * Aliases for the valid data types
+   *
+   * @var array
+   */
+  public static $typeAliases = [
+    'Int' => 'Integer',
+    'Link' => 'Url',
+    'Memo' => 'Text',
+  ];
+
+  /**
+   * @return string
+   */
+  public function getDataType() {
+    return $this->dataType;
+  }
+
+  /**
+   * @param $dataType
+   *
+   * @return $this
+   * @throws \Exception
+   */
+  public function setDataType($dataType) {
+    if (array_key_exists($dataType, self::$typeAliases)) {
+      $dataType = self::$typeAliases[$dataType];
+    }
+
+    if (!in_array($dataType, $this->getValidDataTypes())) {
+      throw new \Exception(sprintf('Invalid data type "%s', $dataType));
+    }
+
+    $this->dataType = $dataType;
+
+    return $this;
+  }
+
+  /**
+   * @return string
+   */
+  public function getFkEntity() {
+    return $this->fkEntity;
+  }
+
+  /**
+   * @param string $fkEntity
+   *
+   * @return $this
+   */
+  public function setFkEntity($fkEntity) {
+    $this->fkEntity = $fkEntity;
+
+    return $this;
+  }
+
+  /**
+   * @return int
+   */
+  public function getSerialize() {
+    return $this->serialize;
+  }
+
+  /**
+   * @param int|string|null $serialize
+   * @return $this
+   */
+  public function setSerialize($serialize) {
+    if (is_string($serialize)) {
+      $const = 'CRM_Core_DAO::SERIALIZE_' . $serialize;
+      if (defined($const)) {
+        $serialize = constant($const);
+      }
+    }
+    $this->serialize = $serialize;
+    return $this;
+  }
+
+  /**
+   * Add valid types that are not not part of \CRM_Utils_Type::dataTypes
+   *
+   * @return array
+   */
+  protected function getValidDataTypes() {
+    $extraTypes = [
+      'Boolean',
+      'Text',
+      'Float',
+      'Url',
+      'Array',
+      'Blob',
+      'Mediumblob',
+    ];
+    $extraTypes = array_combine($extraTypes, $extraTypes);
+
+    return array_merge(\CRM_Utils_Type::dataTypes(), $extraTypes);
+  }
+
+}