Version 1
[yaffs-website] / web / core / modules / block_content / src / Controller / BlockContentController.php
diff --git a/web/core/modules/block_content/src/Controller/BlockContentController.php b/web/core/modules/block_content/src/Controller/BlockContentController.php
new file mode 100644 (file)
index 0000000..7c1f8aa
--- /dev/null
@@ -0,0 +1,129 @@
+<?php
+
+namespace Drupal\block_content\Controller;
+
+use Drupal\Core\Controller\ControllerBase;
+use Drupal\Core\Entity\EntityStorageInterface;
+use Drupal\block_content\BlockContentTypeInterface;
+use Drupal\Core\Extension\ThemeHandlerInterface;
+use Drupal\Core\Url;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\Request;
+
+class BlockContentController extends ControllerBase {
+
+  /**
+   * The custom block storage.
+   *
+   * @var \Drupal\Core\Entity\EntityStorageInterface
+   */
+  protected $blockContentStorage;
+
+  /**
+   * The custom block type storage.
+   *
+   * @var \Drupal\Core\Entity\EntityStorageInterface
+   */
+  protected $blockContentTypeStorage;
+
+  /**
+   * The theme handler.
+   *
+   * @var \Drupal\Core\Extension\ThemeHandlerInterface
+   */
+  protected $themeHandler;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    $entity_manager = $container->get('entity.manager');
+    return new static(
+      $entity_manager->getStorage('block_content'),
+      $entity_manager->getStorage('block_content_type'),
+      $container->get('theme_handler')
+    );
+  }
+
+  /**
+   * Constructs a BlockContent object.
+   *
+   * @param \Drupal\Core\Entity\EntityStorageInterface $block_content_storage
+   *   The custom block storage.
+   * @param \Drupal\Core\Entity\EntityStorageInterface $block_content_type_storage
+   *   The custom block type storage.
+   * @param \Drupal\Core\Extension\ThemeHandlerInterface $theme_handler
+   *   The theme handler.
+   */
+  public function __construct(EntityStorageInterface $block_content_storage, EntityStorageInterface $block_content_type_storage, ThemeHandlerInterface $theme_handler) {
+    $this->blockContentStorage = $block_content_storage;
+    $this->blockContentTypeStorage = $block_content_type_storage;
+    $this->themeHandler = $theme_handler;
+  }
+
+  /**
+   * Displays add custom block links for available types.
+   *
+   * @param \Symfony\Component\HttpFoundation\Request $request
+   *   The current request object.
+   *
+   * @return array
+   *   A render array for a list of the custom block types that can be added or
+   *   if there is only one custom block type defined for the site, the function
+   *   returns the custom block add page for that custom block type.
+   */
+  public function add(Request $request) {
+    $types = $this->blockContentTypeStorage->loadMultiple();
+    if ($types && count($types) == 1) {
+      $type = reset($types);
+      return $this->addForm($type, $request);
+    }
+    if (count($types) === 0) {
+      return [
+        '#markup' => $this->t('You have not created any block types yet. Go to the <a href=":url">block type creation page</a> to add a new block type.', [
+          ':url' => Url::fromRoute('block_content.type_add')->toString(),
+        ]),
+      ];
+    }
+
+    return ['#theme' => 'block_content_add_list', '#content' => $types];
+  }
+
+  /**
+   * Presents the custom block creation form.
+   *
+   * @param \Drupal\block_content\BlockContentTypeInterface $block_content_type
+   *   The custom block type to add.
+   * @param \Symfony\Component\HttpFoundation\Request $request
+   *   The current request object.
+   *
+   * @return array
+   *   A form array as expected by drupal_render().
+   */
+  public function addForm(BlockContentTypeInterface $block_content_type, Request $request) {
+    $block = $this->blockContentStorage->create([
+      'type' => $block_content_type->id()
+    ]);
+    if (($theme = $request->query->get('theme')) && in_array($theme, array_keys($this->themeHandler->listInfo()))) {
+      // We have navigated to this page from the block library and will keep track
+      // of the theme for redirecting the user to the configuration page for the
+      // newly created block in the given theme.
+      $block->setTheme($theme);
+    }
+    return $this->entityFormBuilder()->getForm($block);
+  }
+
+  /**
+   * Provides the page title for this controller.
+   *
+   * @param \Drupal\block_content\BlockContentTypeInterface $block_content_type
+   *   The custom block type being added.
+   *
+   * @return string
+   *   The page title.
+   */
+  public function getAddFormTitle(BlockContentTypeInterface $block_content_type) {
+    return $this->t('Add %type custom block', ['%type' => $block_content_type->label()]);
+  }
+
+}