Security update for Core, with self-updated composer
[yaffs-website] / web / core / modules / menu_ui / src / Plugin / Validation / Constraint / MenuSettingsConstraintValidator.php
diff --git a/web/core/modules/menu_ui/src/Plugin/Validation/Constraint/MenuSettingsConstraintValidator.php b/web/core/modules/menu_ui/src/Plugin/Validation/Constraint/MenuSettingsConstraintValidator.php
new file mode 100644 (file)
index 0000000..85f7bee
--- /dev/null
@@ -0,0 +1,64 @@
+<?php
+
+namespace Drupal\menu_ui\Plugin\Validation\Constraint;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+
+/**
+ * Constraint validator for changing the menu settings in pending revisions.
+ */
+class MenuSettingsConstraintValidator extends ConstraintValidator {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validate($entity, Constraint $constraint) {
+    if (isset($entity) && !$entity->isNew() && !$entity->isDefaultRevision()) {
+      $defaults = menu_ui_get_menu_link_defaults($entity);
+      $values = $entity->menu;
+      $violation_path = NULL;
+
+      if (trim($values['title']) && !empty($values['menu_parent'])) {
+        list($menu_name, $parent) = explode(':', $values['menu_parent'], 2);
+        $values['menu_name'] = $menu_name;
+        $values['parent'] = $parent;
+      }
+
+      // Handle the case when a menu link is added to a pending revision.
+      if (!$defaults['entity_id'] && $values['enabled']) {
+        $violation_path = 'menu';
+      }
+      // Handle the case when the menu link is deleted in a pending revision.
+      elseif (empty($values['enabled']) && $defaults['entity_id']) {
+        $violation_path = 'menu';
+      }
+      // Handle all the other menu link changes in a pending revision.
+      elseif ($defaults['entity_id']) {
+        if (($values['title'] != $defaults['title'])) {
+          $violation_path = 'menu.title';
+        }
+        elseif (($values['description'] != $defaults['description'])) {
+          $violation_path = 'menu.description';
+        }
+        elseif ($defaults['entity_id'] && ($values['menu_name'] != $defaults['menu_name'])) {
+          $violation_path = 'menu.menu_parent';
+        }
+        elseif (isset($values['parent']) && ($values['parent'] != $defaults['parent'])) {
+          $violation_path = 'menu.menu_parent';
+        }
+        elseif (($values['weight'] != $defaults['weight'])) {
+          $violation_path = 'menu.weight';
+        }
+      }
+
+      if ($violation_path) {
+        $this->context->buildViolation($constraint->message)
+          ->atPath($violation_path)
+          ->setInvalidValue($entity)
+          ->addViolation();
+      }
+    }
+  }
+
+}