ContextProviderTrait.php

Namespace

Drupal\rules\Context

File

src/Context/ContextProviderTrait.php

View source
<?php

namespace Drupal\rules\Context;

use Drupal\Component\Plugin\Exception\ContextException;
use Drupal\Core\Plugin\Context\Context;
use Symfony\Component\Routing\Route;

/**
 * A trait implementing the ContextProviderInterface.
 *
 * This trait is intended for context aware plugins that want to provide
 * context.
 *
 * The trait requires the plugin to use configuration as defined by the
 * ContextConfig class.
 *
 * @see \Drupal\rules\Context\ContextProviderInterface
 */
trait ContextProviderTrait {
  
  /**
   * The data objects that are provided by this plugin.
   *
   * @var \Drupal\Component\Plugin\Context\ContextInterface[]
   */
  protected $providedContext;
  
  /**
   * @see \Drupal\rules\Context\ContextProviderInterface
   */
  public function setProvidedValue($name, $value) {
    $context = $this->getProvidedContext($name);
    $new_context = Context::createFromContext($context, $value);
    $this->providedContext[$name] = $new_context;
    return $this;
  }
  
  /**
   * @see \Drupal\rules\Context\ContextProviderInterface
   */
  public function getProvidedContext($name) {
    // Check for a valid context value.
    if (!isset($this->providedContext[$name])) {
      $this->providedContext[$name] = new Context($this->getProvidedContextDefinition($name));
    }
    return $this->providedContext[$name];
  }
  
  /**
   * @see \Drupal\rules\Context\ContextProviderInterface
   */
  public function getProvidedContextDefinition($name) {
    $definition = $this->getPluginDefinition();
    if (empty($definition['provides'][$name])) {
      throw new ContextException(sprintf("The provided context '%s' is not valid.", $name));
    }
    return $definition['provides'][$name];
  }
  
  /**
   * @see \Drupal\rules\Context\ContextProviderInterface
   */
  public function getProvidedContextDefinitions() {
    $definition = $this->getPluginDefinition();
    return !empty($definition['provides']) ? $definition['provides'] : [];
  }
  
  /**
   * Upcasts an entity id to a full entity object.
   *
   * Returns the entity object if the upcast was successful, otherwise returns
   * NULL.
   *
   * @todo Rather than returning NULL, we should probably throw an exception.
   * That way the calling code may attempt an upcast, then continue on as it
   * used to if the upcast fails.
   *
   * @param string $id
   *   The unique entity id to upcast to a full entity.
   * @param string $type
   *   The entity data type. For example, "entity:node".
   *
   * @return \Drupal\Core\Entity\EntityInterface|null
   *   The upcasted entity object (if successful) or null (if not).
   */
  public function upcastEntityId($id, $type) {
    // If the passed value is (accidentally) already an object, just return it.
    if (is_object($id)) {
      return $id;
    }
    $paramConverterManager = \Drupal::service('paramconverter_manager');
    /** @var \Drupal\Core\ParamConverter\ParamConverterInterface $param_converter */
    $param_converter = $paramConverterManager->getConverter('paramconverter.entity');
    // The $name variable is just an arbitrary slug for use in the route object.
    $name = 'id_to_upcast';
    // The $definition variable declares what datatype the slug represents.
    $definition = [
      'type' => $type,
    ];
    // The Route class used here is just a data structure for holding data
    // necessary for a route definition. Creating an object of this type does
    // not in any way affect routing on the site. We only use Route here because
    // the paramconverter_manager requires this structure for one of its inputs.
    $route = new Route('/{$name}');
    // Check that the definition can be upcast and if so do it.
    if ($param_converter->applies($definition, $name, $route)) {
      $defaults = [
        $name => $id,
      ];
      $upcasted_object = $param_converter->convert(strtolower($id), $definition, $name, $defaults);
      return $upcasted_object;
    }
    else {
      return NULL;
    }
  }

}

Traits

Title Deprecated Summary
ContextProviderTrait A trait implementing the ContextProviderInterface.