You are here

commerce.module in Commerce Core 8.2

Same filename and directory in other branches
  1. 7 commerce.module

Defines common functionality for all Commerce modules.

File

commerce.module
View source
<?php

/**
 * @file
 * Defines common functionality for all Commerce modules.
 */
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Render\Element;

/**
 * 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']);
}

/**
 * Implements hook_toolbar_alter().
 */
function commerce_toolbar_alter(&$items) {
  $items['administration']['#attached']['library'][] = 'commerce/toolbar';
}

/**
 * Implements hook_form_alter().
 */
function commerce_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  if ($form_state
    ->get('has_commerce_inline_forms')) {
    commerce_alter_inline_forms($form, $form_state, $form);
  }
}

/**
 * Invokes inline form alter hooks for the given element's inline forms.
 *
 * @param array $element
 *   The form element.
 * @param \Drupal\Core\Form\FormStateInterface $form_state
 *   The current state of the form.
 * @param array $complete_form
 *   The complete form structure.
 */
function commerce_alter_inline_forms(array &$element, FormStateInterface $form_state, array &$complete_form) {
  foreach (Element::children($element) as $key) {
    if (isset($element[$key]['#inline_form'])) {
      $inline_form =& $element[$key];

      /** @var \Drupal\commerce\Plugin\Commerce\InlineForm\InlineFormInterface $plugin */
      $plugin = $inline_form['#inline_form'];

      // Invoke hook_commerce_inline_form_alter() and
      // hook_commerce_inline_form_PLUGIN_ID_alter() implementations.
      $hooks = [
        'commerce_inline_form',
        'commerce_inline_form_' . $plugin
          ->getPluginId(),
      ];
      \Drupal::moduleHandler()
        ->alter($hooks, $inline_form, $form_state, $complete_form);
    }
    commerce_alter_inline_forms($element[$key], $form_state, $complete_form);
  }
}

/**
 * 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;
        }
      }
    }
  }
}

/**
 * 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;
      }
    }
  }
}

/**
 * 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();
  if (!$field_definition instanceof BaseFieldDefinition) {

    // 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.
  $children = Element::getVisibleChildren($element);
  if (count($children) == 1) {
    $child = reset($children);
    $element[$child]['#description'] = '';
  }
}

/**
 * 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;
}

/**
 * Helper for providing entity theme suggestions.
 *
 * @param string $entity_type_id
 *   The entity type ID.
 * @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;
}

/**
 * Implements hook_page_attachments_alter().
 */
function commerce_page_attachments_alter(array &$attachments) {
  if (isset($attachments['#attached']['html_head'])) {
    foreach ($attachments['#attached']['html_head'] as $index => &$parts) {
      if (!isset($parts[1]) || $parts[1] !== 'system_meta_generator') {
        continue;
      }
      $parts[0]['#attributes']['content'] .= '; Commerce 2';
    }
  }
}

Functions

Namesort descending Description
commerce_alter_inline_forms Invokes inline form alter hooks for the given element's inline forms.
commerce_field_formatter_info_alter Implements hook_field_formatter_info_alter().
commerce_field_widget_form_alter Implements hook_field_widget_form_alter().
commerce_field_widget_info_alter Implements hook_field_widget_info_alter().
commerce_form_alter Implements hook_form_alter().
commerce_get_entity_display Gets the entity display for the given entity type and bundle.
commerce_mail Implements hook_mail().
commerce_page_attachments_alter Implements hook_page_attachments_alter().
commerce_toolbar_alter Implements hook_toolbar_alter().
_commerce_entity_theme_suggestions Helper for providing entity theme suggestions.