Updated to Drupal 8.5. Core Media not yet in use.
[yaffs-website] / web / core / modules / layout_builder / src / SectionStorage / SectionStorageTrait.php
diff --git a/web/core/modules/layout_builder/src/SectionStorage/SectionStorageTrait.php b/web/core/modules/layout_builder/src/SectionStorage/SectionStorageTrait.php
new file mode 100644 (file)
index 0000000..9d942c7
--- /dev/null
@@ -0,0 +1,114 @@
+<?php
+
+namespace Drupal\layout_builder\SectionStorage;
+
+use Drupal\layout_builder\Section;
+
+/**
+ * Provides a trait for storing sections on an object.
+ *
+ * @internal
+ *   Layout Builder is currently experimental and should only be leveraged by
+ *   experimental modules and development releases of contributed modules.
+ *   See https://www.drupal.org/core/experimental for more information.
+ */
+trait SectionStorageTrait {
+
+  /**
+   * Stores the information for all sections.
+   *
+   * Implementations of this method are expected to call array_values() to rekey
+   * the list of sections.
+   *
+   * @param \Drupal\layout_builder\Section[] $sections
+   *   An array of section objects.
+   *
+   * @return $this
+   */
+  abstract protected function setSections(array $sections);
+
+  /**
+   * {@inheritdoc}
+   */
+  public function count() {
+    return count($this->getSections());
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getSection($delta) {
+    if (!$this->hasSection($delta)) {
+      throw new \OutOfBoundsException(sprintf('Invalid delta "%s"', $delta));
+    }
+
+    return $this->getSections()[$delta];
+  }
+
+  /**
+   * Sets the section for the given delta on the display.
+   *
+   * @param int $delta
+   *   The delta of the section.
+   * @param \Drupal\layout_builder\Section $section
+   *   The layout section.
+   *
+   * @return $this
+   */
+  protected function setSection($delta, Section $section) {
+    $sections = $this->getSections();
+    $sections[$delta] = $section;
+    $this->setSections($sections);
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function appendSection(Section $section) {
+    $delta = $this->count();
+
+    $this->setSection($delta, $section);
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function insertSection($delta, Section $section) {
+    if ($this->hasSection($delta)) {
+      // @todo Use https://www.drupal.org/node/66183 once resolved.
+      $start = array_slice($this->getSections(), 0, $delta);
+      $end = array_slice($this->getSections(), $delta);
+      $this->setSections(array_merge($start, [$section], $end));
+    }
+    else {
+      $this->appendSection($section);
+    }
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function removeSection($delta) {
+    $sections = $this->getSections();
+    unset($sections[$delta]);
+    $this->setSections($sections);
+    return $this;
+  }
+
+  /**
+   * Indicates if there is a section at the specified delta.
+   *
+   * @param int $delta
+   *   The delta of the section.
+   *
+   * @return bool
+   *   TRUE if there is a section for this delta, FALSE otherwise.
+   */
+  protected function hasSection($delta) {
+    return isset($this->getSections()[$delta]);
+  }
+
+}