improvements-2.x-dev/modules/improvements_paragraphs/improvements_paragraphs.module
modules/improvements_paragraphs/improvements_paragraphs.module
<?php
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Field\WidgetInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\paragraphs\ParagraphInterface;
use Drupal\paragraphs_library\LibraryItemInterface;
/**
* Implements hook_entity_base_field_info().
*/
function improvements_paragraphs_entity_base_field_info(EntityTypeInterface $entity_type): array {
$fields = [];
if ($entity_type->id() == 'paragraph') {
$fields['label'] = BaseFieldDefinition::create('string')
->setLabel(t('Label'));
$fields['machine_name'] = BaseFieldDefinition::create('string')
->setLabel(t('Machine name'))
->addConstraint('UniqueField');
}
return $fields;
}
/**
* Implements hook_theme_suggestions_HOOK_alter().
*/
function improvements_paragraphs_theme_suggestions_paragraph_alter(array &$suggestions, array $variables): void {
$paragraph = $variables['elements']['#paragraph']; /** @var ParagraphInterface $paragraph */
if ($machine_name = $paragraph->get('machine_name')->value) {
$suggestions[] = 'paragraph__' . $paragraph->bundle() . '__' . $machine_name;
}
}
/**
* Implements hook_entity_view_mode_alter().
*/
function improvements_paragraphs_entity_view_mode_alter(string &$view_mode, EntityInterface $entity): void {
if ($entity instanceof ParagraphInterface) {
// Change view mode by parent paragraph behavior
$parent_entity = $entity->getParentEntity();
if ($parent_entity instanceof ParagraphInterface) {
$parent_paragraph_field_name = $entity->get('parent_field_name')->value;
$parent_paragraph_behavior_settings = $parent_entity->getAllBehaviorSettings(); // Not used getBehaviorSetting() for increase performance
if ($new_view_mode = $parent_paragraph_behavior_settings['view_mode']['child_view_mode'][$parent_paragraph_field_name] ?? NULL) {
[$new_view_mode_bundle, $new_view_mode] = explode('.', $new_view_mode);
if ($new_view_mode_bundle == $entity->bundle()) {
$view_mode = $new_view_mode;
}
}
}
// Change view mode by current paragraph behavior
$current_paragraph_behavior_settings = $entity->getAllBehaviorSettings(); // Not used getBehaviorSetting() for increase performance
if ($new_view_mode = $current_paragraph_behavior_settings['view_mode']['view_mode'] ?? NULL) {
$view_mode = $new_view_mode;
}
}
}
/**
* Implements hook_field_widget_third_party_settings_form().
*/
function improvements_paragraphs_field_widget_third_party_settings_form(WidgetInterface $widget, FieldDefinitionInterface $field_definition, string $form_mode, array $form, FormStateInterface $form_state): array {
$element = [];
if ($widget->getPluginId() == 'paragraphs') {
$element['sort_operations'] = [
'#type' => 'checkbox',
'#title' => t('Sort operations'),
'#default_value' => $widget->getThirdPartySetting('improvements_paragraphs', 'sort_operations'),
];
}
return $element;
}
/**
* Implements hook_paragraphs_widget_actions_alter().
*/
function improvements_paragraphs_paragraphs_widget_actions_alter(array &$widget_actions, array &$context): void {
$paragraph = $context['paragraphs_entity']; /** @var ParagraphInterface $paragraph */
// Add link to edit paragraph in dropdown actions
if (
$paragraph->bundle() == 'from_library' &&
$library_item_entity = $paragraph->get('field_reusable_paragraph')->entity /** @var LibraryItemInterface $library_item_entity */
) {
$widget_actions['dropdown_actions']['edit_library_item'] = [
'#type' => 'link',
'#title' => t('Edit library item'),
'#url' => $library_item_entity->toUrl('edit-form'),
'#attributes' => [
'target' => '_blank',
'class' => ['button', 'button--small'],
],
'#weight' => 1000,
];
}
}
/**
* Implements hook_field_widget_complete_WIDGET_ID_form_alter(): paragraphs.
*/
function improvements_paragraphs_field_widget_complete_paragraphs_form_alter(array &$field_widget_complete_form, FormStateInterface $form_state, array $context): void {
$widget = $context['widget']; /** @var WidgetInterface $widget */
// Sort operations
if ($widget->getThirdPartySetting('improvements_paragraphs', 'sort_operations')) {
if (isset($field_widget_complete_form['widget']['add_more']['operations']['#links'])) {
uasort($field_widget_complete_form['widget']['add_more']['operations']['#links'], function (array $link_a, array $link_b) {
$link_a_label = (string)$link_a['title']['#value'];
$link_b_label = (string)$link_b['title']['#value'];
return strnatcasecmp($link_a_label, $link_b_label);
});
}
}
}
/**
* Implements hook_field_widget_single_element_WIDGET_TYPE_form_alter(): paragraphs.
*/
function improvements_paragraphs_field_widget_single_element_paragraphs_form_alter(array &$element, FormStateInterface $form_state, array $context): void {
// Move some paragraph fields to behavior tab
if (isset($element['behavior_plugins']['move_widget'])) {
foreach ($element['behavior_plugins']['move_widget']['#behavior_configuration']['fields'] as $field_name => $weight) {
if (isset($element['subform'][$field_name])) {
$element['behavior_plugins'][$field_name] = $element['subform'][$field_name];
$element['behavior_plugins'][$field_name]['#weight'] = $weight;
$element['behavior_plugins'][$field_name]['#attributes']['class'][] = 'paragraphs-behavior';
unset($element['subform'][$field_name]);
}
}
}
}
