commerce_product_bundles-8.x-1.0/src/Plugin/Field/FieldType/CommerceBundleField.php
src/Plugin/Field/FieldType/CommerceBundleField.php
<?php
namespace Drupal\commerce_product_bundles\Plugin\Field\FieldType;
use Drupal\Core\Field\FieldItemBase;
use Drupal\Core\Field\FieldItemInterface;
use Drupal\Core\TypedData\DataDefinition;
use Drupal\Core\TypedData\MapDataDefinition;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\Core\Validation\Plugin\Validation\Constraint\AllowedValuesConstraint;
/**
* Plugin implementation of the 'product_bundle_field' field type.
*
* @FieldType(
* id = "product_bundle_field",
* label = @Translation("Commerce product bundle field"),
* description = @Translation("Field containing areferenced product variations and quantity"),
* category = @Translation("Commerce Product Bundles"),
* default_widget = "product_bundle_field_default",
* default_formatter = "product_bundle_field_formatter"
* )
*/
class CommerceBundleField extends FieldItemBase implements FieldItemInterface {
/**
* {@inheritdoc}
*/
public static function schema(FieldStorageDefinitionInterface $field_definition) {
return [
'description' => 'The base table for Commerce product bundle field type.',
'columns' => [
'variation_ids' => [
'type' => 'blob',
'size' => 'big',
'not null' => FALSE,
'serialize' => TRUE,
'description' => 'Variation ids.',
],
'product_id' => [
'description' => 'The ID of the target entity.',
'type' => 'int',
'unsigned' => TRUE,
],
'quantity' => [
'description' => 'Product variation quantity',
'type' => 'int',
'not null' => TRUE,
'default' => 1,
],
],
];
}
/**
* {@inheritdoc}
*/
public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
$properties['variation_ids'] = MapDataDefinition::create()
->setRequired(TRUE)
->setLabel(t('Product variation id'));
$properties['product_id'] = DataDefinition::create('integer')
->setLabel('Product')
->setRequired(TRUE)
->setSetting('unsigned', TRUE);
$properties['quantity'] = DataDefinition::create('integer')
->setLabel('Quantity')
->setRequired(TRUE)
->setSetting('unsigned', TRUE);
return $properties;
}
/**
* {@inheritdoc}
*/
public function getConstraints() {
$constraints = parent::getConstraints();
// Remove the 'AllowedValuesConstraint' validation constraint because entity
// reference fields already use the 'ValidReference' constraint.
foreach ($constraints as $key => $constraint) {
if ($constraint instanceof AllowedValuesConstraint) {
unset($constraints[$key]);
}
}
return $constraints;
}
/**
* {@inheritdoc}
*/
public function setValue($values, $notify = TRUE) {
$this->values = [];
if (!isset($values)) {
return;
}
$product_id = NULL;
if(isset($values['product_id'])){
$product_id = $values['product_id'];
}
$this->values['product_id'] = $product_id;
// Get stores value for serialization.
$variation_ids = NULL;
if(isset($values['variation_ids'])){
if (!is_array($values['variation_ids'])) {
$variation_ids = unserialize($values['variation_ids'], ['allowed_classes' => FALSE]);
}else{
$variation_ids = $values['variation_ids'];
}
}
$this->values['variation_ids'] = $variation_ids;
$quantity = NULL;
if(isset($values['quantity'])){
$quantity = $values['quantity'];
}
$this->values['quantity'] = $quantity;
// Notify the parent of any changes.
if ($notify && isset($this->parent)) {
$this->parent->onChange($this->name);
}
}
/**
* {@inheritdoc}
*/
public static function mainPropertyName() {
// A map item has no main property.
return NULL;
}
/**
* {@inheritdoc}
*/
public function isEmpty() { }
}
