acquia_commercemanager-8.x-1.122/modules/acm_sku/src/Plugin/Field/FieldType/SKUFieldType.php
modules/acm_sku/src/Plugin/Field/FieldType/SKUFieldType.php
<?php namespace Drupal\acm_sku\Plugin\Field\FieldType; use Drupal\acm_sku\Entity\SKU; use Drupal\Component\Utility\Random; use Drupal\Core\Entity\TypedData\EntityDataDefinition; use Drupal\Core\Field\FieldDefinitionInterface; use Drupal\Core\Field\FieldItemBase; use Drupal\Core\Field\FieldStorageDefinitionInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\StringTranslation\TranslatableMarkup; use Drupal\Core\TypedData\DataDefinition; use Drupal\Core\TypedData\DataReferenceDefinition; /** * Plugin implementation of the 'sku' field type. * * @FieldType( * id = "sku", * label = @Translation("SKU Reference"), * description = @Translation("SKU Reference"), * module = "acm_sku", * default_widget = "sku_widget", * default_formatter = "sku_formatter" * ) */ class SKUFieldType extends FieldItemBase { /** * {@inheritdoc} */ public static function defaultStorageSettings() { return [ 'max_length' => 255, 'is_ascii' => FALSE, 'case_sensitive' => FALSE, ] + parent::defaultStorageSettings(); } /** * {@inheritdoc} */ public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) { // Prevent early t() calls by using the TranslatableMarkup. $properties['value'] = DataDefinition::create('string') ->setLabel(new TranslatableMarkup('Text value')) ->setSetting('case_sensitive', $field_definition->getSetting('case_sensitive')) ->setRequired(TRUE); // Add a computed reference to the field values. This allows us to index // and to reference the entity properties. $properties['entity'] = DataReferenceDefinition::create('entity') ->setLabel(new TranslatableMarkup('SKU Reference')) ->setDescription(new TranslatableMarkup('The referenced entity')) ->setComputed(TRUE) ->setReadOnly(FALSE) ->setRequired(FALSE) ->setTargetDefinition(EntityDataDefinition::create('acm_sku')) ->addConstraint('EntityType', 'acm_sku'); return $properties; } /** * {@inheritdoc} */ public static function mainPropertyName() { return 'value'; } /** * {@inheritdoc} * * Attempt to load referenced entity values when they're accessed. */ public function get($property_name) { if ($property_name === 'entity' && !isset($this->values[$property_name])) { $value = $this->values[$property_name] = SKU::loadFromSku($this->values['value'], $this->getLangcode()); $this->properties[$property_name] = $this->getTypedDataManager()->getPropertyInstance($this, $property_name, $value); } return parent::get($property_name); } /** * {@inheritdoc} */ public static function schema(FieldStorageDefinitionInterface $field_definition) { $schema = [ 'columns' => [ 'value' => [ 'type' => $field_definition->getSetting('is_ascii') === TRUE ? 'varchar_ascii' : 'varchar', 'length' => (int) $field_definition->getSetting('max_length'), 'binary' => $field_definition->getSetting('case_sensitive'), ], ], ]; return $schema; } /** * {@inheritdoc} */ public function getConstraints() { $constraints = parent::getConstraints(); if ($max_length = $this->getSetting('max_length')) { $constraint_manager = \Drupal::typedDataManager()->getValidationConstraintManager(); $constraints[] = $constraint_manager->create('ComplexData', [ 'value' => [ 'Length' => [ 'max' => $max_length, 'maxMessage' => t('%name: may not be longer than @max characters.', [ '%name' => $this->getFieldDefinition()->getLabel(), '@max' => $max_length, ]), ], ], ]); } return $constraints; } /** * {@inheritdoc} */ public static function generateSampleValue(FieldDefinitionInterface $field_definition) { $random = new Random(); $values['value'] = $random->word(mt_rand(1, $field_definition->getSetting('max_length'))); return $values; } /** * {@inheritdoc} */ public function storageSettingsForm(array &$form, FormStateInterface $form_state, $has_data) { $elements = []; $elements['max_length'] = [ '#type' => 'number', '#title' => t('Maximum length'), '#default_value' => $this->getSetting('max_length'), '#required' => TRUE, '#description' => t('The maximum length of the field in characters.'), '#min' => 1, '#disabled' => $has_data, ]; return $elements; } /** * {@inheritdoc} */ public function isEmpty() { $value = $this->get('value')->getValue(); return $value === NULL || $value === ''; } }