Skip to content
Snippets Groups Projects
Commit c6f6e442 authored by vbouchet's avatar vbouchet Committed by Chris Burge
Browse files

Issue #3349365 by vbouchet: Reduce code duplicate

parent 01d085cd
No related branches found
No related tags found
No related merge requests found
Pipeline #21090 passed with warnings
......@@ -14,66 +14,31 @@ function layout_builder_component_attributes_preprocess_block(&$variables) {
if (isset($variables['elements']['#component_attributes'])) {
$component_attributes = $variables['elements']['#component_attributes'];
// Process block attributes.
if ($config['allowed_block_attributes']['id'] && $component_attributes['block_attributes']['id']) {
$variables['attributes']['id'] = $component_attributes['block_attributes']['id'];
}
if ($config['allowed_block_attributes']['class'] && $component_attributes['block_attributes']['class']) {
$classes = explode(' ', $component_attributes['block_attributes']['class']);
$existing_classes = $variables['attributes']['class'] ?? [];
$variables['attributes']['class'] = array_merge($existing_classes, $classes);
}
if ($config['allowed_block_attributes']['style'] && $component_attributes['block_attributes']['style']) {
$variables['attributes']['style'] = $component_attributes['block_attributes']['style'];
}
if ($config['allowed_block_attributes']['data'] && $component_attributes['block_attributes']['data']) {
$data_attributes = preg_split('/\R/', $component_attributes['block_attributes']['data']);
foreach ($data_attributes as $data_attribute) {
$data_attribute = explode('|', $data_attribute);
// Values are optional for data-* attributes.
$variables['attributes'][$data_attribute[0]] = $data_attribute[1] ?? TRUE;
}
}
$attribute_names = [
'attributes',
'title_attributes',
'content_attributes',
];
// Process block title attributes.
if ($config['allowed_block_title_attributes']['id'] && $component_attributes['block_title_attributes']['id']) {
$variables['title_attributes']['id'] = $component_attributes['block_title_attributes']['id'];
foreach ($attribute_names as $attribute_name) {
if ($config['allowed_block_' . $attribute_name]['id'] && $component_attributes['block_' . $attribute_name]['id']) {
$variables[$attribute_name]['id'] = $component_attributes['block_' . $attribute_name]['id'];
}
if ($config['allowed_block_title_attributes']['class'] && $component_attributes['block_title_attributes']['class']) {
$classes = explode(' ', $component_attributes['block_title_attributes']['class']);
$existing_classes = $variables['title_attributes']['class'] ?? [];
$variables['title_attributes']['class'] = array_merge($existing_classes, $classes);
if ($config['allowed_block_' . $attribute_name]['class'] && $component_attributes['block_' . $attribute_name]['class']) {
$classes = explode(' ', $component_attributes['block_' . $attribute_name]['class']);
$existing_classes = $variables['attributes']['class'] ?? [];
$variables[$attribute_name]['class'] = array_merge($existing_classes, $classes);
}
if ($config['allowed_block_title_attributes']['style'] && $component_attributes['block_title_attributes']['style']) {
$variables['title_attributes']['style'] = $component_attributes['block_title_attributes']['style'];
if ($config['allowed_block_' . $attribute_name]['style'] && $component_attributes['block_' . $attribute_name]['style']) {
$variables[$attribute_name]['style'] = $component_attributes['block_' . $attribute_name]['style'];
}
if ($config['allowed_block_title_attributes']['data'] && $component_attributes['block_title_attributes']['data']) {
$data_attributes = preg_split('/\R/', $component_attributes['block_title_attributes']['data']);
if ($config['allowed_block_' . $attribute_name]['data'] && $component_attributes['block_' . $attribute_name]['data']) {
$data_attributes = preg_split('/\R/', $component_attributes['block_' . $attribute_name]['data']);
foreach ($data_attributes as $data_attribute) {
$data_attribute = explode('|', $data_attribute);
// Values are optional for data-* attributes.
$variables['title_attributes'][$data_attribute[0]] = $data_attribute[1] ?? TRUE;
}
}
// Process block content attributes.
if ($config['allowed_block_content_attributes']['id'] && $component_attributes['block_content_attributes']['id']) {
$variables['content_attributes']['id'] = $component_attributes['block_content_attributes']['id'];
}
if ($config['allowed_block_content_attributes']['class'] && $component_attributes['block_content_attributes']['class']) {
$classes = explode(' ', $component_attributes['block_content_attributes']['class']);
$existing_classes = $variables['content_attributes']['class'] ?? [];
$variables['content_attributes']['class'] = array_merge($existing_classes, $classes);
$variables[$attribute_name][$data_attribute[0]] = $data_attribute[1] ?? TRUE;
}
if ($config['allowed_block_content_attributes']['style'] && $component_attributes['block_content_attributes']['style']) {
$variables['content_attributes']['style'] = $component_attributes['block_content_attributes']['style'];
}
if ($config['allowed_block_content_attributes']['data'] && $component_attributes['block_content_attributes']['data']) {
$data_attributes = preg_split('/\R/', $component_attributes['block_content_attributes']['data']);
foreach ($data_attributes as $data_attribute) {
$data_attribute = explode('|', $data_attribute);
// Values are optional for data-* attributes.
$variables['content_attributes'][$data_attribute[0]] = $data_attribute[1] ?? TRUE;
}
}
}
......
......@@ -281,112 +281,47 @@ class ManageComponentAttributesForm extends FormBase {
public function validateForm(array &$form, FormStateInterface $form_state) {
$values = $form_state->getValues();
// Validate block attributes.
if (isset($values['block_attributes']['id']) && !$this->validateCssClass($values['block_attributes']['id'])) {
$form_state->setError($form['block_attributes']['id'], $this->t('Element ID must be a valid CSS ID'));
}
if (isset($values['block_attributes']['class'])) {
$classes = explode(' ', $values['block_attributes']['class']);
foreach ($classes as $class) {
if (!$this->validateCssClass($class)) {
$form_state->setError($form['block_attributes']['class'], $this->t('Classes must be valid CSS classes'));
break;
}
}
}
if (isset($values['block_attributes']['style'])) {
$cssLinter = new Linter();
$style_validity = $cssLinter->lintString('.selector {' . $values['block_attributes']['style'] . '}');
if (!$style_validity) {
$form_state->setError($form['block_attributes']['style'], $this->t('Inline styles must be valid CSS'));
}
}
if (isset($values['block_attributes']['data'])) {
$data_attributes = preg_split('/\R/', $values['block_attributes']['data']);
foreach ($data_attributes as $data_attribute) {
if (empty($data_attribute)) {
break;
}
$data_attribute = explode('|', $data_attribute);
if (substr($data_attribute[0], 0, 5) !== "data-") {
$form_state->setError($form['block_attributes']['data'], $this->t('Data attributes must being with "data-"'));
}
}
}
$elements = [
'block_attributes',
'block_title_attributes',
'block_content_attributes'
];
// Validate block title attributes.
if (isset($values['block_title_attributes']['id']) && !$this->validateCssClass($values['block_title_attributes']['id'])) {
$form_state->setError($form['block_title_attributes']['id'], $this->t('Element ID must be a valid CSS ID'));
foreach ($elements as $element) {
if (isset($values[$element]['id']) && !$this->validateCssClass($values[$element]['id'])) {
$form_state->setError($form[$element]['id'], $this->t('Element ID must be a valid CSS ID'));
}
if (isset($values['block_title_attributes']['class'])) {
$classes = explode(' ', $values['block_title_attributes']['class']);
if (isset($values[$element]['class'])) {
$classes = explode(' ', $values[$element]['class']);
foreach ($classes as $class) {
if (!$this->validateCssClass($class)) {
$form_state->setError($form['block_title_attributes']['class'], $this->t('Classes must be valid CSS classes'));
$form_state->setError($form[$element]['class'], $this->t('Classes must be valid CSS classes'));
break;
}
}
}
if (isset($values['block_title_attributes']['style'])) {
if (isset($values[$element]['style'])) {
$cssLinter = new Linter();
$style_validity = $cssLinter->lintString('.selector {' . $values['block_title_attributes']['style'] . '}');
$style_validity = $cssLinter->lintString('.selector {' . $values[$element]['style'] . '}');
if (!$style_validity) {
$form_state->setError($form['block_title_attributes']['style'], $this->t('Inline styles must be valid CSS'));
$form_state->setError($form[$element]['style'], $this->t('Inline styles must be valid CSS'));
}
}
if (isset($values['block_title_attributes']['data'])) {
$data_attributes = preg_split('/\R/', $values['block_title_attributes']['data']);
if (isset($values[$element]['data'])) {
$data_attributes = preg_split('/\R/', $values[$element]['data']);
foreach ($data_attributes as $data_attribute) {
if (empty($data_attribute)) {
break;
}
$data_attribute = explode('|', $data_attribute);
if (substr($data_attribute[0], 0, 5) !== "data-") {
$form_state->setError($form['block_title_attributes']['data'], $this->t('Data attributes must being with "data-"'));
$form_state->setError($form[$element]['data'], $this->t('Data attributes must begin with "data-"'));
}
}
}
// Validate block content attributes.
if (isset($values['block_content_attributes']['id']) && !$this->validateCssClass($values['block_content_attributes']['id'])) {
$form_state->setError($form['block_content_attributes']['id'], $this->t('Element ID must be a valid CSS ID'));
}
if (isset($values['block_content_attributes']['class'])) {
$classes = explode(' ', $values['block_content_attributes']['class']);
foreach ($classes as $class) {
if (!$this->validateCssClass($class)) {
$form_state->setError($form['block_content_attributes']['class'], $this->t('Classes must be valid CSS classes'));
break;
}
}
}
if (isset($values['block_content_attributes']['style'])) {
$cssLinter = new Linter();
$style_validity = $cssLinter->lintString('.selector {' . $values['block_content_attributes']['style'] . '}');
if (!$style_validity) {
$form_state->setError($form['block_content_attributes']['style'], $this->t('Inline styles must be valid CSS'));
}
}
if (isset($values['block_content_attributes']['data'])) {
$data_attributes = preg_split('/\R/', $values['block_content_attributes']['data']);
foreach ($data_attributes as $data_attribute) {
if (empty($data_attribute)) {
break;
}
$data_attribute = explode('|', $data_attribute);
if (substr($data_attribute[0], 0, 5) !== "data-") {
$form_state->setError($form['block_content_attributes']['data'], $this->t('Data attributes must being with "data-"'));
}
}
}
}
......@@ -415,27 +350,23 @@ class ManageComponentAttributesForm extends FormBase {
$values = $form_state->getValues();
$additional_settings = [
'block_attributes' => [
'id' => $values['block_attributes']['id'] ?? '',
'class' => $values['block_attributes']['class'] ?? '',
'style' => $values['block_attributes']['style'] ?? '',
'data' => $values['block_attributes']['data'] ?? '',
],
'block_title_attributes' => [
'id' => $values['block_title_attributes']['id'] ?? '',
'class' => $values['block_title_attributes']['class'] ?? '',
'style' => $values['block_title_attributes']['style'] ?? '',
'data' => $values['block_title_attributes']['data'] ?? '',
],
'block_content_attributes' => [
'id' => $values['block_content_attributes']['id'] ?? '',
'class' => $values['block_content_attributes']['class'] ?? '',
'style' => $values['block_content_attributes']['style'] ?? '',
'data' => $values['block_content_attributes']['data'] ?? '',
],
$additional_settings = [];
$elements = [
'block_attributes',
'block_title_attributes',
'block_content_attributes',
];
foreach ($elements as $element) {
$additional_settings[$element] = [
'id' => $values[$element]['id'] ?? '',
'class' => $values[$element]['class'] ?? '',
'style' => $values[$element]['style'] ?? '',
'data' => $values[$element]['data'] ?? '',
];
}
// Store configuration in layout_builder.component.additional.
// Switch to third-party settings when
// https://www.drupal.org/project/drupal/issues/3015152 is committed.
......
......@@ -147,7 +147,7 @@ class ComponentAttributeTest extends WebDriverTestBase {
$page->fillField('block_attributes[data]', 'data-block-test' . PHP_EOL . 'ata-block-test2|test-value');
$page->pressButton('Update');
$assert_session->assertWaitOnAjaxRequest();
$this->assertSettingsTrayValidationMessage('Data attributes must being with "data-"');
$this->assertSettingsTrayValidationMessage('Data attributes must begin with "data-"');
$page->fillField('block_attributes[data]', 'data-block-test' . PHP_EOL . 'data-block-test2|test-value');
$page->pressButton('Update');
......@@ -179,7 +179,7 @@ class ComponentAttributeTest extends WebDriverTestBase {
$page->fillField('block_title_attributes[data]', 'data-block-title-test' . PHP_EOL . 'ata-block-title-test2|test-value-title');
$page->pressButton('Update');
$assert_session->assertWaitOnAjaxRequest();
$this->assertSettingsTrayValidationMessage('Data attributes must being with "data-"');
$this->assertSettingsTrayValidationMessage('Data attributes must begin with "data-"');
$page->fillField('block_title_attributes[data]', 'data-block-title-test' . PHP_EOL . 'data-block-title-test2|test-value-title');
$page->pressButton('Update');
......@@ -211,7 +211,7 @@ class ComponentAttributeTest extends WebDriverTestBase {
$page->fillField('block_content_attributes[data]', 'data-block-content-test' . PHP_EOL . 'ata-block-content-test2|test-value-content');
$page->pressButton('Update');
$assert_session->assertWaitOnAjaxRequest();
$this->assertSettingsTrayValidationMessage('Data attributes must being with "data-"');
$this->assertSettingsTrayValidationMessage('Data attributes must begin with "data-"');
$page->fillField('block_content_attributes[data]', 'data-block-content-test' . PHP_EOL . 'data-block-content-test2|test-value-content');
$page->pressButton('Update');
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment