forked from a64f7bb4-7358-4778-9fbe-3b882c34cc1d/v1
				
			
		
			
				
	
	
		
			222 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			222 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			PHP
		
	
	
<?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->renderPlain($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_single_element_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_single_element_form_alter(array &$element, FormStateInterface $form_state, array $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';
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 |