Commit 5636a9eb authored by Julian Pustkuchen's avatar Julian Pustkuchen
Browse files

Issue #3263064 by Grevil, Anybody: Code style cleanup, Schema check, Basic Tests

parent 69888b71
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
layout_disable.settings:
  type: config_object
  label: 'Layout-Disable Settings'
  mapping:
    disabled_layouts:
      type: sequence
      label: 'Disabled Layouts'
      sequence:
        type: string
        label: 'Disabled Layout'

layout_disable.install

0 → 100644
+16 −0
Original line number Diff line number Diff line
<?php

/**
 * @file
 * The layout_disable install file.
 */

/**
 * Update to the new schema definition.
 */
function layout_disable_update_8001() {
  $config_factory = \Drupal::configFactory();
  $config = $config_factory->getEditable('layout_disable.settings');
  $oldSettings = $config->get('layout_disable.settings.disabled_layouts');
  $config->set('disabled_layouts', $oldSettings)->save();
}
+8 −4
Original line number Diff line number Diff line
<?php

/**
 * @file
 * The layout disable module file.
 */

/**
 * Implements hook_layout_alter().
 */
function layout_disable_layout_alter(&$definitions) {
  $config = \Drupal::service('config.factory')
    ->getEditable('layout_disable.settings');
  $disabledLayouts = $config->get('layout_disable.settings.disabled_layouts');
  $config = \Drupal::config('layout_disable.settings');
  $disabledLayouts = $config->get('disabled_layouts');
  if (!empty($disabledLayouts)) {
    foreach ($disabledLayouts as $disabledLayout) {
      if (isset($definitions[$disabledLayout])) {
+45 −31
Original line number Diff line number Diff line
<?php

/**
 * @file
 * Contains \Drupal\layout_disable\Form\LayoutDisableForm.
 */

namespace Drupal\layout_disable\Form;

use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Component\Utility\Html;
use Drupal\Core\Cache\Cache;

use Drupal\Core\Layout\LayoutPluginManager;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Administration settings form.
 */
class LayoutDisableForm extends ConfigFormBase {

  /**
   * A date formatter object.
   *
   * @var \Drupal\Core\Layout\LayoutPluginManager
   */
  protected $layoutPluginManager;

  /**
   * Class constructor.
   */
  public function __construct(LayoutPluginManager $layoutPluginManager) {
    $this->layoutPluginManager = $layoutPluginManager;
  }

  /**
   * {@inheritdoc}
   */
  public function getFormID() {
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('plugin.manager.core.layout'),
    );
  }

  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'layout_disable';
  }

@@ -36,10 +54,9 @@ class LayoutDisableForm extends ConfigFormBase {
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $config = $this->config('layout_disable.settings');
    $settings = $config->get('layout_disable.settings');
    $settings = $this->config('layout_disable.settings');

    $layouts = \Drupal::service('plugin.manager.core.layout')
    $layouts = $this->layoutPluginManager
      ->getSortedDefinitions();

    $layout_names = [];
@@ -53,34 +70,29 @@ class LayoutDisableForm extends ConfigFormBase {
      }
    }

    // Already disabled layouts have already been removed here because the form is built after layout_disable_layout_alter.
    // See #2983016 (https://www.drupal.org/project/layout_disable/issues/2983016)
    // Already disabled layouts have already been removed here because the
    // form is built after layout_disable_layout_alter. See
    // #2983016 (https://www.drupal.org/project/layout_disable/issues/2983016)
    // So we have to make them available manually:
    if (!empty($settings['disabled_layouts'])) {
      \Drupal::messenger()
    $disabled_layouts = $settings->get('disabled_layouts');
    if (!empty($disabled_layouts)) {
      $this->messenger()
        ->addWarning('If already removed from code (disabled) layouts appear here, uncheck them to remove them finally. They are still listed due to a hook_layout_alter logical incompatibility.');
      // TODO - This may lead to listing already uninstalled layouts here. Find a way to only show existing layouts despite alteration.
      $layout_names = array_merge($settings['disabled_layouts'], $layout_names);
      // @todo This may lead to listing already uninstalled layouts here. Find a way to only show existing layouts despite alteration.
      $layout_names = array_merge($disabled_layouts, $layout_names);
    }

    $form['disabled_layouts'] = [
      '#type' => 'checkboxes',
      '#title' => $this->t('Disable layouts'),
      '#description' => $this->t('Select the layouts you wish to disable. "layout_onecol" is required by core and can not be disabled!'),
      '#default_value' => !empty($settings['disabled_layouts']) ? $settings['disabled_layouts'] : [],
      '#default_value' => !empty($disabled_layouts) ? $disabled_layouts : [],
      '#options' => $layout_names,
    ];

    return parent::buildForm($form, $form_state);
  }

  /**
   * {@inheritdoc}
   */
  public function validateForm(array &$form, FormStateInterface $form_state) {
    parent::validateForm($form, $form_state);
  }

  /**
   * {@inheritdoc}
   */
@@ -91,17 +103,19 @@ class LayoutDisableForm extends ConfigFormBase {
    if (!empty($form_values)) {
      foreach ($form_values['disabled_layouts'] as $disabledLayout => $layoutStatus) {
        if (!$layoutStatus) {
          // Only save disabled layouts (status =1) to keep the lsit as small as possible.
          // Only save disabled layouts (status =1) to keep the lsit as
          // small as possible.
          unset($form_values['disabled_layouts'][$disabledLayout]);
        }
      }
    }

    $config->set('layout_disable.settings', ['disabled_layouts' => $form_values['disabled_layouts']])
    $config->set('disabled_layouts', $form_values['disabled_layouts'])
      ->save();
    parent::submitForm($form, $form_state);

    // Clear layout caches:
    \Drupal::service('plugin.manager.core.layout')->clearCachedDefinitions();
    $this->layoutPluginManager->clearCachedDefinitions();
  }

}
+140 −0
Original line number Diff line number Diff line
<?php

namespace Drupal\Tests\layout_disable\Functional;

use Drupal\Tests\BrowserTestBase;

/**
 * This class provides methods specifically for testing something.
 *
 * @group layout_disable
 */
class LayoutDisableFunctionalTests extends BrowserTestBase {
  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'layout_disable',
    'test_page_test',
    'node',
    'layout_discovery',
    'layout_builder',
  ];

  /**
   * A user with authenticated permissions.
   *
   * @var \Drupal\Core\Session\AccountInterface
   */
  protected $user;

  /**
   * A user with admin permissions.
   *
   * @var \Drupal\Core\Session\AccountInterface
   */
  protected $adminUser;

  /**
   * {@inheritdoc}
   */
  protected $defaultTheme = 'stark';

  /**
   * {@inheritdoc}
   */
  protected function setUp(): void {
    parent::setUp();

    $this->config('system.site')->set('page.front', '/test-page')->save();
    $this->user = $this->drupalCreateUser([]);
    $this->adminUser = $this->drupalCreateUser([]);
    $this->adminUser->addRole($this->createAdminRole('admin', 'admin'));
    $this->adminUser->save();
    $this->drupalLogin($this->adminUser);
  }

  /**
   * Tests if the module installation, won't break the site.
   */
  public function testInstallation() {
    $session = $this->assertSession();
    $this->drupalGet('<front>');
    $session->statusCodeEquals(200);
  }

  /**
   * Tests "access layout_disable" permission.
   */
  public function testAccess() {
    $session = $this->assertSession();
    // Check access as admin:
    $this->drupalGet('/admin/config/user-interface/layout-disable');
    $session->statusCodeEquals(200);
    $this->drupalLogout();
    // Check access as user with correct permissions:
    $this->drupalLogin($this->drupalCreateUser(['access layout_disable']));
    $this->drupalGet('/admin/config/user-interface/layout-disable');
    $session->statusCodeEquals(200);
    $this->drupalLogout();
    // Check access as user without permissions:
    $this->drupalLogin($this->user);
    $this->drupalGet('/admin/config/user-interface/layout-disable');
    $session->statusCodeEquals(403);
    $this->drupalLogout();
    // Check access as anonymous:
    $this->drupalGet('/admin/config/user-interface/layout-disable');
    $session->statusCodeEquals(403);
  }

  /**
   * Tests disabling a layout.
   */
  public function testDisableEnableLayout() {
    $session = $this->assertSession();
    $page = $this->getSession()->getPage();

    // Create a Content and enable layout_onecol:
    $this->createContentType(['type' => 'article']);
    $this->drupalGet('/admin/structure/types/manage/article/display');
    $session->statusCodeEquals(200);
    $page->fillField('edit-layout-enabled', 1);
    $page->pressButton('edit-submit');
    $session->statusCodeEquals(200);
    // See if we can set the layout as display with layout_builder:
    $this->drupalGet('/layout_builder/choose/section/defaults/node.article.default/0');
    $session->statusCodeEquals(200);
    $session->pageTextContains('Two column');
    $this->drupalGet('/layout_builder/configure/section/defaults/node.article.default/0/layout_twocol_section');
    $session->statusCodeEquals(200);
    // Disable the layout on the layout_disable page:
    $this->drupalGet('/admin/config/user-interface/layout-disable');
    $session->statusCodeEquals(200);
    $page->fillField('edit-disabled-layouts-layout-twocol', TRUE);
    $page->fillField('edit-disabled-layouts-layout-twocol-section', TRUE);
    $page->pressButton('edit-submit');
    $session->statusCodeEquals(200);
    $session->pageTextContains('The configuration options have been saved.');
    // See if the layout is gone:
    $this->drupalGet('/layout_builder/choose/section/defaults/node.article.default/0');
    $session->statusCodeEquals(200);
    $session->pageTextNotContains('Two column');
    $this->drupalGet('/layout_builder/configure/section/defaults/node.article.default/0/layout_twocol_section');
    $session->statusCodeEquals(500);
    $session->pageTextContains('The website encountered an unexpected error. Please try again later.');
    // Reenable the layouts again, and see if they show up again:
    $this->drupalGet('/admin/config/user-interface/layout-disable');
    $session->statusCodeEquals(200);
    $page->fillField('edit-disabled-layouts-layout-twocol', FALSE);
    $page->fillField('edit-disabled-layouts-layout-twocol-section', FALSE);
    $page->pressButton('edit-submit');
    $session->statusCodeEquals(200);
    $session->pageTextContains('The configuration options have been saved.');
    $this->drupalGet('/layout_builder/choose/section/defaults/node.article.default/0');
    $session->statusCodeEquals(200);
    $session->pageTextContains('Two column');
    $this->drupalGet('/layout_builder/configure/section/defaults/node.article.default/0/layout_twocol_section');
    $session->statusCodeEquals(200);
  }

}