arch-8.x-1.x-dev/modules/product/modules/group/arch_product_group.module

modules/product/modules/group/arch_product_group.module
<?php

/**
 * @file
 * Grouped product module.
 */

use Drupal\arch_product\Entity\ProductType;
use Drupal\arch_product\Entity\ProductTypeInterface;
use Drupal\arch_product_group\Plugin\Field\FieldType\IsGroupParentItemList;
use Drupal\arch_product_group\Plugin\Field\FieldWidget\ProductGroupWidget;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\Form\FormStateInterface;

/**
 * Implements hook_theme().
 */
function arch_product_group_theme($existing, $type, $theme, $path) {
  $items['item_list__product_matrix_field'] = [
    'base hook' => 'item_list',
    'variables' => [
      'items' => [],
      'title' => '',
      'list_type' => 'ul',
      'wrapper_attributes' => [],
      'attributes' => [],
      'empty' => NULL,
      'context' => [],
    ],
  ];
  return $items;
}

/**
 * Implements hook_entity_base_field_info().
 */
function arch_product_group_entity_base_field_info(EntityTypeInterface $entity_type) {
  if ($entity_type->id() == 'product') {
    $fields['is_group_parent'] = BaseFieldDefinition::create('boolean')
      ->setLabel(t('Is group parent', [], ['context' => 'arch_product_group']))
      ->setComputed(TRUE)
      ->setClass(IsGroupParentItemList::class);
    return $fields;
  }
}

/**
 * Implements hook_entity_base_field_info_alter().
 */
function arch_product_group_entity_base_field_info_alter(&$fields, EntityTypeInterface $entity_type) {
  if ($entity_type->id() == 'product') {
    /** @var \Drupal\Core\Field\BaseFieldDefinition[] $fields */
    $fields['group_id']
      ->setDisplayOptions('view', [
        'region' => 'hidden',
      ])
      ->setDisplayOptions('form', [
        'type' => 'product_group_select',
        'weight' => -7,
      ])
      ->setDisplayConfigurable('view', TRUE)
      ->setDisplayConfigurable('form', TRUE);
  }
}

/**
 * Implements hook_entity_bundle_info_alter().
 */
function arch_product_group_entity_bundle_info_alter(&$bundles) {
  $entity_type_manager = \Drupal::entityTypeManager();
  /** @var \Drupal\Core\Config\Entity\ConfigEntityStorage $product_type_storage */
  $product_type_storage = $entity_type_manager->getStorage('product_type');
  foreach ($bundles as $entity_type_id => &$info) {
    if ($entity_type_id != 'product') {
      continue;
    }
    foreach ($info as $bundle => &$bundle_info) {
      /** @var \Drupal\arch_product\Entity\ProductTypeInterface $type */
      $type = $product_type_storage->load($bundle);
      $bundle_info['groups'] = (bool) $type->getThirdPartySetting('arch_product_group', 'groups');
    }
  }
}

/**
 * Implements hook_form_alter().
 */
function arch_product_group_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  if (!in_array($form_id, ['product_type_add_form', 'product_type_edit_form'])) {
    return;
  }
  /** @var \Drupal\arch_product\Form\ProductTypeForm $form_object */
  $form_object = $form_state->getFormObject();
  /** @var \Drupal\arch_product\Entity\ProductType $product_type */
  $product_type = $form_object->getEntity();

  $form['grouped'] = [
    '#type' => 'details',
    '#title' => t('Product groups', [], ['context' => 'arch_product_group']),
    '#group' => 'product_type_features',
  ];

  $form['grouped']['grouping_enable'] = [
    '#type' => 'checkbox',
    '#title' => t('Enable group management', [], ['context' => 'arch_product_group']),
    '#default_value' => $product_type->getThirdPartySetting('arch_product_group', 'groups'),
  ];
  $form['#entity_builders'][] = 'arch_product_group_form_product_type_form_builder';
}

/**
 * Entity builder for the product type form with grouping options.
 *
 * @see arch_product_group_form_alter()
 */
