DataDefinition.php 7.57 KB
Newer Older
1 2 3 4 5 6 7 8 9 10
<?php

/**
 * @file
 * Contains \Drupal\Core\TypedData\DataDefinition.
 */

namespace Drupal\Core\TypedData;

/**
11
 * A typed data definition class for defining data based on defined data types.
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
 */
class DataDefinition implements DataDefinitionInterface, \ArrayAccess {

  /**
   * The array holding values for all definition keys.
   *
   * @var array
   */
  protected $definition = array();

  /**
   * Creates a new data definition.
   *
   * @param string $type
   *   The data type of the data; e.g., 'string', 'integer' or 'any'.
   *
28
   * @return static
29 30 31 32 33 34 35
   *   A new DataDefinition object.
   */
  public static function create($type) {
    $definition['type'] = $type;
    return new static($definition);
  }

36 37 38 39 40 41 42
  /**
   * {@inheritdoc}
   */
  public static function createFromDataType($type) {
    return self::create($type);
  }

43 44 45
  /**
   * Constructs a new data definition object.
   *
46 47
   * @param array $values
   *   (optional) If given, an array of initial values to set on the definition.
48
   */
49 50
  public function __construct(array $values = array()) {
    $this->definition = $values;
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
  }

  /**
   * {@inheritdoc}
   */
  public function getDataType() {
    return !empty($this->definition['type']) ? $this->definition['type'] : 'any';
  }

