drowl_paragraphs-8.x-3.9/modules/drowl_paragraphs_types/drowl_paragraphs_types.module
modules/drowl_paragraphs_types/drowl_paragraphs_types.module
<?php
/**
* @file
* DROWL paragraphs types.
*/
use Drupal\Component\Serialization\Json;
/**
* Implements HOOK_theme_suggestions_HOOK_alter
*/
function drowl_paragraphs_types_theme_suggestions_paragraph_alter(&$suggestions, $variables) {
$entity = $variables['elements']['#paragraph'];
$sanitized_view_mode = strtr($variables['elements']['#view_mode'], '.', '_');
$type = $entity->getType();
$drowl_paragraphs_suggestions = [];
$drowl_paragraphs_suggestions[] = 'paragraph__drowl_paragraphs_types';
$drowl_paragraphs_suggestions[] = 'paragraph__drowl_paragraphs_types__' . $type;
$drowl_paragraphs_suggestions[] = 'paragraph__drowl_paragraphs_types__' . $type . '__' . $sanitized_view_mode;
// Our override should be more general than the theme suggestion:
$suggestions = array_merge($drowl_paragraphs_suggestions, $suggestions);
}
/**
* Implements HOOK_preprocess_paragraph().
*/
function drowl_paragraphs_types_preprocess_paragraph(&$variables) {
// Add frontend library for paragraphs display:
$variables['#attached']['library'][] = 'drowl_paragraphs/drowl-paragraphs-types';
}
/**
* Implements hook_preprocess_paragraph__container_Slides().
*/
function drowl_paragraphs_types_preprocess_paragraph__container_slides(&$variables) {
if (!empty($variables['paragraph'])) {
$paragraph = $variables['paragraph'];
$options_override = array();
$settings_responsive_override = array();
// Get global drowl_paragraphs settings.
$drowl_paragraphs_config = \Drupal::config('drowl_paragraphs.settings');
$drowl_paragraphs_config_defaults = $drowl_paragraphs_config->get('defaults');
if ($paragraph->hasField('field_paragraphs_slide_amount_sm')) {
$slide_amount_sm = $paragraph->get('field_paragraphs_slide_amount_sm')->value;
if (!empty($slide_amount_sm) && $slide_amount_sm != 'default') {
$settings_responsive_override['slide_amount_sm'] = $slide_amount_sm;
} else {
// Use global drowl_paragraphs default settings.
$settings_responsive_override['slide_amount_sm'] = $drowl_paragraphs_config_defaults['container_slides']['default_slide_amount_sm'];
}
}
if ($paragraph->hasField('field_paragraphs_slide_amount_md')) {
$slide_amount_md = $paragraph->get('field_paragraphs_slide_amount_md')->value;
if (!empty($slide_amount_md) && $slide_amount_md != 'default') {
$settings_responsive_override['slide_amount_md'] = $slide_amount_md;
} else {
// Use global drowl_paragraphs default settings.
$settings_responsive_override['slide_amount_md'] = $drowl_paragraphs_config_defaults['container_slides']['default_slide_amount_md'];
}
}
if ($paragraph->hasField('field_paragraphs_slide_amount_lg')) {
$slide_amount_lg = $paragraph->get('field_paragraphs_slide_amount_lg')->value;
if (!empty($slide_amount_lg) && $slide_amount_lg != 'default') {
$settings_responsive_override['slide_amount_lg'] = $slide_amount_lg;
} else {
// Use global drowl_paragraphs default settings.
$settings_responsive_override['slide_amount_lg'] = $drowl_paragraphs_config_defaults['container_slides']['default_slide_amount_lg'];
}
}
if ($paragraph->hasField('field_paragraphs_slide_adaptiveh')) {
$adaptiveHeight = $paragraph->get('field_paragraphs_slide_adaptiveh')->value;
if ($adaptiveHeight !== NULL && $adaptiveHeight != 'default') {
$options_override['adaptiveHeight'] = (bool) $adaptiveHeight;
}
// Else uses defaults set in paragraphs_slide_container slick configuration.
}
if ($paragraph->hasField('field_paragraphs_slide_autoplay')) {
$autoplay = $paragraph->get('field_paragraphs_slide_autoplay')->value;
if ($autoplay !== NULL && $autoplay != 'default') {
$options_override['autoplay'] = (bool) $autoplay;
}
// Else uses defaults set in paragraphs_slide_container slick configuration.
}
if ($paragraph->hasField('field_paragraphs_slide_arrows')) {
$arrows = $paragraph->get('field_paragraphs_slide_arrows')->value;
if ($arrows !== NULL && $arrows != 'default') {
$options_override['arrows'] = (bool) $arrows;
}
// Else uses defaults set in paragraphs_slide_container slick configuration.
}
if ($paragraph->hasField('field_paragraphs_slide_dots')) {
$dots = $paragraph->get('field_paragraphs_slide_dots')->value;
if ($dots !== NULL && $dots != 'default') {
$options_override['dots'] = (bool) $dots;
}
// Else uses defaults set in paragraphs_slide_container slick configuration.
}
if ($paragraph->hasField('field_paragraphs_slide_infinite')) {
$infinite = $paragraph->get('field_paragraphs_slide_infinite')->value;
if ($infinite !== NULL && $infinite != 'default') {
$options_override['infinite'] = (bool) $infinite;
}
// Else uses defaults set in paragraphs_slide_container slick configuration.
}
// Set the values in the field to make them available to later hook "drowl_paragraphs_types_preprocess_slick" where it can be set.
if (!empty($variables['elements']['field_paragraphs_paragraphs']['#build']['#optionset'])) {
$optionset = $variables['elements']['field_paragraphs_paragraphs']['#build']['#optionset'];
} elseif (!empty($variables['elements']['field_paragraphs_paragraphs']['#build']['optionset'])) {
// Support for older versions of the blazy/slick modules
$optionset = $variables['elements']['field_paragraphs_paragraphs']['#build']['optionset'];
}
if (!empty($optionset)) {
$optionset->set('drowl_paragraphs_options_override', $options_override);
$optionset->set('drowl_paragraphs_settings_responsive_override', $settings_responsive_override);
}
// Controls outside:
if ($paragraph->hasField('field_paragraphs_controlsoutside')) {
$controlsoutside = $paragraph->get('field_paragraphs_controlsoutside')->value;
if (!empty($controlsoutside)) {
// Add class for controls outside:
$variables['attributes']->addClass('paragraph--type--container-slides--controlsoutside');
}
}
}
}
/**
* Implements hook_preprocess_HOOK.
*
* IMPORTANT: This curiously runs AFTER template_preprocess_slick in the slick module. So we can't prepare values.
*
* @throws \Exception
*/
function drowl_paragraphs_types_preprocess_slick(&$variables) {
if ($variables['settings']['optionset'] == 'paragraphs_slide_container') {
// Only for paragraphs_slide_container slideshows:
$data_slick = $variables['content_attributes']->offsetGet('data-slick');
$options_override = $variables['element']['#optionset']->get('drowl_paragraphs_options_override');
$settings_responsive_override = $variables['element']['#optionset']->get('drowl_paragraphs_settings_responsive_override');
// Get the overrides:
if (!empty($data_slick) && (!empty($options_override) || !empty($settings_responsive_override))) {
// This has overrides.
// Get the configuration from the JSON array:
$data_slick = Json::decode($data_slick->value());
if(!empty($data_slick['responsive'])){
throw new Exception('Slick optionset "paragraphs_slide_container" may not have responsive (breakpoint) configuration. It will be set by drowl_paragraphs instead.');
}
if (!empty($options_override)) {
// Set the general option overrides.
$data_slick = array_merge($data_slick, $options_override);
}
if (!empty($settings_responsive_override)) {
$drowl_paragraphs_config = \Drupal::config('drowl_paragraphs.settings'); // at the top of the method
$drowl_paragraphs_breakpoint_mapping_sizes = $drowl_paragraphs_config->get('breakpoint_mapping_sizes');
$drowl_paragraphs_config_defaults = $drowl_paragraphs_config->get('defaults');
$drowl_paragraphs_breakpoint_mapping_sizes_fallbacks = [
'sm' => [
'min-width' => [
'size' => 0, // Fixed, this is always zero.
]
],
'md' => [
'min-width' => [
'size' => !empty($drowl_paragraphs_config_defaults['breakpoint_mapping_sizes_fallback']['md']) ? $drowl_paragraphs_config_defaults['breakpoint_mapping_sizes_fallback']['md'] : 640,
]
],
'lg' => [
'min-width' => [
'size' => !empty($drowl_paragraphs_config_defaults['breakpoint_mapping_sizes_fallback']['lg']) ? $drowl_paragraphs_config_defaults['breakpoint_mapping_sizes_fallback']['lg'] : 1024,
]
],
];
$drowl_paragraphs_breakpoint_mapping_sizes = array_merge($drowl_paragraphs_breakpoint_mapping_sizes_fallbacks, $drowl_paragraphs_breakpoint_mapping_sizes);
if (!empty($drowl_paragraphs_breakpoint_mapping_sizes)) {
if (!empty($settings_responsive_override['slide_amount_sm'])) {
if ($settings_responsive_override['slide_amount_sm'] != 'default') {
$min_width_sm = $drowl_paragraphs_breakpoint_mapping_sizes['sm']['min-width']['size'];
}
else {
$min_width_sm = $drowl_paragraphs_breakpoint_mapping_sizes_fallbacks['sm']['min-width']['size'];
}
$settings_sm = [
'breakpoint' => (int) $min_width_sm,
'settings' => array_merge($options_override, [
'slidesToShow' => (int) $settings_responsive_override['slide_amount_sm'],
'slidesToScroll' => (int) $settings_responsive_override['slide_amount_sm'],
]),
];
$data_slick['responsive'][] = $settings_sm;
}
if (!empty($settings_responsive_override['slide_amount_md'])) {
if ($settings_responsive_override['slide_amount_md'] != 'default') {
$min_width_md = $drowl_paragraphs_breakpoint_mapping_sizes['md']['min-width']['size'];
}
else {
$min_width_md = $drowl_paragraphs_breakpoint_mapping_sizes_fallbacks['md']['min-width']['size'];
}
$settings_md = [
'breakpoint' => (int) $min_width_md,
'settings' => array_merge($options_override, [
'slidesToShow' => (int) $settings_responsive_override['slide_amount_md'],
'slidesToScroll' => (int) $settings_responsive_override['slide_amount_md'],
]),
];
$data_slick['responsive'][] = $settings_md;
}
if (!empty($settings_responsive_override['slide_amount_lg'])) {
if ($settings_responsive_override['slide_amount_lg'] != 'default') {
$min_width_lg = $drowl_paragraphs_breakpoint_mapping_sizes['lg']['min-width']['size'];
}
else {
$min_width_lg = $drowl_paragraphs_breakpoint_mapping_sizes_fallbacks['lg']['min-width']['size'];
}
$settings_lg = [
'breakpoint' => (int) $min_width_lg,
'settings' => array_merge($options_override, [
'slidesToShow' => (int) $settings_responsive_override['slide_amount_lg'],
'slidesToScroll' => (int) $settings_responsive_override['slide_amount_lg'],
]),
];
$data_slick['responsive'][] = $settings_lg;
}
}
}
// Re-set the data-slick variable:
// A separate hook would be better but doesn't seem to exist: see https://www.drupal.org/project/slick/issues/2944330
$variables['content_attributes']->setAttribute('data-slick', Json::encode($data_slick));
}
}
}
// Preparation for default templates:
///**
// * Implements hook_theme()
// *
// * Register a theme for each paragraph type
// *
// */
//function drowl_paragraphs_types_theme(){
//
// $theme_templates = [];
// $paragraph_types = drowl_paragraphs_get_paragraph_types();
//
// foreach ($paragraph_types as $type){
// $theme_templates['paragraph__drowl_paragraphs__' . $type] = [
// 'base hook' => 'paragraph'
// ];
// }
//
// $theme_templates['paragraph__drowl_paragraphs'] = [
// 'base hook' => 'paragraph'
// ];
//
// return $theme_templates;
//}
//
//
///**
// * Implements hook_theme_registry_alter()
// *
// */
//function drowl_paragraphs_types_theme_registry_alter(&$theme_registry) {
// $module_path = drupal_get_path('module', 'drowl_paragraphs');
// $template_objects = drupal_find_theme_templates($theme_registry, '.html.twig', $module_path);
// $paragraph_types = drowl_paragraphs_get_paragraph_types();
//
// // 1. Loop through the paragraph types
// // 2. Check if each paragraph exists in the `$template_objects` array
// // 3. If it doesn't exist, remove it from the registry so we don't get any errors
// foreach ($paragraph_types as $type){
// $template = 'paragraph__drowl_paragraphs__' . $type;
// if(!isset($template_objects[$template])){
// unset($theme_registry['paragraph__drowl_paragraphs__' . $type]);
// }
// }
//
// if(!isset($template_objects['paragraph__drowl_paragraphs'])){
// unset($theme_registry['paragraph__drowl_paragraphs']);
// }
//}
//
//
///**
// * Helper function to get a list of paragraph types by machine name
// *
// * @return array
// */
//function drowl_paragraphs_types_get_paragraph_types(){
// $paragraph_bundles = \Drupal::service('entity_type.bundle.info')->getBundleInfo('paragraph');
// return array_keys($paragraph_bundles);
//}
