Skip to content

Commit 3127e20

Browse files
committed
#867 - Make preview a per site configuration
1 parent c1a9054 commit 3127e20

File tree

11 files changed

+466
-90
lines changed

11 files changed

+466
-90
lines changed

modules/next/config/schema/next.schema.yml

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ next.next_site.*:
2323
revalidate_secret:
2424
type: string
2525
label: 'Revalidate secret'
26+
site_previewer:
27+
type: string
28+
label: 'Site previewer'
29+
site_previewer_configuration:
30+
type: next.site_previewer.configuration.[%parent.site_previewer]
2631

2732
next.next_entity_type_config.*:
2833
type: config_entity
@@ -77,11 +82,6 @@ next.settings:
7782
type: config_object
7883
label: 'Next settings'
7984
mapping:
80-
site_previewer:
81-
type: string
82-
label: 'Site previewer'
83-
site_previewer_configuration:
84-
type: next.site_previewer.configuration.[%parent.site_previewer]
8585
preview_url_generator:
8686
type: string
8787
label: 'Preview URL generator'
@@ -103,6 +103,10 @@ next.site_previewer.configuration.iframe:
103103
type: string
104104
label: 'Sync route skip pages'
105105

106+
next.site_previewer.configuration.redirect:
107+
type: mapping
108+
mapping: {}
109+
106110
next.preview_url_generator.configuration.simple_oauth:
107111
type: mapping
108112
mapping:

modules/next/next.install

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,3 +104,39 @@ function next_update_9106() {
104104
$config->set('debug', FALSE)
105105
->save();
106106
}
107+
108+
/**
109+
* Migrate global site previewer settings to site-level settings.
110+
*/
111+
function next_update_9107() {
112+
// First, install the new fields for site previewer configuration.
113+
$entity_definition_update = \Drupal::entityDefinitionUpdateManager();
114+
115+
$storage_definition = BaseFieldDefinition::create('string')
116+
->setLabel(t('Site previewer'));
117+
$entity_definition_update->installFieldStorageDefinition('site_previewer', 'next_site', 'next_site', $storage_definition);
118+
119+
$storage_definition = BaseFieldDefinition::create('map')
120+
->setLabel(t('Site previewer configuration'));
121+
$entity_definition_update->installFieldStorageDefinition('site_previewer_configuration', 'next_site', 'next_site', $storage_definition);
122+
123+
// Now migrate the global settings to site-level settings.
124+
$config = \Drupal::configFactory()->get('next.settings');
125+
$global_site_previewer = $config->get('site_previewer');
126+
$global_site_previewer_configuration = $config->get('site_previewer_configuration') ?: [];
127+
128+
// Only migrate if there are global settings configured.
129+
if ($global_site_previewer) {
130+
/** @var \Drupal\next\Entity\NextSiteInterface[] $sites */
131+
$sites = \Drupal::entityTypeManager()->getStorage('next_site')->loadMultiple();
132+
133+
foreach ($sites as $site) {
134+
// Only set if the site doesn't already have a previewer configured.
135+
if (!$site->getSitePreviewer()) {
136+
$site->setSitePreviewer($global_site_previewer);
137+
$site->setSitePreviewerConfiguration($global_site_previewer_configuration);
138+
$site->save();
139+
}
140+
}
141+
}
142+
}

