View source
<?php
namespace Drupal\conflict;
use Drupal\Component\Utility\SortArray;
use Drupal\conflict\Annotation\FieldComparator;
use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Plugin\DefaultPluginManager;
class FieldComparatorManager extends DefaultPluginManager implements FieldComparatorManagerInterface {
protected $fieldComparators;
protected $orderedFieldComparators;
public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler) {
parent::__construct('Plugin/Conflict/FieldComparator', $namespaces, $module_handler, FieldComparatorInterface::class, FieldComparator::class);
$this
->setCacheBackend($cache_backend, 'conflict.field_comparator.plugins');
}
public function getConflictType(FieldItemListInterface $local, FieldItemListInterface $server, FieldItemListInterface $original, $langcode, $entity_type_id, $bundle, $field_type, $field_name) {
foreach ($this
->getOrderedFieldComparators($entity_type_id, $bundle, $field_type, $field_name) as &$comparator) {
if (!is_object($comparator)) {
$comparator = $this
->createInstance($comparator);
}
if ($comparator::isApplicable($local
->getFieldDefinition())) {
$conflict_type = $comparator
->getConflictType($local, $server, $original, $langcode, $entity_type_id, $bundle, $field_type, $field_name);
if ($conflict_type) {
return $conflict_type;
}
}
}
return NULL;
}
public function hasChanged(FieldItemListInterface $items_a, FieldItemListInterface $items_b, $langcode, $entity_type_id, $bundle, $field_type, $field_name) {
foreach ($this
->getOrderedFieldComparators($entity_type_id, $bundle, $field_type, $field_name) as &$comparator) {
if (!is_object($comparator)) {
$comparator = $this
->createInstance($comparator);
}
if ($comparator::isApplicable($items_a
->getFieldDefinition())) {
$result = $comparator
->hasChanged($items_a, $items_b, $langcode, $entity_type_id, $bundle, $field_type, $field_name);
if (is_bool($result)) {
return $result;
}
}
}
return FALSE;
}
protected function getOrderedFieldComparators($entity_type_id, $bundle, $field_type, $field_name) {
if (isset($this->orderedFieldComparators[$entity_type_id][$bundle][$field_type][$field_name])) {
return $this->orderedFieldComparators[$entity_type_id][$bundle][$field_type][$field_name];
}
$this
->initFieldComparators();
$generic = FieldComparatorInterface::APPLIES_TO_ALL;
$comparators = [];
$comparators += $this->fieldComparators[$entity_type_id][$bundle][$field_type][$field_name]['comparators'] ?? [];
$comparators += $this->fieldComparators[$entity_type_id][$bundle][$field_type][$generic]['comparators'] ?? [];
$comparators += $this->fieldComparators[$entity_type_id][$generic][$field_type][$generic]['comparators'] ?? [];
$comparators += $this->fieldComparators[$entity_type_id][$generic][$field_type][$field_name]['comparators'] ?? [];
$comparators += $this->fieldComparators[$entity_type_id][$generic][$generic][$generic]['comparators'] ?? [];
$comparators += $this->fieldComparators[$generic][$generic][$field_type][$generic]['comparators'] ?? [];
$comparators += $this->fieldComparators[$generic][$generic][$generic][$generic]['comparators'] ?? [];
if (empty($comparators)) {
throw new \Exception('There are no field comparators available.');
}
$this->orderedFieldComparators[$entity_type_id][$bundle][$field_type][$field_name] = $comparators;
return $comparators;
}
protected function initFieldComparators() {
if (!isset($this->fieldComparators)) {
$this->fieldComparators = [];
foreach ($this
->getDefinitions() as $plugin_id => $definition) {
$entity_type_id = $definition['entity_type_id'];
$bundle = $definition['bundle'];
$field_type = $definition['field_type'];
$field_name = $definition['field_name'];
if (!isset($this->fieldComparators[$entity_type_id][$bundle][$field_type][$field_name]['comparators'])) {
$this->fieldComparators[$entity_type_id][$bundle][$field_type][$field_name]['comparators'] = [];
}
$this->fieldComparators[$entity_type_id][$bundle][$field_type][$field_name]['comparators'][] = $plugin_id;
}
}
}
protected function findDefinitions() {
$definitions = parent::findDefinitions();
uasort($definitions, [
SortArray::class,
'sortByWeightElement',
]);
$definitions = array_reverse($definitions, TRUE);
return $definitions;
}
}