ui_patterns-8.x-1.4/src/Form/PatternDisplayFormTrait.php
src/Form/PatternDisplayFormTrait.php
<?php
namespace Drupal\ui_patterns\Form;
use Drupal\Component\Utility\SortArray;
use Drupal\ui_patterns\Plugin\PatternSourceBase;
/**
* Helper trait dealing with pattern display forms.
*
* @property \Drupal\ui_patterns\UiPatternsManager $patternsManager
* @property \Drupal\ui_patterns\UiPatternsSourceManager $sourceManager
* @property \Drupal\Core\Extension\ModuleHandlerInterface $moduleHandler
* @method \Drupal\Core\StringTranslation\TranslatableMarkup t($string, array $args = [], array $options = [])
*
* @package Drupal\ui_patterns\Form
*/
trait PatternDisplayFormTrait {
/**
* Build pattern display form.
*
* @param array $form
* Form array.
* @param string $tag
* Source field tag.
* @param array $context
* Plugin context.
* @param array $configuration
* Default configuration coming form the host form.
*/
public function buildPatternDisplayForm(array &$form, $tag, array $context, array $configuration) {
$form['pattern'] = [
'#type' => 'select',
'#empty_value' => '_none',
'#title' => $this->t('Pattern'),
'#options' => $this->patternsManager->getPatternsOptions(),
'#default_value' => $configuration['pattern'] ?? NULL,
'#required' => TRUE,
'#attributes' => ['id' => 'patterns-select'],
];
$form['variants'] = ['#type' => 'container'];
/** @var \Drupal\ui_patterns\Definition\PatternDefinition $definition */
foreach ($this->patternsManager->getDefinitions() as $pattern_id => $definition) {
if ($definition->hasVariants()) {
$form['variants'][$pattern_id] = [
'#type' => 'select',
'#title' => $this->t('Variant'),
'#options' => $definition->getVariantsAsOptions(),
'#default_value' => $configuration['pattern_variant'] ?? NULL,
'#weight' => 0,
'#states' => [
'visible' => [
'select[id="patterns-select"]' => ['value' => $pattern_id],
],
],
];
}
$form['pattern_mapping'][$pattern_id] = [
'#type' => 'container',
'#weight' => 1,
'#states' => [
'visible' => [
'select[id="patterns-select"]' => ['value' => $pattern_id],
],
],
'settings' => $this->getMappingForm($pattern_id, $tag, $context, $configuration),
];
}
$this->moduleHandler->alter('ui_patterns_display_settings_form', $form, $configuration);
}
/**
* Get mapping form.
*
* @param string $pattern_id
* Pattern ID for which to print the mapping form for.
* @param string $tag
* Source field plugin tag.
* @param array $context
* Plugin context.
* @param array $configuration
* Default configuration coming form the host form.
*
* @return array
* Mapping form.
*/
public function getMappingForm($pattern_id, $tag, array $context, array $configuration) {
/** @var \Drupal\ui_patterns\Definition\PatternDefinition $pattern */
$pattern = $this->patternsManager->getDefinition($pattern_id);
$elements = [
'#type' => 'table',
'#header' => [
$this->t('Source'),
$this->t('Plugin'),
$this->t('Destination'),
$this->t('Weight'),
],
];
$elements['#tabledrag'][] = [
'action' => 'order',
'relationship' => 'sibling',
'group' => 'field-weight',
];
$destinations = ['_hidden' => $this->t('- Hidden -')] + $pattern->getFieldsAsOptions();
$fields = [];
foreach ($this->sourceManager->getFieldsByTag($tag, $context) as $field_name => $field) {
$weight = (int) $this->getDefaultValue($configuration, $field_name, 'weight');
$fields[$field_name] = [
'info' => [
'#plain_text' => $field->getFieldLabel(),
],
'plugin' => [
'#plain_text' => $field->getPluginLabel(),
],
'destination' => [
'#type' => 'select',
'#title' => $this->t('Destination for @field', ['@field' => $field->getFieldLabel()]),
'#title_display' => 'invisible',
'#default_value' => $this->getDefaultValue($configuration, $field_name, 'destination'),
'#options' => $destinations,
],
'weight' => [
'#type' => 'weight',
'#default_value' => $weight,
'#delta' => (int) 20,
'#title' => $this->t('Weight for @field field', ['@field' => $field->getFieldLabel()]),
'#title_display' => 'invisible',
'#attributes' => [
'class' => ['field-weight'],
],
],
'#attributes' => [
'class' => ['draggable'],
],
'#weight' => $weight,
];
}
uasort($fields, [SortArray::class, 'sortByWeightProperty']);
return array_merge($elements, $fields);
}
/**
* Normalize settings coming from a form submission.
*
* @param array $settings
* Pattern display form values array.
*/
public static function processFormStateValues(array &$settings) {
if (isset($settings['variants']) && isset($settings['variants'][$settings['pattern']])) {
$settings['pattern_variant'] = $settings['variants'][$settings['pattern']];
unset($settings['variants']);
}
// Normalize only when necessary.
if (isset($settings['pattern_mapping'][$settings['pattern']]['settings'])) {
$settings['pattern_mapping'] = $settings['pattern_mapping'][$settings['pattern']]['settings'];
// Process fields and filter out the hidden ones.
foreach ($settings['pattern_mapping'] as $key => $setting) {
if ($setting['destination'] == '_hidden') {
unset($settings['pattern_mapping'][$key]);
}
else {
[$plugin, $source] = explode(PatternSourceBase::DERIVATIVE_SEPARATOR, $key, (int) 2);
$settings['pattern_mapping'][$key]['plugin'] = $plugin;
$settings['pattern_mapping'][$key]['source'] = $source;
}
}
// Normalize weights.
$weight = 0;
uasort($settings['pattern_mapping'], [
SortArray::class,
'sortByWeightElement',
]);
foreach ($settings['pattern_mapping'] as $key => $setting) {
$settings['pattern_mapping'][$key]['weight'] = $weight++;
}
}
}
/**
* Helper function: return mapping destination given plugin id and field name.
*
* @param string $plugin
* Current plugin ID.
* @param string $source
* Source field name.
* @param array $settings
* Setting array.
*
* @return string|null
* Destination field or NULL if none found.
*/
public function getMappingDestination($plugin, $source, array $settings) {
$mapping_id = $plugin . PatternSourceBase::DERIVATIVE_SEPARATOR . $source;
if (isset($settings['pattern_mapping'][$mapping_id])) {
return $settings['pattern_mapping'][$mapping_id]['destination'];
}
return NULL;
}
/**
* Helper function: check if given source field has mapping destination.
*
* @param string $plugin
* Current plugin ID.
* @param string $source
* Source field name.
* @param array $settings
* Setting array.
*
* @return bool
* TRUE if source has destination field, FALSE otherwise.
*/
public function hasMappingDestination($plugin, $source, array $settings) {
return $this->getMappingDestination($plugin, $source, $settings) !== NULL;
}
/**
* Helper function: get default value.
*
* @param array $configuration
* Configuration.
* @param string $field_name
* Field name.
* @param string $value
* Value name.
*
* @return string
* Field property value.
*/
protected function getDefaultValue(array $configuration, $field_name, $value) {
if (isset($configuration['pattern_mapping'][$field_name][$value])) {
return $configuration['pattern_mapping'][$field_name][$value];
}
return NULL;
}
}