modules/next/src/Entity/NextSite.php

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@
4949
* "preview_secret",
5050
* "revalidate_url",
5151
* "revalidate_secret",
52+
* "site_previewer",
53+
* "site_previewer_configuration",
5254
* },
5355
* links = {
5456
* "add-form" = "/admin/config/services/next/sites/add",
@@ -97,6 +99,20 @@ class NextSite extends ConfigEntityBase implements NextSiteInterface {
9799
*/
98100
protected $revalidate_secret;
99101

102+
/**
103+
* The site previewer plugin ID.
104+
*
105+
* @var string
106+
*/
107+
protected $site_previewer;
108+
109+
/**
110+
* The site previewer configuration.
111+
*
112+
* @var array
113+
*/
114+
protected $site_previewer_configuration;
115+
100116
/**
101117
* {@inheritdoc}
102118
*/
@@ -172,6 +188,36 @@ public function setRevalidateSecret(string $revalidate_secret): NextSiteInterfac
172188
return $this;
173189
}
174190

191+
/**
192+
* {@inheritdoc}
193+
*/
194+
public function getSitePreviewer(): ?string {
195+
return $this->site_previewer;
196+
}
197+
198+
/**
199+
* {@inheritdoc}
200+
*/
201+
public function setSitePreviewer(string $site_previewer): NextSiteInterface {
202+
$this->set('site_previewer', $site_previewer);
203+
return $this;
204+
}
205+
206+
/**
207+
* {@inheritdoc}
208+
*/
209+
public function getSitePreviewerConfiguration(): array {
210+
return $this->site_previewer_configuration ?: [];
211+
}
212+
213+
/**
214+
* {@inheritdoc}
215+
*/
216+
public function setSitePreviewerConfiguration(array $site_previewer_configuration): NextSiteInterface {
217+
$this->set('site_previewer_configuration', $site_previewer_configuration);
218+
return $this;
219+
}
220+
175221
/**
176222
* {@inheritdoc}
177223
*/

modules/next/src/Entity/NextSiteInterface.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,44 @@ public function getRevalidateSecret(): ?string;
128128
*/
129129
public function setRevalidateSecret(string $revalidate_secret): self;
130130

131+
/**
132+
* Returns the site_previewer for the next_site.
133+
*
134+
* @return string|null
135+
* The site_previewer for the next_site.
136+
*/
137+
public function getSitePreviewer(): ?string;
138+
139+
/**
140+
* Sets the site_previewer for the next_site.
141+
*
142+
* @param string $site_previewer
143+
* The site_previewer.
144+
*
145+
* @return \Drupal\next\Entity\NextSiteInterface
146+
* The next_site entity.
147+
*/
148+
public function setSitePreviewer(string $site_previewer): self;
149+
150+
/**
151+
* Returns the site_previewer_configuration for the next_site.
152+
*
153+
* @return array
154+
* The site_previewer_configuration for the next_site.
155+
*/
156+
public function getSitePreviewerConfiguration(): array;
157+
158+
/**
159+
* Sets the site_previewer_configuration for the next_site.
160+
*
161+
* @param array $site_previewer_configuration
162+
* The site_previewer_configuration.
163+
*
164+
* @return \Drupal\next\Entity\NextSiteInterface
165+
* The next_site entity.
166+
*/
167+
public function setSitePreviewerConfiguration(array $site_previewer_configuration): self;
168+
131169
/**
132170
* Returns the revalidate url for given path.
133171
*

modules/next/src/Form/NextSettingsForm.php

Lines changed: 0 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,14 @@
66
use Drupal\Core\Form\FormStateInterface;
77
use Drupal\Core\Form\SubformState;
88
use Drupal\next\Plugin\ConfigurablePreviewUrlGeneratorInterface;
9-
use Drupal\next\Plugin\ConfigurableSitePreviewerInterface;
109
use Drupal\next\Plugin\PreviewUrlGeneratorManagerInterface;
11-
use Drupal\next\Plugin\SitePreviewerManagerInterface;
1210
use Symfony\Component\DependencyInjection\ContainerInterface;
1311

1412
/**
1513
* Provides the settings form for Next.
1614
*/
1715
class NextSettingsForm extends ConfigFormBase {
1816

19-
/**
20-
* The site previewer manager.
21-
*
22-
* @var \Drupal\next\Plugin\SitePreviewerManagerInterface
23-
*/
24-
protected SitePreviewerManagerInterface $sitePreviewerManager;
25-
2617
/**
2718
* The preview url generator manager.
2819
*
@@ -36,7 +27,6 @@ class NextSettingsForm extends ConfigFormBase {
3627
public static function create(ContainerInterface $container) {
3728
$instance = parent::create($container);
3829

39-
$instance->sitePreviewerManager = $container->get('plugin.manager.next.site_previewer');
4030
$instance->previewUrlGeneratorManager = $container->get('plugin.manager.next.preview_url_generator');
4131

4232
return $instance;
@@ -105,46 +95,6 @@ public function buildForm(array $form, FormStateInterface $form_state) {
10595
}
10696
}
10797

108-
$form['site_previewer_container'] = [
109-
'#title' => $this->t('Site previewer'),
110-
'#type' => 'details',
111-
'#group' => 'settings',
112-
];
113-
114-
$form['site_previewer_container']['site_previewer'] = [
115-
'#title' => $this->t('Plugin'),
116-
'#description' => $this->t('Select a plugin to use for the site preview.'),
117-
'#type' => 'select',
118-
'#options' => array_column($this->sitePreviewerManager->getDefinitions(), 'label', 'id'),
119-
'#default_value' => $config->get('site_previewer'),
120-
'#required' => TRUE,
121-
'#limit_validation_errors' => [['site_previewer']],
122-
'#submit' => ['::submitSitePreviewer'],
123-
'#executes_submit_callback' => TRUE,
124-
'#ajax' => [
125-
'callback' => '::ajaxReplaceSitePreviewerSettingsForm',
126-
'wrapper' => 'site-previewer-settings',
127-
'method' => 'replace',
128-
],
129-
];
130-
131-
$form['site_previewer_container']['settings_container'] = [
132-
'#type' => 'container',
133-
'#prefix' => '<div id="site-previewer-settings">',
134-
'#suffix' => '</div>',
135-
];
136-
137-
if (($site_previewer_id = $form_state->getValue('site_previewer')) || ($site_previewer_id = $config->get('site_previewer'))) {
138-
$site_previewer = $this->sitePreviewerManager->createInstance($site_previewer_id, $config->get('site_previewer_configuration'));
139-
if ($site_previewer instanceof ConfigurableSitePreviewerInterface) {
140-
$form['site_previewer_configuration'] = [
141-
'#tree' => TRUE,
142-
];
143-
$subform_state = SubformState::createForSubform($form['site_previewer_configuration'], $form, $form_state);
144-
$form['site_previewer_container']['settings_container']['site_previewer_configuration'] = $site_previewer->buildConfigurationForm($form['site_previewer_configuration'], $subform_state);
145-
}
146-
}
147-
14898
$form['development'] = [
14999
'#title' => $this->t('Development'),
150100
'#type' => 'details',
@@ -161,20 +111,6 @@ public function buildForm(array $form, FormStateInterface $form_state) {
161111
return parent::buildForm($form, $form_state);
162112
}
163113

164-
/**
165-
* Handles submit call when site_previewer is selected.
166-
*/
167-
public function submitSitePreviewer(array $form, FormStateInterface $form_state) {
168-
$form_state->setRebuild();
169-
}
170-
171-
/**
172-
* Handles switching the site_previewer selector.
173-
*/
174-
public function ajaxReplaceSitePreviewerSettingsForm($form, FormStateInterface $form_state) {
175-
return $form['site_previewer_settings_container'];
176-
}
177-
178114
/**
179115
* Handles submit call when preview_url_generator is selected.
180116
*/
@@ -195,14 +131,6 @@ public function ajaxReplacePreviewUrlGeneratorSettingsForm($form, FormStateInter
195131
public function validateForm(array &$form, FormStateInterface $form_state) {
196132
parent::validateForm($form, $form_state);
197133

198-
if ($site_previewer_id = $form_state->getValue('site_previewer')) {
199-
$site_previewer = $this->sitePreviewerManager->createInstance($site_previewer_id);
200-
if ($site_previewer instanceof ConfigurableSitePreviewerInterface) {
201-
$subform_state = SubformState::createForSubform($form['site_previewer_configuration'], $form, $form_state);
202-
$site_previewer->validateConfigurationForm($form, $subform_state);
203-
}
204-
}
205-
206134
if ($preview_url_generator_id = $form_state->getValue('preview_url_generator')) {
207135
$preview_url_generator = $this->previewUrlGeneratorManager->createInstance($preview_url_generator_id);
208136
if ($preview_url_generator instanceof ConfigurablePreviewUrlGeneratorInterface && isset($form['preview_url_generator_container']['settings_container'])) {
@@ -218,14 +146,6 @@ public function validateForm(array &$form, FormStateInterface $form_state) {
218146
public function submitForm(array &$form, FormStateInterface $form_state) {
219147
parent::submitForm($form, $form_state);
220148

221-
if ($site_previewer_id = $form_state->getValue('site_previewer')) {
222-
$site_previewer = $this->sitePreviewerManager->createInstance($site_previewer_id);
223-
if ($site_previewer instanceof ConfigurableSitePreviewerInterface) {
224-
$subform_state = SubformState::createForSubform($form['site_previewer_configuration'], $form, $form_state);
225-
$site_previewer->submitConfigurationForm($form, $subform_state);
226-
}
227-
}
228-
229149
if ($preview_url_generator_id = $form_state->getValue('preview_url_generator')) {
230150
$preview_url_generator = $this->previewUrlGeneratorManager->createInstance($preview_url_generator_id);
231151
if ($preview_url_generator instanceof ConfigurablePreviewUrlGeneratorInterface) {
@@ -235,8 +155,6 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
235155
}
236156

237157
$this->config('next.settings')
238-
->set('site_previewer', $form_state->getValue('site_previewer'))
239-
->set('site_previewer_configuration', $form_state->getValue('site_previewer_configuration'))
240158
->set('preview_url_generator', $form_state->getValue('preview_url_generator'))
241159
->set('preview_url_generator_configuration', $form_state->getValue('preview_url_generator_configuration'))
242160
->set('debug', $form_state->getValue('debug'))

0 commit comments

Comments
 (0)