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);
}
}
