View source
<?php
namespace Drupal\rules\Form\Expression;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\rules\Context\Form\ContextFormTrait;
use Drupal\rules\Core\ConditionManager;
use Drupal\rules\Engine\ConditionExpressionInterface;
use Drupal\rules\Ui\RulesUiHandlerTrait;
class ConditionForm implements ExpressionFormInterface {
use ContextFormTrait;
use StringTranslationTrait;
use RulesUiHandlerTrait;
protected $conditionManager;
protected $conditionExpression;
public function __construct(ConditionExpressionInterface $condition_expression, ConditionManager $condition_manager) {
$this->conditionManager = $condition_manager;
$this->conditionExpression = $condition_expression;
}
public function form(array $form, FormStateInterface $form_state) {
$condition_id = $form_state
->get('condition_id');
$configuration = $this->conditionExpression
->getConfiguration();
if (empty($condition_id) && !empty($configuration['condition_id'])) {
$condition_id = $configuration['condition_id'];
$form_state
->set('condition_id', $condition_id);
}
if (!$condition_id) {
$condition_definitions = $this->conditionManager
->getGroupedDefinitions();
$options = [];
foreach ($condition_definitions as $group => $definitions) {
foreach ($definitions as $id => $definition) {
if ($group != $this
->t('Other')) {
$options[$group][$id] = $definition['label'];
}
}
}
$form['condition_id'] = [
'#type' => 'select',
'#title' => $this
->t('Condition'),
'#options' => $options,
'#required' => TRUE,
];
$form['continue'] = [
'#type' => 'submit',
'#value' => $this
->t('Continue'),
'#name' => 'continue',
'#limit_validation_errors' => [
[
'condition_id',
],
],
'#submit' => [
static::class . '::submitFirstStep',
],
];
return $form;
}
$condition = $this->conditionManager
->createInstance($condition_id);
$form['summary'] = [
'#type' => 'details',
'#title' => $this
->t('Summary'),
];
$form['summary']['description'] = [
'#type' => 'container',
'#plain_text' => $this
->t('Condition: @summary', [
'@summary' => $condition
->summary(),
]),
'#attributes' => [
'class' => [
'form-item',
],
],
];
$context_definitions = $condition
->getContextDefinitions();
if (!empty($context_definitions)) {
$form['context_definitions'] = [
'#type' => 'details',
'#title' => $this
->t('Context variables'),
'#open' => TRUE,
'#tree' => TRUE,
];
foreach ($context_definitions as $context_name => $context_definition) {
$form = $this
->buildContextForm($form, $form_state, $context_name, $context_definition, $configuration);
}
}
$provides_definitions = $condition
->getProvidedContextDefinitions();
if (!empty($provides_definitions)) {
$form['provides'] = [
'#type' => 'details',
'#title' => $this
->t('Provided variables'),
'#description' => $this
->t('You may change the name of any provided variables, but note that renaming already-utilized variables invalidates the existing uses.'),
'#open' => TRUE,
];
foreach ($provides_definitions as $provides_name => $provides_definition) {
$form = $this
->buildProvidedContextForm($form, $form_state, $provides_name, $provides_definition, $configuration);
}
}
$form['negate_wrapper'] = [
'#type' => 'fieldset',
'#title' => $this
->t('Negate'),
];
$form['negate_wrapper']['negate'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Negate this condition'),
'#default_value' => $configuration['negate'] ?: 0,
'#description' => $this
->t('If checked, the condition result is negated such that it returns TRUE if it evaluates to FALSE.'),
];
$form['save'] = [
'#type' => 'submit',
'#value' => $this
->t('Save'),
'#name' => 'save',
];
return $form;
}
public function validateForm(array $form, FormStateInterface $form_state) {
if ($form_state
->get('condition_id')) {
$this
->submitForm($form, $form_state);
}
}
public static function submitFirstStep(array &$form, FormStateInterface $form_state) {
$form_state
->set('condition_id', $form_state
->getValue('condition_id'));
$form_state
->setRebuild();
}
public function submitForm(array &$form, FormStateInterface $form_state) {
$condition_id = $form_state
->get('condition_id');
if (!$condition_id) {
return;
}
$condition_definition = $this->conditionManager
->getDefinition($condition_id);
$context_config = $this
->getContextConfigFromFormValues($form_state, $condition_definition['context_definitions']);
if ($provided_variables = $form_state
->getValue('provides')) {
foreach ($provided_variables as $provides_name => $provides_context) {
if ($provides_name !== $provides_context['name']) {
\Drupal::messenger()
->addWarning("providing '" . $provides_name . "' as '" . $provides_context['name'] . "'");
$context_config
->provideAs($provides_name, $provides_context['name']);
}
}
}
$configuration = $context_config
->toArray();
$configuration['condition_id'] = $form_state
->get('condition_id');
$configuration['negate'] = $form_state
->getValue('negate');
$this->conditionExpression
->setConfiguration($configuration);
}
}