You are here

class ConfigPagesValueAccess in Config Pages 8.3

Same name and namespace in other branches
  1. 8.2 src/Plugin/Condition/ConfigPagesValueAccess.php \Drupal\config_pages\Plugin\Condition\ConfigPagesValueAccess

Provides a 'Access by ConfigPage field value' condition.

Plugin annotation


@Condition(
  id = "config_pages_values_access",
  label = @Translation("ConfigPage field value")
)

Hierarchy

Expanded class hierarchy of ConfigPagesValueAccess

File

src/Plugin/Condition/ConfigPagesValueAccess.php, line 21

Namespace

Drupal\config_pages\Plugin\Condition
View source
class ConfigPagesValueAccess extends ConditionPluginBase implements ContainerFactoryPluginInterface {

  /**
   * Drupal\config_pages\ConfigPagesInterface.
   *
   * @var \Drupal\config_pages\ConfigPagesInterface
   */
  protected $configPagesLoader;

  /**
   * The entity field manager.
   *
   * @var \Drupal\Core\Entity\EntityFieldManagerInterface
   */
  protected $entityFieldManager;

  /**
   * Allowed field types.
   *
   * @var array
   */
  protected $allowedFieldTypes;

  /**
   * ConfigPagesValueAccess constructor.
   *
   * @param array $configuration
   *   A configuration array containing information about the plugin instance.
   * @param string $plugin_id
   *   The plugin_id for the plugin instance.
   * @param array $plugin_definition
   *   The plugin implementation definition.
   * @param \Drupal\config_pages\ConfigPagesLoaderServiceInterface $configPagesLoader
   *   The ConfigPages loader service.
   * @param \Drupal\Core\Entity\EntityFieldManagerInterface $entityFieldManager
   *   The entity field manager.
   */
  public function __construct(array $configuration, $plugin_id, $plugin_definition, ConfigPagesLoaderServiceInterface $configPagesLoader, EntityFieldManagerInterface $entityFieldManager) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
    $this->configPagesLoader = $configPagesLoader;
    $this->entityFieldManager = $entityFieldManager;
    $this->allowedFieldTypes = [
      'string',
      'boolean',
      'decimal',
      'datetime',
      'integer',
      'list_integer',
    ];
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static($configuration, $plugin_id, $plugin_definition, $container
      ->get('config_pages.loader'), $container
      ->get('entity_field.manager'));
  }

  /**
   * {@inheritdoc}
   */
  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
    $form = parent::buildConfigurationForm($form, $form_state);

    // Get all available ConfigPages types and prepare options list.
    $config = $this
      ->getConfiguration();
    $config_pages_types = ConfigPagesType::loadMultiple();

    // Build select options from allowed fields.
    $field_options = [
      '_none' => $this
        ->t('None'),
    ];
    foreach ($config_pages_types as $cp_type) {
      $id = $cp_type
        ->id();
      $label = $cp_type
        ->label();
      $cp_field = $this
        ->getConfigPageFields($id);
      if (!empty($cp_field)) {
        $field_options[$label] = $this
          ->getConfigPageFields($id);
      }
    }

    // Add form items.
    $form['negate']['#access'] = FALSE;
    $form['config_page_field'] = [
      '#type' => 'select',
      '#title' => $this
        ->t('Select ConfigPage field to check'),
      '#options' => $field_options,
      '#default_value' => isset($config['config_page_field']) ? $config['config_page_field'] : '',
      '#description' => $this
        ->t('Applied for: @types', [
        '@types' => implode(', ', $this->allowedFieldTypes),
      ]),
    ];
    $operandOptions = $this
      ->getOperandOptions();
    $form['operator'] = [
      '#type' => 'select',
      '#title' => $this
        ->t('Operator'),
      '#options' => $operandOptions,
      '#default_value' => isset($config['operator']) ? $config['operator'] : array_keys($operandOptions)[0],
    ];
    $form['condition_value'] = [
      '#type' => 'textfield',
      '#title' => $this
        ->t('Value'),
      '#default_value' => isset($config['condition_value']) ? $config['condition_value'] : '',
      '#size' => 21,
      '#description' => $this
        ->t("Use 0 / 1 for boolean fields."),
    ];
    return $form;
  }

  /**
   * Returns supported operators.
   *
   * @return array
   *   Array of operators with their descriptions.
   */
  public function getOperandOptions() {
    $operator = [
      '==' => $this
        ->t('Is equal to'),
      '<' => $this
        ->t('Is less than'),
      '<=' => $this
        ->t('Is less than or equal to'),
      '!=' => $this
        ->t('Is not equal to'),
      '>=' => $this
        ->t('Is greater than or equal to'),
      '>' => $this
        ->t('Is greater than'),
      'isset' => $this
        ->t('Not empty'),
    ];
    return $operator;
  }

  /**
   * Returns list of fields for config page.
   *
   * @return array
   *   Array of operators with their descriptions.
   */
  public function getConfigPageFields($type) {
    $result = [];
    if (!empty($type)) {

      // Get custom fields from config page.
      $base_fields = $this->entityFieldManager
        ->getBaseFieldDefinitions('config_pages');
      $fields = $this->entityFieldManager
        ->getFieldDefinitions('config_pages', $type);
      $custom_fields = array_diff_key($fields, $base_fields);

      // Build select options.
      foreach ($custom_fields as $id => $field_config) {
        $field_type = $field_config
          ->getType();
        if (in_array($field_type, $this->allowedFieldTypes)) {
          $result[$type . '|' . $id . '|' . $field_type] = $field_config
            ->getLabel() . ' (' . $id . ')';
        }
      }
    }
    return $result;
  }

  /**
   * {@inheritdoc}
   */
  public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
  }

  /**
   * {@inheritdoc}
   */
  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
    parent::submitConfigurationForm($form, $form_state);
    $field = $form_state
      ->getValue('config_page_field');
    if ($field == '_none') {
      $this->configuration = [];
    }
    else {
      $this->configuration['config_page_field'] = $field;
      $this->configuration['operator'] = $form_state
        ->getValue('operator');
      $this->configuration['condition_value'] = $form_state
        ->getValue('condition_value');
    }
  }

  /**
   * {@inheritdoc}
   */
  public function summary() {
    $config_page_field = $this->configuration['config_page_field'];
    $condition_value = $this->configuration['condition_value'];
    $operator = $this->configuration['operator'];
    $operators_list = $this
      ->getOperandOptions();
    list($cp_type, $field, $data_type) = explode('|', $config_page_field);
    $summary = $this
      ->t('Allow if field @field @op @value', [
      '@field' => $field,
      '@op' => strtolower($operators_list[$operator]),
      '@value' => $condition_value,
    ]);
    return $summary;
  }

  /**
   * {@inheritdoc}
   */
  public function evaluate() {
    $config = $this
      ->getConfiguration();
    if (isset($config['config_page_field'], $config['operator'], $config['condition_value'])) {
      $config_page_field = $config['config_page_field'];
      $operator = $config['operator'];
      $condition_value = $config['condition_value'];
      list($cp_type, $field, $data_type) = explode('|', $config_page_field);

      // Get field value.
      $field_value = $this->configPagesLoader
        ->getValue($cp_type, $field, 0, 'value');
      return $this
        ->compareValues($condition_value, $field_value, $operator);
    }
    return TRUE;
  }

  /**
   * Compare values based on operator.
   *
   * @return bool
   *   TRUE if comprising match.
   */
  protected function compareValues($value, $field_value, $operator) {

    // Compare values according to operator.
    switch ($operator) {
      case '==':
        $result = $field_value == $value;
        break;
      case '<':
        $result = $field_value < $value;
        break;
      case '<=':
        $result = $field_value <= $value;
        break;
      case '!=':
        $result = $field_value != $value;
        break;
      case '>=':
        $result = $field_value >= $value;
        break;
      case '>':
        $result = $field_value > $value;
        break;
      case 'isset':
        $result = !empty($field_value) === !empty($value);
        break;
      default:
        $result = FALSE;
    }
    return $result;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
ConditionPluginBase::$executableManager protected property The condition manager to proxy execute calls through.
ConditionPluginBase::calculateDependencies public function Calculates dependencies for the configured plugin. Overrides DependentPluginInterface::calculateDependencies
ConditionPluginBase::defaultConfiguration public function Gets default configuration for this plugin. Overrides ConfigurableInterface::defaultConfiguration 5
ConditionPluginBase::execute public function Executes the plugin. Overrides ExecutableInterface::execute
ConditionPluginBase::getConfiguration public function Gets this plugin's configuration. Overrides ConfigurableInterface::getConfiguration
ConditionPluginBase::isNegated public function Determines whether condition result will be negated. Overrides ConditionInterface::isNegated
ConditionPluginBase::setConfiguration public function Sets the configuration for this plugin instance. Overrides ConfigurableInterface::setConfiguration
ConditionPluginBase::setExecutableManager public function Sets the executable manager class. Overrides ConditionInterface::setExecutableManager
ConfigPagesValueAccess::$allowedFieldTypes protected property Allowed field types.
ConfigPagesValueAccess::$configPagesLoader protected property Drupal\config_pages\ConfigPagesInterface.
ConfigPagesValueAccess::$entityFieldManager protected property The entity field manager.
ConfigPagesValueAccess::buildConfigurationForm public function Form constructor. Overrides ConditionPluginBase::buildConfigurationForm
ConfigPagesValueAccess::compareValues protected function Compare values based on operator.
ConfigPagesValueAccess::create public static function Creates an instance of the plugin. Overrides ContainerFactoryPluginInterface::create
ConfigPagesValueAccess::evaluate public function Evaluates the condition and returns TRUE or FALSE accordingly. Overrides ConditionInterface::evaluate
ConfigPagesValueAccess::getConfigPageFields public function Returns list of fields for config page.
ConfigPagesValueAccess::getOperandOptions public function Returns supported operators.
ConfigPagesValueAccess::submitConfigurationForm public function Form submission handler. Overrides ConditionPluginBase::submitConfigurationForm
ConfigPagesValueAccess::summary public function Provides a human readable summary of the condition's configuration. Overrides ConditionInterface::summary
ConfigPagesValueAccess::validateConfigurationForm public function Form validation handler. Overrides ConditionPluginBase::validateConfigurationForm
ConfigPagesValueAccess::__construct public function ConfigPagesValueAccess constructor. Overrides ConditionPluginBase::__construct
ContextAwarePluginAssignmentTrait::addContextAssignmentElement protected function Builds a form element for assigning a context to a given slot.
ContextAwarePluginAssignmentTrait::contextHandler protected function Wraps the context handler.
ContextAwarePluginAssignmentTrait::t abstract protected function Ensures the t() method is available.
ContextAwarePluginBase::$context protected property The data objects representing the context of this plugin.
ContextAwarePluginBase::$contexts Deprecated private property Data objects representing the contexts passed in the plugin configuration.
ContextAwarePluginBase::createContextFromConfiguration protected function Overrides ContextAwarePluginBase::createContextFromConfiguration
ContextAwarePluginBase::getCacheContexts public function The cache contexts associated with this object. Overrides CacheableDependencyInterface::getCacheContexts 9
ContextAwarePluginBase::getCacheMaxAge public function The maximum age for which this object may be cached. Overrides CacheableDependencyInterface::getCacheMaxAge 7
ContextAwarePluginBase::getCacheTags public function The cache tags associated with this object. Overrides CacheableDependencyInterface::getCacheTags 4
ContextAwarePluginBase::getContext public function This code is identical to the Component in order to pick up a different Context class. Overrides ContextAwarePluginBase::getContext
ContextAwarePluginBase::getContextDefinition public function Overrides ContextAwarePluginBase::getContextDefinition
ContextAwarePluginBase::getContextDefinitions public function Overrides ContextAwarePluginBase::getContextDefinitions
ContextAwarePluginBase::getContextMapping public function Gets a mapping of the expected assignment names to their context names. Overrides ContextAwarePluginInterface::getContextMapping
ContextAwarePluginBase::getContexts public function Gets the defined contexts. Overrides ContextAwarePluginInterface::getContexts
ContextAwarePluginBase::getContextValue public function Gets the value for a defined context. Overrides ContextAwarePluginInterface::getContextValue
ContextAwarePluginBase::getContextValues public function Gets the values for all defined contexts. Overrides ContextAwarePluginInterface::getContextValues
ContextAwarePluginBase::setContext public function Set a context on this plugin. Overrides ContextAwarePluginBase::setContext
ContextAwarePluginBase::setContextMapping public function Sets a mapping of the expected assignment names to their context names. Overrides ContextAwarePluginInterface::setContextMapping
ContextAwarePluginBase::setContextValue public function Sets the value for a defined context. Overrides ContextAwarePluginBase::setContextValue
ContextAwarePluginBase::validateContexts public function Validates the set values for the defined contexts. Overrides ContextAwarePluginInterface::validateContexts
ContextAwarePluginBase::__get public function Implements magic __get() method.
DependencySerializationTrait::$_entityStorages protected property An array of entity type IDs keyed by the property name of their storages.
DependencySerializationTrait::$_serviceIds protected property An array of service IDs keyed by property name used for serialization.
DependencySerializationTrait::__sleep public function 1
DependencySerializationTrait::__wakeup public function 2
ExecutablePluginBase::getConfig public function Gets all configuration values.
ExecutablePluginBase::getConfigDefinition public function Gets the definition of a configuration option.
ExecutablePluginBase::getConfigDefinitions public function Gets an array of definitions of available configuration options.
ExecutablePluginBase::setConfig public function Sets the value of a particular configuration option.
PluginBase::$configuration protected property Configuration information passed into the plugin. 1
PluginBase::$pluginDefinition protected property The plugin implementation definition. 1
PluginBase::$pluginId protected property The plugin_id.
PluginBase::DERIVATIVE_SEPARATOR constant A string which is used to separate base plugin IDs from the derivative ID.
PluginBase::getBaseId public function Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface::getBaseId
PluginBase::getDerivativeId public function Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface::getDerivativeId
PluginBase::getPluginDefinition public function Gets the definition of the plugin implementation. Overrides PluginInspectionInterface::getPluginDefinition 3
PluginBase::getPluginId public function Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface::getPluginId
PluginBase::isConfigurable public function Determines if the plugin is configurable.
StringTranslationTrait::$stringTranslation protected property The string translation service. 1
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
TypedDataTrait::$typedDataManager protected property The typed data manager used for creating the data types.
TypedDataTrait::getTypedDataManager public function Gets the typed data manager. 2
TypedDataTrait::setTypedDataManager public function Sets the typed data manager. 2