View source
<?php
namespace Drupal\gridstack;
use Drupal\Component\Utility\NestedArray;
use Drupal\Core\Cache\Cache;
class GridStackStylizer extends GridStackPluginManagerBase implements GridStackStylizerInterface {
protected static $path = 'Plugin/gridstack/stylizer';
protected static $interface = 'Drupal\\gridstack\\GridStackStylizerPluginInterface';
protected static $annotation = 'Drupal\\gridstack\\Annotation\\GridStackStylizer';
protected static $key = 'gridstack_stylizer';
protected $regions = [];
protected $loadStyle;
protected $style;
protected $builder;
protected $form;
public function style(array $configuration = [], $reload = FALSE) {
if (!isset($this->style) || $reload) {
$this->style = $this
->loadStyle('style', $configuration, $reload);
}
return $this->style;
}
private function setStyle(array $configuration = [], $reload = FALSE) {
$this->style = $this
->loadStyle('style', $configuration, $reload);
return $this;
}
public function getStyle($key, array $settings) {
return $this
->style()
->getStyle($key, $settings);
}
public function getConfiguredStyle($key, array $settings) {
return $this
->style()
->getStyle($key, $settings);
}
public function builder(array $configuration = [], $reload = FALSE) {
if (!isset($this->builder) || $reload) {
$this->builder = $this
->loadStyle('builder', $configuration, $reload);
}
return $this->builder;
}
private function setBuilder(array $configuration = [], $reload = FALSE) {
$this->builder = $this
->loadStyle('builder', $configuration, $reload);
return $this;
}
public function form(array $configuration = [], $reload = FALSE) {
if (!isset($this->form) || $reload) {
$this->form = $this
->loadStyle('form', $configuration, $reload);
}
return $this->form;
}
public function setForm(array $configuration = [], $reload = FALSE) {
$this->form = $this
->loadStyle('form', $configuration, $reload);
return $this;
}
private function loadStyle($id = 'style', array $configuration = [], $reload = FALSE) {
if (!isset($this->loadStyle[$id]) || $reload) {
$this->loadStyle[$id] = $this
->load($id, $configuration);
}
return $this->loadStyle[$id];
}
public function attach(array &$load, array $attach = []) {
if (!empty($attach['_stylizer'])) {
$load['library'][] = 'gridstack/stylizer';
$this
->setAttachments($load, $attach);
}
}
public function prepare(array &$element, array &$attributes, array &$settings, $optionset) {
$this
->setStyle($settings);
if ($media = $this
->style()
->buildMedia($attributes, $settings)) {
$element['#preface']['media'] = $media;
}
if (!empty($settings['_ipe'])) {
$this
->setBuilder($settings);
$this->regions = $this
->builder()
->regions($element);
if ($links = $this
->builder()
->getVariantEditor($settings, $optionset)) {
$pos = $this
->config('editor_pos') == 'bottom' ? '#bottom' : '#aside';
$element[$pos]['layout_editor'] = $links;
}
}
}
public function modifyItem($delta, array &$settings, array &$content, array &$attributes, array &$content_attributes) {
$rid = isset($settings['rid']) ? $settings['rid'] : -1;
if (empty($settings['_ipe']) && !empty($settings['contentless'])) {
$content['box'] = [];
}
if (!empty($settings['_ipe']) && isset($this->regions[$rid])) {
$this
->builder()
->adminAttributes($content['box'], $content_attributes, $settings, $this->regions);
}
if ($media = $this
->style()
->buildMedia($content_attributes, $settings)) {
$content['box']['preface'] = $media;
$content['box']['preface']['#weight'] = -100;
}
}
public function rootStyles(array &$element, array $styles, array $settings) {
if ($rules = $this
->style()
->parseStyles($styles, TRUE)) {
$css = implode('', reset($rules));
$element['#attached']['html_head'][] = [
[
'#tag' => 'style',
'#value' => $css,
'#weight' => 1,
],
'gridstack-style-' . key($rules),
];
if (!empty($settings['_ipe'])) {
$element['#attributes'] = isset($element['#attributes']) ? $element['#attributes'] : [];
$this
->builder()
->rootAttributes($element['#attributes'], $styles);
}
}
}
public function styles(array &$attributes, array $settings) {
$styles = $this
->style()
->getStyles($settings);
if ($styles && ($data = $this
->style()
->getSelector($settings, '', $styles))) {
if (!empty($settings['_ipe'])) {
$this
->builder()
->inlineAttributes($attributes, $data);
}
return $data;
}
return [];
}
public function attributes(array &$attributes, array $settings) {
$this
->style()
->attributes($attributes, $settings);
}
public function getInternalClasses() {
return $this
->style()
->getInternalClasses();
}
public function getMergedClasses($flatten = FALSE, array $framework_classes = []) {
$cid = $flatten ? 'gridstack_classes_flattened' : 'gridstack_classes_grouped';
if ($cache = $this->cacheBackend
->get($cid)) {
return $cache->data;
}
$output = [];
if ($classes = $this
->mergeFrameworkAndInternalClasses($framework_classes)) {
$grouped = $ungrouped = [];
foreach ($classes as $group => $data) {
$grouped[$group] = $data;
$items = [];
foreach ($data as $datum) {
$items[] = $datum;
}
$ungrouped = NestedArray::mergeDeep($ungrouped, $items);
}
$output = $flatten ? $ungrouped : $grouped;
$this->moduleHandler
->alter('gridstack_classes_preset', $output, $grouped, $ungrouped, $flatten);
ksort($output);
$count = count($output);
$tags = Cache::buildTags($cid, [
'count:' . $count,
]);
$this->cacheBackend
->set($cid, $output, Cache::PERMANENT, $tags);
}
return $output;
}
private function mergeFrameworkAndInternalClasses(array $classes = []) {
$classes = $classes ? NestedArray::mergeDeep($this
->getInternalClasses(), $classes) : $this
->getInternalClasses();
if ($fw_classes = $this
->config('fw_classes')) {
$fw_classes = array_map('trim', explode("\n", $fw_classes));
foreach ($fw_classes as $fw_class) {
if (strpos($fw_class, '|') !== FALSE) {
list($group, $group_class) = array_pad(array_map('trim', explode("|", $fw_class, 2)), 2, NULL);
$group_classes = array_map('trim', explode(" ", $group_class));
$new_group = [];
foreach ($group_classes as $group_class) {
$new_group[] = $group_class;
}
$new_group = isset($classes[$group]) ? NestedArray::mergeDeep($classes[$group], $new_group) : $new_group;
$classes[$group] = array_unique($new_group);
}
}
}
return $classes;
}
}