flow-1.0.0-beta8/src/Plugin/flow/Derivative/Task/RelateDeriver.php
src/Plugin/flow/Derivative/Task/RelateDeriver.php
<?php
namespace Drupal\flow\Plugin\flow\Derivative\Task;
use Drupal\flow\Helpers\EntityFieldManagerTrait;
use Drupal\flow\Plugin\flow\Derivative\ContentDeriverBase;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Task plugin deriver for relating content.
*
* @see \Drupal\flow\Plugin\flow\Task\Relate
*/
class RelateDeriver extends ContentDeriverBase {
use EntityFieldManagerTrait;
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, $base_plugin_id) {
/** @var \Drupal\flow\Plugin\flow\Derivative\Subject\ReferenceDeriver $instance */
$instance = parent::create($container, $base_plugin_id);
$instance->setEntityFieldManager($container->get(self::$entityFieldManagerServiceName));
return $instance;
}
/**
* {@inheritdoc}
*/
public function getDerivativeDefinitions($base_plugin_definition) {
$content_derivatives = parent::getDerivativeDefinitions($base_plugin_definition);
$relate_derivatives = [];
foreach ($content_derivatives as &$source_content_derivative) {
$field_definitions = $this->entityFieldManager->getFieldDefinitions($source_content_derivative['entity_type'], $source_content_derivative['bundle']);
$reference_targets = [];
foreach ($field_definitions as $field_definition) {
$field_storage_definition = $field_definition->getFieldStorageDefinition();
if (!(strpos($field_storage_definition->getType(), 'entity_reference') === 0)) {
continue;
};
$target_type = $field_storage_definition->getSetting('target_type');
$handler_settings = $field_definition->getConfig($source_content_derivative['bundle'])->getSetting('handler_settings');
if (!isset($reference_targets[$target_type])) {
$reference_targets[$target_type] = [];
}
if (!empty($handler_settings['target_bundles'])) {
$reference_targets[$target_type] += $handler_settings['target_bundles'];
}
else {
$reference_targets[$target_type] = [];
}
}
foreach ($reference_targets as $target_type => $target_bundles) {
foreach ($content_derivatives as $target_content_derivative) {
$target_content_derivative['entity_type'];
$target_content_derivative['bundle'];
if (($target_type !== $target_content_derivative['entity_type']) || (!empty($target_bundles) && !in_array($target_content_derivative['bundle'], $target_bundles))) {
continue;
}
$derivative_id = $source_content_derivative['entity_type'] . '.' . $source_content_derivative['bundle'] . '::' . $target_content_derivative['entity_type'] . '.' . $target_content_derivative['bundle'];
$relate_derivatives[$derivative_id] = [
'label' => $this->t('Relate @source with @target', [
'@source' => $source_content_derivative['label'],
'@target' => $target_content_derivative['label'],
]),
] + $source_content_derivative;
}
}
}
return $relate_derivatives;
}
}
