View source
<?php
namespace Drupal\rng\Entity;
use Drupal\Core\Entity\ContentEntityBase;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Field\BaseFieldDefinition;
class Rule extends ContentEntityBase implements RuleInterface {
protected $components_unsaved = [];
public function getEvent() {
return $this
->get('event')->entity;
}
public function getTriggerID() {
return $this
->get('trigger_id')->value;
}
public function isActive() {
return $this
->get('status')->value;
}
public function setIsActive($is_active) {
$this
->set('status', $is_active);
return $this;
}
public function getConditions() {
$ids = \Drupal::entityQuery('rng_rule_component')
->condition('rule', $this
->id(), '=')
->condition('type', 'condition', '=')
->execute();
return array_merge($ids ? RuleComponent::loadMultiple($ids) : [], array_filter($this->components_unsaved, function ($component) {
return $component
->getType() == 'condition';
}));
}
public function getActions() {
$ids = \Drupal::entityQuery('rng_rule_component')
->condition('rule', $this
->id(), '=')
->condition('type', 'action', '=')
->execute();
return array_merge($ids ? RuleComponent::loadMultiple($ids) : [], array_filter($this->components_unsaved, function ($component) {
return $component
->getType() == 'action';
}));
}
public function addComponent(RuleComponentInterface $component) {
$this->components_unsaved[] = $component;
return $this;
}
public function evaluateConditions($context_values = []) {
$success = 0;
$conditions = $this
->getConditions();
$count = 0;
foreach ($conditions as $component) {
if (($condition = $component
->createInstance()) !== NULL) {
$count++;
}
$context_definitions = $condition
->getContextDefinitions();
foreach ($context_values as $name => $value) {
if (isset($context_definitions[$name])) {
$condition
->setContextValue($name, $value);
}
}
if ($condition
->evaluate()) {
$success++;
}
else {
return FALSE;
}
}
return $success == count($conditions) && $count == count($conditions);
}
public function postSave(EntityStorageInterface $storage, $update = TRUE) {
parent::postSave($storage, $update);
foreach ($this->components_unsaved as $k => $component) {
$component
->setRule($this)
->save();
unset($this->components_unsaved[$k]);
}
}
public static function preDelete(EntityStorageInterface $storage, array $entities) {
$component_storage = \Drupal::entityTypeManager()
->getStorage('rng_rule_component');
foreach ($entities as $rule) {
$ids = $component_storage
->getQuery()
->condition('rule', $rule
->id())
->execute();
$components = $component_storage
->loadMultiple($ids);
$component_storage
->delete($components);
}
parent::preDelete($storage, $entities);
}
public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
$fields['id'] = BaseFieldDefinition::create('integer')
->setLabel(t('Rule ID'))
->setDescription(t('The rule ID.'))
->setReadOnly(TRUE)
->setSetting('unsigned', TRUE);
$fields['event'] = BaseFieldDefinition::create('dynamic_entity_reference')
->setLabel(t('Event'))
->setDescription(t('Select event to associate with this rule.'))
->setRequired(TRUE)
->setReadOnly(TRUE);
$fields['trigger_id'] = BaseFieldDefinition::create('string')
->setLabel(t('Trigger'))
->setDescription(t('The trigger ID for this rule.'))
->setRequired(TRUE);
$fields['created'] = BaseFieldDefinition::create('created')
->setLabel(t('Created on'))
->setDescription(t('The time that the rule was created.'));
$fields['changed'] = BaseFieldDefinition::create('changed')
->setLabel(t('Changed'))
->setDescription(t('The last time the rule was edited.'));
$fields['status'] = BaseFieldDefinition::create('boolean')
->setLabel(t('Status'))
->setDescription(t('Whether this rule should run if the trigger is used. 0=disabled, 1=active.'))
->setDefaultValue(FALSE)
->setRequired(TRUE);
return $fields;
}
}