function arch_product_group_form_product_type_form_builder($entity_type, ProductTypeInterface $type, &$form, FormStateInterface $form_state) {
  if ($form_state->getValue('grouping_enable')) {
    $type->setThirdPartySetting('arch_product_group', 'groups', TRUE);
  }
  else {
    $type->unsetThirdPartySetting('arch_product_group', 'groups');
  }
}

/**
 * Implements hook_form_FORM_ID_alter().
 */
function arch_product_group_form_entity_form_display_edit_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  if (
    $form['#entity_type'] != 'product'
    || empty($form['#bundle'])
  ) {
    return;
  }

  /** @var \Drupal\arch_product\Entity\ProductTypeInterface $product_type */
  $product_type = ProductType::load($form['#bundle']);
  if (!$product_type->getThirdPartySetting('arch_product_group', 'groups')) {
    $fields = array_flip($form['#fields']);
    unset($fields['group_id']);
    $form['#fields'] = array_flip($fields);
    unset($form['fields']['group_id']);
    $form_state->setValue(['fields', 'group_id', 'region'], 'hidden');
    $form['#validate'][] = '_arch_product_group_form__hide_group_id_field';
  }
}

/**
 * Hide group_id field.
 */
function _arch_product_group_form__hide_group_id_field(array &$form, FormStateInterface $form_state) {
  if (
    $form['#entity_type'] != 'product'
    || empty($form['#bundle'])
  ) {
    return;
  }

  /** @var \Drupal\arch_product\Entity\ProductTypeInterface $product_type */
  $product_type = ProductType::load($form['#bundle']);
  if (!$product_type->getThirdPartySetting('arch_product_group', 'groups')) {
    $form_state->setValue(['fields', 'group_id'], [
      'region' => 'hidden',
      'weight' => 0,
      'parent' => '',
    ]);
  }
}

/**
 * Implements hook_form_BASE_FORM_ID_alter().
 */
function arch_product_group_form_product_form_alter(&$form, FormStateInterface $form_state) {
  /** @var \Drupal\arch_product\Form\ProductForm $form_object */
  $form_object = $form_state->getFormObject();
  /** @var \Drupal\arch_product\Entity\ProductInterface $product */
  $product = $form_object->getEntity();

  /** @var \Drupal\arch_product\Entity\ProductTypeInterface $product_type */
  $product_type = ProductType::load($product->bundle());
  if (
    !empty($form['group_id'])
    && !$product_type->getThirdPartySetting('arch_product_group', 'groups')
  ) {
    $form['group_id']['#access'] = FALSE;
  }
  $form['actions']['submit']['#submit'][] = '_arch_product_group_group_modification_action';
}

/**
 * Implements hook_entity_presave().
 */
function arch_product_group_entity_presave(EntityInterface $entity) {
  if ($entity->getEntityTypeId() !== 'product') {
    return;
  }

  /** @var \Drupal\arch_product\Entity\ProductInterface $entity */
  if ($entity->isNew()) {
    return;
  }

  if (!$entity->get('group_id')->value) {
    $entity->set('group_id', $entity->id());
  }
}

/**
 * Submit handler for group mode change.
 */
function _arch_product_group_group_modification_action(array &$form, FormStateInterface $form_state) {
  /** @var \Drupal\arch_product\Form\ProductForm $form_object */
  $form_object = $form_state->getFormObject();
  /** @var \Drupal\arch_product\Entity\ProductInterface $product */
  $product = $form_object->getEntity();
  if ($product->isNew()) {
    return;
  }

  $selected_mode = (int) $form_state->getValue([
    'group_id',
    0,
    'product_group',
    'mode',
  ]);

  /** @var \Drupal\arch_product_group\GroupHandlerInterface $group_handler */
  $group_handler = \Drupal::service('product_group.handler');
  if (
    $group_handler->isGroupParent($product)
    && $selected_mode === ProductGroupWidget::MODE_STANDALONE
  ) {
    $group_handler->dismissGroup($product->id());
  }
  elseif (
    $group_handler->isPartOfGroup($product)
    && $selected_mode === ProductGroupWidget::MODE_STANDALONE
  ) {
    $group_handler->leaveGroup($product);
  }
}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc