class TaxNumberItem in Commerce Core 8.2
Plugin implementation of the 'commerce_tax_number' field type.
Plugin annotation
@FieldType(
id = "commerce_tax_number",
label = @Translation("Tax number"),
category = @Translation("Commerce"),
default_formatter = "commerce_tax_number_default",
default_widget = "commerce_tax_number_default",
cardinality = 1,
)
Hierarchy
- class \Drupal\Core\TypedData\TypedData implements PluginInspectionInterface, TypedDataInterface uses DependencySerializationTrait, StringTranslationTrait, TypedDataTrait
- class \Drupal\Core\TypedData\Plugin\DataType\Map implements \Drupal\Core\TypedData\Plugin\DataType\IteratorAggregate, ComplexDataInterface
- class \Drupal\Core\Field\FieldItemBase implements FieldItemInterface
- class \Drupal\commerce_tax\Plugin\Field\FieldType\TaxNumberItem implements TaxNumberItemInterface
- class \Drupal\Core\Field\FieldItemBase implements FieldItemInterface
- class \Drupal\Core\TypedData\Plugin\DataType\Map implements \Drupal\Core\TypedData\Plugin\DataType\IteratorAggregate, ComplexDataInterface
Expanded class hierarchy of TaxNumberItem
File
- modules/
tax/ src/ Plugin/ Field/ FieldType/ TaxNumberItem.php, line 28
Namespace
Drupal\commerce_tax\Plugin\Field\FieldTypeView source
class TaxNumberItem extends FieldItemBase implements TaxNumberItemInterface {
/**
* {@inheritdoc}
*/
public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
$properties['type'] = DataDefinition::create('string')
->setLabel(t('Type'))
->setRequired(TRUE);
$properties['value'] = DataDefinition::create('string')
->setLabel(new TranslatableMarkup('Tax number'))
->setRequired(TRUE);
$properties['verification_state'] = DataDefinition::create('string')
->setLabel(new TranslatableMarkup('Verification state'));
$properties['verification_timestamp'] = DataDefinition::create('timestamp')
->setLabel(new TranslatableMarkup('Verification timestamp'));
$properties['verification_result'] = MapDataDefinition::create()
->setLabel(new TranslatableMarkup('Verification result'));
return $properties;
}
/**
* {@inheritdoc}
*/
public static function mainPropertyName() {
return 'value';
}
/**
* {@inheritdoc}
*/
public static function schema(FieldStorageDefinitionInterface $field_definition) {
return [
'columns' => [
'type' => [
'type' => 'varchar_ascii',
'length' => 255,
],
'value' => [
'type' => 'varchar',
'length' => 64,
],
'verification_state' => [
'type' => 'varchar',
'length' => 64,
],
'verification_timestamp' => [
'type' => 'int',
'size' => 'big',
],
'verification_result' => [
'type' => 'blob',
'size' => 'normal',
'serialize' => TRUE,
],
],
];
}
/**
* {@inheritdoc}
*/
public static function defaultFieldSettings() {
return [
'countries' => [],
'verify' => TRUE,
'allow_unverified' => TRUE,
];
}
/**
* {@inheritdoc}
*/
public function fieldSettingsForm(array $form, FormStateInterface $form_state) {
$country_list = \Drupal::service('address.country_repository')
->getList();
$country_list = [
(string) $this
->t('Regions') => [
'EU' => $this
->t('European Union'),
],
(string) $this
->t('Countries') => $country_list,
];
$element['countries'] = [
'#type' => 'select',
'#title' => $this
->t('Collect tax numbers for the following countries'),
'#description' => $this
->t('If no countries are selected, all countries will be allowed.'),
'#options' => $country_list,
'#default_value' => $this
->getSetting('countries'),
'#multiple' => TRUE,
'#size' => 10,
];
$element['verify'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Verify the tax number via external web services'),
'#description' => $this
->t('Uses an official service (such as VIES) when one exists.'),
'#default_value' => $this
->getSetting('verify'),
];
$element['allow_unverified'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Accept unverified tax numbers if the verification service is temporarily unavailable'),
'#description' => $this
->t('Merchants can verify the tax number after the order has been placed.'),
'#default_value' => $this
->getSetting('allow_unverified'),
'#states' => [
'visible' => [
':input[name="settings[verify]"]' => [
'checked' => TRUE,
],
],
],
];
return $element;
}
/**
* {@inheritdoc}
*/
public function getConstraints() {
$constraints = parent::getConstraints();
$max_length = 64;
$constraint_manager = \Drupal::typedDataManager()
->getValidationConstraintManager();
$constraints[] = $constraint_manager
->create('ComplexData', [
'type' => [
'AllowedValues' => [
'choices' => $this
->getAllowedTypes(),
'message' => $this
->t('Invalid type specified.'),
],
],
'value' => [
'Length' => [
'max' => $max_length,
'maxMessage' => $this
->t('%name: may not be longer than @max characters.', [
'%name' => $this
->getFieldDefinition()
->getLabel(),
'@max' => $max_length,
]),
],
],
'verification_state' => [
'AllowedValues' => [
'choices' => [
VerificationResult::STATE_SUCCESS,
VerificationResult::STATE_FAILURE,
VerificationResult::STATE_UNKNOWN,
],
'message' => $this
->t('Invalid verification_state specified.'),
],
],
]);
$constraints[] = $constraint_manager
->create('TaxNumber', [
'verify' => $this
->getSetting('verify'),
'allowUnverified' => $this
->getSetting('allow_unverified'),
]);
return $constraints;
}
/**
* {@inheritdoc}
*/
public function onChange($property_name, $notify = TRUE) {
if ($property_name == 'type') {
// Make sure the number is re-verified after the type is changed.
$this
->writePropertyValue('verification_state', NULL);
$this
->writePropertyValue('verification_timestamp', NULL);
$this
->writePropertyValue('verification_result', NULL);
}
parent::onChange($property_name, $notify);
}
/**
* {@inheritdoc}
*/
public function isEmpty() {
return $this->value === NULL || $this->value === '';
}
/**
* {@inheritdoc}
*/
public static function generateSampleValue(FieldDefinitionInterface $field_definition) {
$random = new Random();
$values['type'] = 'other';
$values['value'] = $random
->word(mt_rand(1, 32));
return $values;
}
/**
* {@inheritdoc}
*/
public function preSave() {
parent::preSave();
if ($this
->isEmpty() || !empty($this->verification_state)) {
return;
}
// The validator can't modify the field item in order to store the
// verification result. This is why verification must be run again here.
// TaxNumberTypeWithVerificationBase uses a memory cache to avoid making
// multiple API requests for the same data.
$type_plugin = $this
->getTypePlugin();
if ($type_plugin instanceof SupportsVerificationInterface) {
$result = $type_plugin
->verify($this->value);
$this
->applyVerificationResult($result);
}
}
/**
* {@inheritdoc}
*/
public function applyVerificationResult(VerificationResult $result) {
$this->verification_state = $result
->getState();
$this->verification_timestamp = $result
->getTimestamp();
$this->verification_result = $result
->getData();
return $this;
}
/**
* {@inheritdoc}
*/
public function checkValue($expected_type) {
if ($this
->isEmpty() || $this->type != $expected_type) {
return FALSE;
}
if ($this
->getTypePlugin() instanceof SupportsVerificationInterface) {
$verification_state = $this->verification_state;
if ($verification_state == VerificationResult::STATE_UNKNOWN) {
return $this
->getSetting('allow_unverified');
}
else {
return $verification_state == VerificationResult::STATE_SUCCESS;
}
}
else {
return TRUE;
}
}
/**
* {@inheritdoc}
*/
public function getAllowedCountries() {
$countries = array_filter($this
->getSetting('countries'));
if (in_array('EU', $countries)) {
// Replace the EU country with actual members of the EU, plus IM and MC.
// Same list as in the european_union_vat tax number plugin.
$eu_countries = [
'AT',
'BE',
'BG',
'CY',
'CZ',
'DE',
'DK',
'EE',
'ES',
'FI',
'FR',
'GR',
'HR',
'HU',
'IE',
'IM',
'IT',
'LT',
'LU',
'LV',
'MC',
'MT',
'NL',
'PL',
'PT',
'RO',
'SE',
'SI',
'SK',
];
$countries = array_diff($countries, [
'EU',
]);
$countries = array_merge($countries, $eu_countries);
}
if (empty($countries)) {
// All countries are allowed.
$country_list = \Drupal::service('address.country_repository')
->getList();
$countries = array_keys($country_list);
}
return $countries;
}
/**
* {@inheritdoc}
*/
public function getAllowedTypes() {
$tax_number_type_manager = $this
->getTaxNumberTypeManager();
$countries = array_filter($this
->getSetting('countries'));
if ($countries) {
$types = [];
foreach ($countries as $country_code) {
$types[] = $tax_number_type_manager
->getPluginId($country_code);
}
$types = array_unique($types);
}
else {
// All types are allowed.
$types = array_keys($tax_number_type_manager
->getDefinitions());
}
// Ensure a consistent ordering of plugin IDs.
sort($types);
return $types;
}
/**
* {@inheritdoc}
*/
public function getTypePlugin() {
if ($this->type) {
$tax_number_type_manager = $this
->getTaxNumberTypeManager();
return $tax_number_type_manager
->createInstance($this->type);
}
}
/**
* Gets the tax number type plugin manager.
*
* @return \Drupal\commerce_tax\TaxNumberTypeManagerInterface
* The tax number type plugin manager.
*/
protected function getTaxNumberTypeManager() {
return \Drupal::service('plugin.manager.commerce_tax_number_type');
}
}
Members
Name![]() |
Modifiers | Type | Description | Overrides |
---|---|---|---|---|
DependencySerializationTrait:: |
protected | property | An array of entity type IDs keyed by the property name of their storages. | |
DependencySerializationTrait:: |
protected | property | An array of service IDs keyed by property name used for serialization. | |
DependencySerializationTrait:: |
public | function | 1 | |
DependencySerializationTrait:: |
public | function | 2 | |
FieldItemBase:: |
public static | function |
Calculates dependencies for field items. Overrides FieldItemInterface:: |
2 |
FieldItemBase:: |
public static | function |
Calculates dependencies for field items on the storage level. Overrides FieldItemInterface:: |
1 |
FieldItemBase:: |
public static | function |
Defines the storage-level settings for this plugin. Overrides FieldItemInterface:: |
10 |
FieldItemBase:: |
public | function |
Defines custom delete behavior for field values. Overrides FieldItemInterface:: |
2 |
FieldItemBase:: |
public | function |
Defines custom revision delete behavior for field values. Overrides FieldItemInterface:: |
|
FieldItemBase:: |
public static | function |
Returns a settings array in the field type's canonical representation. Overrides FieldItemInterface:: |
1 |
FieldItemBase:: |
public static | function |
Returns a settings array that can be stored as a configuration value. Overrides FieldItemInterface:: |
1 |
FieldItemBase:: |
public | function |
Gets the entity that field belongs to. Overrides FieldItemInterface:: |
|
FieldItemBase:: |
public | function |
Gets the field definition. Overrides FieldItemInterface:: |
|
FieldItemBase:: |
public | function |
Gets the langcode of the field values held in the object. Overrides FieldItemInterface:: |
|
FieldItemBase:: |
protected | function | Returns the value of a field setting. | |
FieldItemBase:: |
protected | function | Returns the array of field settings. | |
FieldItemBase:: |
public static | function |
Informs the plugin that a dependency of the field will be deleted. Overrides FieldItemInterface:: |
1 |
FieldItemBase:: |
public | function |
Defines custom post-save behavior for field values. Overrides FieldItemInterface:: |
2 |
FieldItemBase:: |
public | function |
Sets the data value. Overrides Map:: |
4 |
FieldItemBase:: |
public | function |
Returns a form for the storage-level settings. Overrides FieldItemInterface:: |
8 |
FieldItemBase:: |
public static | function |
Returns a settings array in the field type's canonical representation. Overrides FieldItemInterface:: |
2 |
FieldItemBase:: |
public static | function |
Returns a settings array that can be stored as a configuration value. Overrides FieldItemInterface:: |
2 |
FieldItemBase:: |
public | function |
Returns a renderable array for a single field item. Overrides FieldItemInterface:: |
|
FieldItemBase:: |
protected | function |
Different to the parent Map class, we avoid creating property objects as
far as possible in order to optimize performance. Thus we just update
$this->values if no property object has been created yet. Overrides Map:: |
|
FieldItemBase:: |
public | function |
Constructs a TypedData object given its definition and context. Overrides TypedData:: |
1 |
FieldItemBase:: |
public | function |
Magic method: Gets a property value. Overrides FieldItemInterface:: |
2 |
FieldItemBase:: |
public | function |
Magic method: Determines whether a property is set. Overrides FieldItemInterface:: |
|
FieldItemBase:: |
public | function |
Magic method: Sets a property value. Overrides FieldItemInterface:: |
1 |
FieldItemBase:: |
public | function |
Magic method: Unsets a property. Overrides FieldItemInterface:: |
|
Map:: |
protected | property |
The data definition. Overrides TypedData:: |
|
Map:: |
protected | property | The array of properties. | |
Map:: |
protected | property | An array of values for the contained properties. | |
Map:: |
public | function |
Applies the default value. Overrides TypedData:: |
4 |
Map:: |
public | function |
Gets a property object. Overrides ComplexDataInterface:: |
|
Map:: |
public | function | ||
Map:: |
public | function |
Gets an array of property objects. Overrides ComplexDataInterface:: |
|
Map:: |
public | function |
Returns a string representation of the data. Overrides TypedData:: |
|
Map:: |
public | function |
Gets the data value. Overrides TypedData:: |
1 |
Map:: |
public | function |
Sets a property value. Overrides ComplexDataInterface:: |
|
Map:: |
public | function |
Returns an array of all property values. Overrides ComplexDataInterface:: |
1 |
Map:: |
public | function | Magic method: Implements a deep clone. | |
StringTranslationTrait:: |
protected | property | The string translation service. | 1 |
StringTranslationTrait:: |
protected | function | Formats a string containing a count of items. | |
StringTranslationTrait:: |
protected | function | Returns the number of plurals supported by a given language. | |
StringTranslationTrait:: |
protected | function | Gets the string translation service. | |
StringTranslationTrait:: |
public | function | Sets the string translation service to use. | 2 |
StringTranslationTrait:: |
protected | function | Translates a string to the current language or to a given language. | |
TaxNumberItem:: |
public | function |
Applies the given verification result. Overrides TaxNumberItemInterface:: |
|
TaxNumberItem:: |
public | function |
Checks whether the current value can be used for tax calculation. Overrides TaxNumberItemInterface:: |
|
TaxNumberItem:: |
public static | function |
Defines the field-level settings for this plugin. Overrides FieldItemBase:: |
|
TaxNumberItem:: |
public | function |
Returns a form for the field-level settings. Overrides FieldItemBase:: |
|
TaxNumberItem:: |
public static | function |
Generates placeholder field values. Overrides FieldItemBase:: |
|
TaxNumberItem:: |
public | function |
Gets the allowed countries. Overrides TaxNumberItemInterface:: |
|
TaxNumberItem:: |
public | function |
Gets the allowed tax number types. Overrides TaxNumberItemInterface:: |
|
TaxNumberItem:: |
public | function |
Gets a list of validation constraints. Overrides TypedData:: |
|
TaxNumberItem:: |
protected | function | Gets the tax number type plugin manager. | |
TaxNumberItem:: |
public | function |
Gets the tax number type plugin. Overrides TaxNumberItemInterface:: |
|
TaxNumberItem:: |
public | function |
Determines whether the data structure is empty. Overrides Map:: |
|
TaxNumberItem:: |
public static | function |
Returns the name of the main property, if any. Overrides FieldItemBase:: |
|
TaxNumberItem:: |
public | function |
React to changes to a child property or item. Overrides Map:: |
|
TaxNumberItem:: |
public | function |
Defines custom presave behavior for field values. Overrides FieldItemBase:: |
|
TaxNumberItem:: |
public static | function |
Defines field item properties. Overrides FieldItemInterface:: |
|
TaxNumberItem:: |
public static | function |
Returns the schema for the field. Overrides FieldItemInterface:: |
|
TypedData:: |
protected | property | The property name. | |
TypedData:: |
protected | property | The parent typed data object. | |
TypedData:: |
public static | function |
Constructs a TypedData object given its definition and context. Overrides TypedDataInterface:: |
|
TypedData:: |
public | function |
Gets the data definition. Overrides TypedDataInterface:: |
|
TypedData:: |
public | function |
Returns the name of a property or item. Overrides TypedDataInterface:: |
|
TypedData:: |
public | function |
Returns the parent data structure; i.e. either complex data or a list. Overrides TypedDataInterface:: |
|
TypedData:: |
public | function |
Gets the definition of the plugin implementation. Overrides PluginInspectionInterface:: |
|
TypedData:: |
public | function |
Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface:: |
|
TypedData:: |
public | function |
Returns the property path of the data. Overrides TypedDataInterface:: |
|
TypedData:: |
public | function |
Returns the root of the typed data tree. Overrides TypedDataInterface:: |
|
TypedData:: |
public | function |
Sets the context of a property or item via a context aware parent. Overrides TypedDataInterface:: |
|
TypedData:: |
public | function |
Validates the currently set data value. Overrides TypedDataInterface:: |
|
TypedDataTrait:: |
protected | property | The typed data manager used for creating the data types. | |
TypedDataTrait:: |
public | function | Gets the typed data manager. | 2 |
TypedDataTrait:: |
public | function | Sets the typed data manager. | 2 |