View source
<?php
namespace Drupal\gridstack\Entity;
use Drupal\Component\Utility\Html;
use Drupal\Component\Utility\NestedArray;
use Drupal\Component\Serialization\Json;
use Drupal\Core\Config\Entity\ConfigEntityBase;
class GridStack extends ConfigEntityBase implements GridStackInterface {
private static $activeBreakpoints = [
'xs',
'sm',
'md',
'lg',
'xl',
];
private static $gridstackId;
protected $name;
protected $label;
protected $weight = 0;
protected $json = '';
protected $options = [];
public static function getConstantBreakpoints() {
return self::$activeBreakpoints;
}
public function id() {
return $this->name;
}
public function getOptions($group = NULL, $property = NULL) {
$default = self::load('default');
$options = $this->options ? array_merge($default->options, $this->options) : $default->options;
if ($group) {
if (is_array($group)) {
return NestedArray::getValue($options, $group);
}
elseif (isset($property) && isset($options[$group])) {
return isset($options[$group][$property]) ? $options[$group][$property] : NULL;
}
return isset($options[$group]) ? $options[$group] : $options;
}
return $options;
}
public function getOption($group) {
return isset($this->options[$group]) ? $this->options[$group] : NULL;
}
public function setOption($group, $value) {
$value = $group == 'settings' ? array_merge($this->options[$group], $value) : $value;
$this->options[$group] = $value;
return $this;
}
public function getSettings($merged = TRUE) {
$default = self::load('default');
$options = $merged ? array_merge($default->options, $this->options) : $this->options;
return isset($options['settings']) ? $options['settings'] : [];
}
public function setSettings(array $values, $merged = TRUE) {
$settings = isset($this->options['settings']) ? $this->options['settings'] : [];
$this->options['settings'] = $merged ? array_merge($settings, $values) : $values;
return $this;
}
public function getSetting($name) {
return NULL !== $this
->getOptions('settings', $name) ? $this
->getOptions('settings', $name) : NULL;
}
public function setSetting($name, $value) {
$this->options['settings'][$name] = $value;
return $this;
}
public function getJson($group = '') {
$default = self::load('default');
$defaults = isset($default->json[$group]) ? $default->json[$group] : '';
return $group && isset($this->json[$group]) ? $this->json[$group] : $defaults;
}
public function getEndBreakpointGrids($current = 'grids') {
$build = [];
foreach ($this
->getBreakpoints() as $key => $breakpoint) {
if (empty($breakpoint['grids'])) {
continue;
}
$build[$key] = $breakpoint;
}
$keys = array_keys($build);
$end = end($keys);
return $this
->getBreakpointGrids($end, $current);
}
public function getNestedGridsByDelta($delta = 0) {
$grids = $this
->getEndBreakpointGrids('nested');
$nested = isset($grids[$delta]) ? $grids[$delta] : [];
$check = array_filter($nested);
return empty($check) ? [] : $nested;
}
public function getBreakpoints($breakpoint = NULL) {
$breakpoints = $this
->getOption('breakpoints') ?: [];
if ($breakpoint && isset($breakpoints[$breakpoint])) {
return $breakpoints[$breakpoint];
}
return $breakpoints;
}
public function getBreakpointGrids($breakpoint = 'lg', $current = 'grids') {
$grids = !empty($this
->getBreakpoints($breakpoint)) && isset($this
->getBreakpoints($breakpoint)[$current]) ? $this
->getBreakpoints($breakpoint)[$current] : '';
$grids = Json::decode($grids);
if ($grids) {
return $current == 'grids' ? array_filter($grids) : $grids;
}
return [];
}
public function getBreakpointGrid($breakpoint = 'lg', $index = -1, $property = '', $current = 'grids') {
$grids = $this
->getBreakpointGrids($breakpoint, $current);
return isset($grids[$index]) && isset($grids[$index][$property]) ? $grids[$index][$property] : NULL;
}
public function gridsJsonToArray(array &$settings = []) {
$settings['breakpoints'] = array_filter($this
->getBreakpoints());
if (!empty($settings['breakpoints'])) {
foreach ($settings['breakpoints'] as $key => $breakpoint) {
if (!empty($breakpoint['grids']) && is_string($breakpoint['grids'])) {
$settings['breakpoints'][$key]['grids'] = Json::decode($breakpoint['grids']);
}
if (!empty($breakpoint['nested']) && is_string($breakpoint['nested'])) {
$settings['breakpoints'][$key]['nested'] = Json::decode($breakpoint['nested']);
}
}
}
}
public static function optimizeGridWidths(array $settings = [], $current = 'grids', $optimize = FALSE) {
$breakpoints = isset($settings['breakpoints']) ? $settings['breakpoints'] : [];
$delta = isset($settings['delta']) ? $settings['delta'] : 0;
$nested_delta = isset($settings['nested_delta']) ? $settings['nested_delta'] : NULL;
$unique = [];
foreach (self::getConstantBreakpoints() as $id) {
$item = isset($breakpoints[$id]) && isset($breakpoints[$id][$current][$delta]) ? $breakpoints[$id][$current][$delta] : '';
if (empty($item)) {
continue;
}
if ($current == 'grids') {
if (!empty($item['width'])) {
$unique[$id] = (int) $item['width'];
}
}
elseif ($current == 'nested') {
if (isset($item[$nested_delta]) && !empty($item[$nested_delta]['width'])) {
$unique[$id] = (int) $item[$nested_delta]['width'];
}
}
}
return $optimize ? array_unique($unique) : $unique;
}
public function getJsonSummaryBreakpoints($breakpoint = 'lg', $exclude_image_style = FALSE, $no_keys = TRUE) {
$grids = $this
->getBreakpointGrids($breakpoint);
if ($grids && $no_keys) {
$values = [];
foreach ($grids as &$grid) {
if (empty($grid)) {
continue;
}
if ($exclude_image_style && isset($grid['image_style'])) {
array_pop($grid);
}
$values[] = array_values($grid);
}
$grids = $values;
}
return $grids ? Json::encode($grids) : '';
}
public function getIconUri() {
$id = $this
->id();
$uri = file_build_uri('gridstack/' . $id . '.png');
if (is_file($uri)) {
return $uri;
}
$uri = $this
->getOption('icon');
$dependencies = $this
->getDependencies();
$module = isset($dependencies['module'][0]) && !empty($dependencies['module'][0]) ? $dependencies['module'][0] : '';
if (empty($uri) || !is_file($uri)) {
$uri = '';
$handler = \Drupal::service('gridstack.manager')
->getModuleHandler();
if ($module && $handler
->moduleExists($module)) {
$icon_path = drupal_get_path('module', $module) . '/images/' . $id . '.png';
if (is_file(DRUPAL_ROOT . '/' . $icon_path)) {
$uri = $icon_path;
}
}
}
return $uri;
}
public function getIconUrl($absolute = FALSE) {
$url = '';
if ($uri = $this
->getIconUri()) {
$url = file_url_transform_relative(file_create_url($uri));
if (!$absolute) {
$url = ltrim($url, '/');
}
}
return $url;
}
public static function parseAttributes($string = '') {
$attributes = [];
$layout_attributes = explode(',', $string);
foreach ($layout_attributes as $attribute) {
$replaced_attribute = $attribute;
if (strpos($attribute, '|') !== FALSE) {
list($key, $value) = array_pad(array_map('trim', explode('|', $replaced_attribute, 2)), 2, NULL);
$attributes[$key] = strip_tags($value);
}
}
return $attributes;
}
public function getGrids($grid_only = TRUE, $group = 'node') {
return [];
}
public static function getHtmlId($string = 'gridstack', $id = '') {
if (!isset(static::$gridstackId)) {
static::$gridstackId = 0;
}
return empty($id) ? Html::getId($string . '-' . ++static::$gridstackId) : str_replace('_', '-', strip_tags($id));
}
public static function htmlSettings() {
return [
'_admin' => FALSE,
'background' => TRUE,
'id' => '',
'lightbox' => '',
'media_switch' => '',
'nested' => FALSE,
'optionset' => 'default',
'root' => TRUE,
'use_framework' => FALSE,
'skin' => '',
];
}
}