paragraphs_grid-8.x-1.3/paragraphs_grid.module
paragraphs_grid.module
<?php
/**
* @file
* Contains paragraphs_grid.module.
*/
use Drupal\Component\Utility\Html;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\FieldableEntityInterface;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Template\Attribute;
/**
* Implements hook_help().
*/
function paragraphs_grid_help($route_name, RouteMatchInterface $route_match) {
switch ($route_name) {
case 'help.page.paragraphs_grid':
$text = file_get_contents(__DIR__ . '/README.md');
if (!\Drupal::moduleHandler()->moduleExists('markdown')) {
return '<pre>' . Html::escape($text) . '</pre>';
}
else {
// Use the Markdown filter to render the README.
$filter_manager = \Drupal::service('plugin.manager.filter');
$settings = \Drupal::configFactory()->get('markdown.settings')->getRawData();
$config = ['settings' => $settings];
$filter = $filter_manager->createInstance('markdown', $config);
return $filter->process($text, 'en');
}
}
return NULL;
}
/**
* Implements hook_theme().
*/
function paragraphs_grid_theme() {
return [
'pg_button' => [
'variables' => [
'label' => NULL,
'icon' => NULL,
'attributes' => NULL,
],
],
'pg_bpoint_col_header' => [
'variables' => [
'name' => NULL,
'size' => NULL,
'attributes' => NULL,
'icon_attributes' => NULL,
],
],
];
}
/**
* Implements hook_theme_suggestions_alter().
*
* Add a theme hook selected by the formatter.
*/
function paragraphs_grid_theme_suggestions_alter(array &$suggestions, array $variables, $hook) {
if ($hook == 'field' && $variables['element']['#field_type'] == 'entity_reference_revisions') {
$suggestions[] = $hook . '__' . $variables['element']['#formatter'];
}
}
/**
* Implements hook_theme_registry_alter().
*/
function paragraphs_grid_theme_registry_alter(&$theme_registry) {
$theme_registry['field__entity_reference_revisions'] = $theme_registry['field'];
$theme_registry['field__entity_reference_revisions']['template'] = 'field--paragraphs-grid-formatter';
$theme_registry['field__entity_reference_revisions']['path'] = \Drupal::service('extension.list.module')->getPath('paragraphs_grid') . '/templates';
}
/**
* Implements hook_preprocess_field().
*/
function paragraphs_grid_preprocess_field(&$variables) {
if (
$variables['field_type'] == 'entity_reference_revisions'
&& $variables['element']['#formatter'] == 'paragraphs_grid_formatter'
) {
// Get module configuration.
$module_config = \Drupal::config('paragraphs_grid.settings');
// Get configured grid-type-definition.
$grid_type = $module_config->get('gridtype');
$grid_config = ($grid_type) ? \Drupal::config($grid_type) : NULL;
// Set the grid wrapper classes.
$variables['container_attributes'] = $variables['element']['#container_attributes'] ?? new Attribute([]);
$variables['row_attributes'] = new Attribute([]);
if ($grid_config) {
// Set grid row classes.
$wrap_row = $grid_config->get('wrapper.row');
$variables['row_attributes']->addClass($wrap_row['options']);
// Set grid cell classes.
foreach ($variables['items'] as &$item) {
// Get cell fallback class.
$fallback = $grid_config->get('cell-fallback') ?: '';
// Set cell classes.
$field_grid = _paragraphs_grid_get_field_by_type($item['content']['#paragraph'], 'grid_field_type');
$field_grid_val = ($field_grid) ? $field_grid->value : '';
$classes = ($field_grid_val) ? explode(' ', $field_grid_val) : [];
$classes = (count($classes)) ? $classes : [$fallback];
/** @var Drupal\Core\Template\Attribute $item['attributes'] */
$item['attributes']->addClass($classes);
}
}
}
}
/**
* Implements hook_page_attachments().
*
* Append grid library.
*/
function paragraphs_grid_page_attachments(array &$page) {
// Get module configuration.
$module_config = \Drupal::config('paragraphs_grid.settings');
if ($module_config->get('use_lib_admin_pages') || !\Drupal::service('router.admin_context')->isAdminRoute()) {
// Get configured grid-type-definition.
$grid_type = $module_config->get('gridtype');
$grid_config = ($grid_type) ? \Drupal::config($grid_type) : NULL;
// Attach library from pg module.
if ($module_config->get('uselibrary') && $lib = $grid_config->get('library')) {
$page['#attached']['library'][] = $lib;
}
}
}
/**
* Implements hook_entity_view_mode_alter().
*
* If entity is a paragraph, ...
* find grid_field_type field, ...
* get the field value for view mode ...
* and finally => change the view mode of the paragraphs entity.
*/
function paragraphs_grid_entity_view_mode_alter(&$view_mode, EntityInterface $entity, $context) {
if ($entity->getEntityTypeId() == 'paragraph' && $view_mode != 'preview') {
/** @var \Drupal\paragraphs\Entity\Paragraph $entity */
// Find grid_field_type field, get set view mode and change the view mode.
$fields = \Drupal::service('entity_field.manager')->getFieldDefinitions($entity->getEntityTypeId(), $entity->bundle());
foreach ($fields as $field_name => $field) {
if ($field->getType() == 'grid_field_type' && $field_value = $entity->get($field_name)->getValue()) {
$field_value = reset($field_value);
$view_mode = $field_value['view_mode'] ?: $view_mode;
break;
}
}
}
}
/**
* Get active page field.
*
* @param \Drupal\Core\Entity\FieldableEntityInterface $entity
* The Entity which should be checked.
*
* @return \Drupal\Core\Field\FieldItemListInterface|null
* Return the field or null.
*/
function _paragraphs_grid_get_field_by_type(FieldableEntityInterface $entity, $type) {
$fields = $entity->getFields();
foreach ($fields as $field) {
$field_type = $field->getFieldDefinition()->getType();
if ($field_type == $type) {
return $field;
}
}
return NULL;
}
