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