diff core/lib/Drupal/Core/Condition/ConditionAccessResolverTrait.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/lib/Drupal/Core/Condition/ConditionAccessResolverTrait.php	Wed Nov 29 16:09:58 2017 +0000
@@ -0,0 +1,49 @@
+<?php
+
+namespace Drupal\Core\Condition;
+
+use Drupal\Component\Plugin\Exception\ContextException;
+
+/**
+ * Resolves a set of conditions.
+ */
+trait ConditionAccessResolverTrait {
+
+  /**
+   * Resolves the given conditions based on the condition logic ('and'/'or').
+   *
+   * @param \Drupal\Core\Condition\ConditionInterface[] $conditions
+   *   A set of conditions.
+   * @param string $condition_logic
+   *   The logic used to compute access, either 'and' or 'or'.
+   *
+   * @return bool
+   *   Whether these conditions grant or deny access.
+   */
+  protected function resolveConditions($conditions, $condition_logic) {
+    foreach ($conditions as $condition) {
+      try {
+        $pass = $condition->execute();
+      }
+      catch (ContextException $e) {
+        // If a condition is missing context and is not negated, consider that a
+        // fail.
+        $pass = $condition->isNegated();
+      }
+
+      // If a condition fails and all conditions were needed, deny access.
+      if (!$pass && $condition_logic == 'and') {
+        return FALSE;
+      }
+      // If a condition passes and only one condition was needed, grant access.
+      elseif ($pass && $condition_logic == 'or') {
+        return TRUE;
+      }
+    }
+
+    // Return TRUE if logic was 'and', meaning all rules passed.
+    // Return FALSE if logic was 'or', meaning no rule passed.
+    return $condition_logic == 'and';
+  }
+
+}