View source
<?php
namespace Drupal\ui_patterns\Element;
use Drupal\Core\Render\Element\RenderElement;
use Drupal\Core\Template\Attribute;
use Drupal\ui_patterns\UiPatterns;
class Pattern extends RenderElement {
public function getInfo() {
$class = get_class($this);
return [
'#input' => FALSE,
'#multiple_sources' => FALSE,
'#pre_render' => [
[
$class,
'processContext',
],
[
$class,
'processRenderArray',
],
[
$class,
'processLibraries',
],
[
$class,
'processMultipleSources',
],
[
$class,
'processFields',
],
[
$class,
'ensureVariant',
],
[
$class,
'processUse',
],
],
];
}
public static function processRenderArray(array $element) {
$element['#theme'] = UiPatterns::getPatternDefinition($element['#id'])
->getThemeHook();
if (isset($element['#attributes']) && !empty($element['#attributes']) && is_array($element['#attributes'])) {
$element['#attributes'] = new Attribute($element['#attributes']);
}
else {
$element['#attributes'] = new Attribute();
}
unset($element['#type']);
return $element;
}
public static function processLibraries(array $element) {
foreach (UiPatterns::getPatternDefinition($element['#id'])
->getLibrariesNames() as $library) {
$element['#attached']['library'][] = $library;
}
return $element;
}
public static function processFields(array $element) {
if (self::hasFields($element)) {
$fields = $element['#fields'];
unset($element['#fields']);
foreach ($fields as $name => $field) {
$key = '#' . $name;
$element[$key] = $field;
}
}
else {
$element['#markup'] = '';
}
return $element;
}
public static function ensureVariant(array $element) {
if (!isset($element['#variant']) || !is_string($element['#variant'])) {
$element['#variant'] = '';
}
return $element;
}
public static function processUse(array $element) {
$definition = UiPatterns::getPatternDefinition($element['#id']);
if ($definition
->hasUse()) {
$element['#use'] = $definition
->getUse();
}
return $element;
}
public static function processMultipleSources(array $element) {
if (self::hasFields($element) && self::hasMultipleSources($element)) {
foreach ($element['#fields'] as $name => $field) {
$element['#fields'][$name] = reset($field);
if (count($field) > 1) {
$context = $element['#context'];
$context
->setProperty('pattern', $element['#id']);
$context
->setProperty('field', $name);
$element['#fields'][$name] = [
'#sources' => $field,
'#context' => $context,
'#theme' => 'patterns_destination',
];
}
}
}
return $element;
}
public static function processContext(array $element) {
if (self::hasValidContext($element)) {
$context = $element['#context'];
$element['#context'] = new PatternContext($context['type'], $element['#context']);
}
else {
$element['#context'] = new PatternContext('empty');
}
return $element;
}
public static function hasFields(array $element) {
return isset($element['#fields']) && !empty($element['#fields']) && is_array($element['#fields']);
}
public static function hasMultipleSources(array $element) {
return isset($element['#multiple_sources']) && $element['#multiple_sources'] === TRUE;
}
public static function hasValidContext(array $element) {
return isset($element['#context']) && is_array($element['#context']) && !empty($element['#context']['type']);
}
}