  /**
   * Sets the data type.
   *
   * @param string $type
   *   The data type to set.
   *
66
   * @return static
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
   *   The object itself for chaining.
   */
  public function setDataType($type) {
    $this->definition['type'] = $type;
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function getLabel() {
    return isset($this->definition['label']) ? $this->definition['label'] : NULL;
  }

  /**
   * Sets the human-readable label.
   *
   * @param string $label
   *   The label to set.
   *
87
   * @return static
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
   *   The object itself for chaining.
   */
  public function setLabel($label) {
    $this->definition['label'] = $label;
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function getDescription() {
    return isset($this->definition['description']) ? $this->definition['description'] : NULL;
  }

  /**
   * Sets the human-readable description.
   *
   * @param string $description
   *   The description to set.
   *
108
   * @return static
109 110 111 112 113 114 115 116 117 118 119
   *   The object itself for chaining.
   */
  public function setDescription($description) {
    $this->definition['description'] = $description;
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function isList() {
120
    return ($this instanceof ListDataDefinitionInterface);
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
  }

  /**
   * {@inheritdoc}
   */
  public function isReadOnly() {
    if (!isset($this->definition['read-only'])) {
      // Default to read-only if the data value is computed.
      return $this->isComputed();
    }
    return !empty($this->definition['read-only']);
  }

  /**
   * Sets whether the data is read-only.
   *
   * @param bool $read_only
   *   Whether the data is read-only.
   *
140
   * @return static
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
   *   The object itself for chaining.
   */
  public function setReadOnly($read_only) {
    $this->definition['read-only'] = $read_only;
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function isComputed() {
    return !empty($this->definition['computed']);
  }

  /**
   * Sets whether the data is computed.
   *
   * @param bool $computed
   *   Whether the data is computed.
   *
161
   * @return static
162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
   *   The object itself for chaining.
   */
  public function setComputed($computed) {
    $this->definition['computed'] = $computed;
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function isRequired() {
    return !empty($this->definition['required']);
  }

  /**
   * Sets whether the data is required.
   *
   * @param bool $required
   *   Whether the data is required.
   *
182
   * @return static
183 184 185 186 187 188 189 190 191 192 193
   *   The object itself for chaining.
   */
  public function setRequired($required) {
    $this->definition['required'] = $required;
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function getClass() {
194 195 196 197 198 199 200
    if (isset($this->definition['class'])) {
      return $this->definition['class'];
    }
    else {
      $type_definition = \Drupal::typedDataManager()->getDefinition($this->getDataType());
      return $type_definition['class'];
    }
201 202 203 204 205 206 207 208
  }

  /**
   * Sets the class used for creating the typed data object.
   *
   * @param string|null $class
   *   The class to use.
   *
209
   * @return static
210 211 212 213 214 215 216 217
   *   The object itself for chaining.
   */
  public function setClass($class) {
    $this->definition['class'] = $class;
    return $this;
  }

  /**
218
   * {@inheritdoc}
219 220 221 222 223 224 225 226 227 228 229
   */
  public function getSettings() {
    return isset($this->definition['settings']) ? $this->definition['settings'] : array();
  }

  /**
   * Sets the array of settings, as required by the used class.
   *
   * @param array $settings
   *   The array of settings.
   *
230
   * @return static
231 232 233 234 235 236 237
   *   The object itself for chaining.
   */
  public function setSettings(array $settings) {
    $this->definition['settings'] = $settings;
    return $this;
  }

238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260
  /**
   * {@inheritdoc}
   */
  public function getSetting($setting_name) {
    return isset($this->definition['settings'][$setting_name]) ? $this->definition['settings'][$setting_name] : NULL;
  }

  /**
   * Sets a definition setting.
   *
   * @param string $setting_name
   *   The definition setting to set.
   * @param mixed $value
   *   The value to set.
   *
   * @return static
   *   The object itself for chaining.
   */
  public function setSetting($setting_name, $value) {
    $this->definition['settings'][$setting_name] = $value;
    return $this;
  }

261
  /**
262
   * {@inheritdoc}
263 264
   */
  public function getConstraints() {
265 266 267
    $constraints = isset($this->definition['constraints']) ? $this->definition['constraints'] : array();
    $constraints += \Drupal::typedDataManager()->getDefaultConstraints($this);
    return $constraints;
268 269
  }

270 271 272 273
  /**
   * {@inheritdoc}
   */
  public function getConstraint($constraint_name) {
274 275
    $constraints = $this->getConstraints();
    return isset($constraints[$constraint_name]) ? $constraints[$constraint_name] : NULL;
276 277
  }

278
  /**
279
   * {@inheritdoc}
280 281 282 283 284 285 286
   */
  public function setConstraints(array $constraints) {
    $this->definition['constraints'] = $constraints;
    return $this;
  }

  /**
287
   * {@inheritdoc}
288 289 290 291 292 293 294 295 296 297
   */
  public function addConstraint($constraint_name, $options = NULL) {
    $this->definition['constraints'][$constraint_name] = $options;
    return $this;
  }

  /**
   * {@inheritdoc}
   *
   * This is for BC support only.
298
   * @todo: Remove in https://drupal.org/node/1928868.
299 300 301 302 303 304 305 306 307 308 309
   */
  public function offsetExists($offset) {
    // PHP's array access does not work correctly with isset(), so we have to
    // bake isset() in here. See https://bugs.php.net/bug.php?id=41727.
    return array_key_exists($offset, $this->definition) && isset($this->definition[$offset]);
  }

  /**
   * {@inheritdoc}
   *
   * This is for BC support only.
310
   * @todo: Remove in https://drupal.org/node/1928868.
311 312 313 314 315 316 317 318 319 320 321 322
   */
  public function &offsetGet($offset) {
    if (!isset($this->definition[$offset])) {
      $this->definition[$offset] = NULL;
    }
    return $this->definition[$offset];
  }

  /**
   * {@inheritdoc}
   *
   * This is for BC support only.
323
   * @todo: Remove in https://drupal.org/node/1928868.
324 325 326 327 328 329 330 331 332
   */
  public function offsetSet($offset, $value) {
    $this->definition[$offset] = $value;
  }

  /**
   * {@inheritdoc}
   *
   * This is for BC support only.
333
   * @todo: Remove in https://drupal.org/node/1928868.
334 335 336 337 338 339 340 341 342 343 344 345 346 347 348
   */
  public function offsetUnset($offset) {
    unset($this->definition[$offset]);
  }

  /**
   * Returns all definition values as array.
   *
   * @return array
   */
  public function toArray() {
    return $this->definition;
  }

}