commerce.module 5.41 KB
Newer Older
1 2 3 4
<?php

/**
 * @file
5
 * Defines common functionality for all Commerce modules.
6 7
 */

8
use Drupal\Core\Field\BaseFieldDefinition;
9
use Drupal\Core\Form\FormStateInterface;
10
use Drupal\Core\Render\Element;
11

12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
/**
 * Implements hook_mail().
 *
 * Prepares emails sent by the MailHandler service.
 */
function commerce_mail($key, &$message, $params) {
  /** @var \Drupal\Core\Render\RendererInterface $renderer */
  $renderer = \Drupal::service('renderer');

  if (isset($params['headers'])) {
    $message['headers'] = array_merge($message['headers'], $params['headers']);
  }
  if (!empty($params['from'])) {
    $message['from'] = $params['from'];
  }
  $message['subject'] = $params['subject'];
  $message['body'][] = $renderer->render($params['body']);
}

31
/**
32
 * Implements hook_toolbar_alter().
33
 */
34 35
function commerce_toolbar_alter(&$items) {
  $items['administration']['#attached']['library'][] = 'commerce/toolbar';
36
}
37

38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
/**
 * Implements hook_field_widget_info_alter().
 *
 * Exposes the commerce_plugin_item widgets for each of the field type's
 * derivatives, since core does not do it automatically.
 */
function commerce_field_widget_info_alter(array &$info) {
  foreach (['commerce_plugin_select', 'commerce_plugin_radios'] as $widget) {
    if (isset($info[$widget])) {
      $field_type_manager = \Drupal::service('plugin.manager.field.field_type');
      foreach ($field_type_manager->getDefinitions() as $key => $definition) {
        if ($definition['id'] == 'commerce_plugin_item') {
          $info[$widget]['field_types'][] = $key;
        }
      }
    }
  }
}

57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
/**
 * Implements hook_field_formatter_info_alter().
 *
 * Exposes the commerce_plugin_item_default formatter for each of the field
 * type's derivatives, since core does not do it automatically.
 */
function commerce_field_formatter_info_alter(array &$info) {
  if (isset($info['commerce_plugin_item_default'])) {
    $field_type_manager = \Drupal::service('plugin.manager.field.field_type');
    foreach ($field_type_manager->getDefinitions() as $key => $definition) {
      if ($definition['id'] == 'commerce_plugin_item') {
        $info['commerce_plugin_item_default']['field_types'][] = $key;
      }
    }
  }
}

74 75 76 77 78 79 80 81 82 83 84 85
/**
 * Implements hook_field_widget_form_alter().
 *
 * Base fields have a description that's used for two very different purposes:
 * - To describe the field in the Views UI and other parts of the system.
 * - As user-facing help text shown on field widgets.
 * The text is rarely suitable for both, and in most cases feels redundant
 * as user-facing help text. Hence we remove it from that context, but only if
 * the definition didn't specify otherwise via our display_description setting.
 */
function commerce_field_widget_form_alter(&$element, FormStateInterface $form_state, $context) {
  $field_definition = $context['items']->getFieldDefinition();
86
  if (!($field_definition instanceof BaseFieldDefinition)) {
87 88 89 90 91 92 93 94 95 96 97 98 99 100
    // Not a base field.
    return;
  }
  if (strpos($field_definition->getTargetEntityTypeId(), 'commerce_') !== 0) {
    // Not a Commerce entity type.
    return;
  }
  if ($field_definition->getSetting('display_description')) {
    // The definition requested that the description stays untouched.
    return;
  }

  $element['#description'] = '';
  // Many widgets are nested one level deeper.
101
  $children = Element::getVisibleChildren($element);
102 103 104 105 106
  if (count($children) == 1) {
    $child = reset($children);
    $element[$child]['#description'] = '';
  }
}
107

108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
/**
 * Gets the entity display for the given entity type and bundle.
 *
 * The entity display will be created if missing.
 *
 * @param string $entity_type
 *   The entity type.
 * @param string $bundle
 *   The bundle.
 * @param string $display_context
 *   The display context ('view' or 'form').
 *
 * @throws \InvalidArgumentException
 *   Thrown when an invalid display context is provided.
 *
 * @return \Drupal\Core\Entity\Display\EntityDisplayInterface
 *   The entity display.
 */
function commerce_get_entity_display($entity_type, $bundle, $display_context) {
  if (!in_array($display_context, ['view', 'form'])) {
    throw new \InvalidArgumentException(sprintf('Invalid display_context %s passed to _commerce_product_get_display().', $display_context));
  }

  $storage = \Drupal::entityTypeManager()->getStorage('entity_' . $display_context . '_display');
  $display = $storage->load($entity_type . '.' . $bundle . '.default');
  if (!$display) {
    $display = $storage->create([
      'targetEntityType' => $entity_type,
      'bundle' => $bundle,
      'mode' => 'default',
      'status' => TRUE,
    ]);
  }

  return $display;
}

145 146 147 148
/**
 * Helper for providing entity theme suggestions.
 *
 * @param string $entity_type_id
149
 *   The entity type ID.
150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
 * @param array $variables
 *   An array of variables passed to the theme hook.
 *
 * @return array
 *   An array of theme suggestions.
 */
function _commerce_entity_theme_suggestions($entity_type_id, array $variables) {
  $original = $variables['theme_hook_original'];
  $entity = $variables['elements']['#' . $entity_type_id];
  $sanitized_view_mode = strtr($variables['elements']['#view_mode'], '.', '_');

  $suggestions = [];
  $suggestions[] = $original . '__' . $sanitized_view_mode;
  $suggestions[] = $original . '__' . $entity->bundle();
  $suggestions[] = $original . '__' . $entity->bundle() . '__' . $sanitized_view_mode;
  $suggestions[] = $original . '__' . $entity->id();
  $suggestions[] = $original . '__' . $entity->id() . '__' . $sanitized_view_mode;

  return $suggestions;
}