commerce_product_bundles-8.x-1.0/src/Form/ProductBundleForm.php
src/Form/ProductBundleForm.php
<?php
namespace Drupal\commerce_product_bundles\Form;
use Drupal\Core\Datetime\DateFormatterInterface;
use Drupal\Component\Datetime\TimeInterface;
use Drupal\Core\Entity\ContentEntityForm;
use Drupal\Core\Entity\EntityRepositoryInterface;
use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Link;
use Drupal\Core\Render\Element;
use Drupal\entity\Form\EntityDuplicateFormTrait;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Defines the product bundle add/edit form.
*
* Code was taken from and modified:
* @see \Drupal\commerce_product\Form\ProductForm
*/
class ProductBundleForm extends ContentEntityForm {
use EntityDuplicateFormTrait;
/**
* The date formatter.
*
* @var \Drupal\Core\Datetime\DateFormatterInterface
*/
protected $dateFormatter;
/**
* ProductBundleForm constructor.
*
* @param \Drupal\Core\Entity\EntityRepositoryInterface $entity_repository
* @param \Drupal\Core\Entity\EntityTypeBundleInfoInterface $entity_type_bundle_info
* @param \Drupal\Component\Datetime\TimeInterface $time
* @param \Drupal\Core\Datetime\DateFormatterInterface $date_formatter
*/
public function __construct(EntityRepositoryInterface $entity_repository, EntityTypeBundleInfoInterface $entity_type_bundle_info, TimeInterface $time, DateFormatterInterface $date_formatter) {
parent::__construct($entity_repository, $entity_type_bundle_info, $time);
$this->dateFormatter = $date_formatter;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('entity.repository'),
$container->get('entity_type.bundle.info'),
$container->get('datetime.time'),
$container->get('date.formatter')
);
}
/**
* {@inheritdoc}
*
* @see \Drupal\commerce_product\Form\ProductForm::buildForm()
*/
public function buildForm(array $form, FormStateInterface $form_state) {
// Skip building the form if there are no available stores.
$store_query = $this->entityTypeManager->getStorage('commerce_store')->getQuery();
if ($store_query->count()->execute() == 0) {
$link = Link::createFromRoute('Add a new store.', 'entity.commerce_store.add_page');
$form['warning'] = [
'#markup' => t("Product bundles can't be created until a store has been added. @link", ['@link' => $link->toString()]),
];
return $form;
}
// Skip building the form if there are no available commerce products.
$commerce_products_query = $this->entityTypeManager->getStorage('commerce_product')->getQuery();
if ($commerce_products_query->count()->execute() == 0) {
$link = Link::createFromRoute('Add a new commerce product.', 'entity.commerce_product.add_page');
$form['warning'] = [
'#markup' => t("Product bundles can't be created until at least one commerce product has been added. @link", ['@link' => $link->toString()]),
];
return $form;
}
return parent::buildForm($form, $form_state);
}
/**
* {@inheritdoc}
*
* @see \Drupal\commerce_product\Form\ProductForm::form()
*/
public function form(array $form, FormStateInterface $form_state) {
/* @var \Drupal\commerce_product_bundles\Entity\ProductBundle $product_bundle */
$product_bundle = $this->entity;
$form = parent::form($form, $form_state);
$form['#tree'] = TRUE;
$form['#theme'] = ['commerce_product_bundles_form'];
// Use commerce_product_form library.
$form['#attached']['library'][] = 'commerce_product/form';
// Changed must be sent to the client, for later overwrite error checking.
$form['changed'] = [
'#type' => 'hidden',
'#default_value' => $product_bundle->getChangedTime(),
];
$form['status']['#group'] = 'footer';
$last_saved = t('Not saved yet');
if (!$product_bundle->isNew()) {
$last_saved = $this->dateFormatter->format($product_bundle->getChangedTime(), 'short');
}
$form['meta'] = [
'#attributes' => ['class' => ['entity-meta__header']],
'#type' => 'container',
'#group' => 'advanced',
'#weight' => -100,
'published' => [
'#type' => 'html_tag',
'#tag' => 'h3',
'#value' => $product_bundle->isPublished() ? $this->t('Published') : $this->t('Not published'),
'#access' => !$product_bundle->isNew(),
'#attributes' => [
'class' => ['entity-meta__title'],
],
],
'changed' => [
'#type' => 'item',
'#wrapper_attributes' => [
'class' => ['entity-meta__last-saved', 'container-inline'],
],
'#markup' => '<h4 class="label inline">' . $this->t('Last saved') . '</h4> ' . $last_saved,
],
'author' => [
'#type' => 'item',
'#wrapper_attributes' => [
'class' => ['author', 'container-inline'],
],
'#markup' => '<h4 class="label inline">' . $this->t('Author') . '</h4> ' . $product_bundle->getOwner()->getDisplayName(),
],
];
$form['advanced'] = [
'#type' => 'container',
'#attributes' => ['class' => ['entity-meta']],
'#weight' => 99,
];
$form['visibility_settings'] = [
'#type' => 'details',
'#title' => t('Visibility settings'),
'#open' => TRUE,
'#group' => 'advanced',
'#access' => !empty($form['stores']['#access']),
'#attributes' => [
'class' => ['product-visibility-settings'],
],
'#weight' => 30,
];
$form['path_settings'] = [
'#type' => 'details',
'#title' => t('URL path settings'),
'#open' => !empty($form['path']['widget'][0]['alias']['#default_value']),
'#group' => 'advanced',
'#access' => !empty($form['path']['#access']) && $product_bundle->get('path')->access('edit'),
'#attributes' => [
'class' => ['path-form'],
],
'#attached' => [
'library' => ['path/drupal.path'],
],
'#weight' => 60,
];
$form['author'] = [
'#type' => 'details',
'#title' => t('Authoring information'),
'#group' => 'advanced',
'#attributes' => [
'class' => ['product-form-author'],
],
'#weight' => 90,
'#optional' => TRUE,
];
if (isset($form['uid'])) {
$form['uid']['#group'] = 'author';
}
if (isset($form['created'])) {
$form['created']['#group'] = 'author';
}
if (isset($form['path'])) {
$form['path']['#group'] = 'path_settings';
}
if (isset($form['stores'])) {
$form['stores']['#group'] = 'visibility_settings';
$form['#after_build'][] = [get_class($this), 'hideEmptyVisibilitySettings'];
}
return $form;
}
/**
* Hides the visibility settings if the stores widget is a hidden element.
*
* @param array $form
* The form.
*
* @return array
* The modified visibility_settings element.
*
* @see \Drupal\commerce_product\Form\ProductForm::hideEmptyVisibilitySettings()
*/
public static function hideEmptyVisibilitySettings(array $form) {
if (isset($form['stores']['widget']['target_id'])) {
$stores_element = $form['stores']['widget']['target_id'];
if (!Element::getVisibleChildren($stores_element)) {
$form['visibility_settings']['#printed'] = TRUE;
unset($form['stores']['#group']);
}
}
return $form;
}
/**
* {@inheritdoc}
*
* @see \Drupal\commerce_product\Form\ProductForm::actions()
*/
protected function actions(array $form, FormStateInterface $form_state) {
$actions = parent::actions($form, $form_state);
if ($this->entity->isNew()) {
$actions['submit_continue'] = [
'#type' => 'submit',
'#value' => $this->t('Save and add variations'),
'#continue' => TRUE,
'#submit' => ['::submitForm', '::save'],
// Hide the button if variations are managed through a widget.
'#access' => empty($form['variations']),
];
}
return $actions;
}
/**
* {@inheritdoc}
*/
public function save(array $form, FormStateInterface $form_state) {
/** @var \Drupal\commerce_product_bundles\Entity\ProductBundleInterface $product_bundle */
$product_bundle = $this->getEntity();
$product_bundle->save();
// Support for duplicate operation.
// Parent post save dispatched ENTITY_DUPLICATE event.
$this->postSave($product_bundle, $this->operation);
$this->messenger()->addMessage($this->t('The product %label has been successfully saved.', ['%label' => $product_bundle->label()]));
if (!empty($form_state->getTriggeringElement()['#continue'])) {
$form_state->setRedirect('entity.commerce_bundle_variation.collection', ['commerce_product_bundles' => $product_bundle->id()]);
}
else {
$form_state->setRedirect('entity.commerce_product_bundles.collection');
}
}
}
