auctions-1.0.x-dev/modules/auctions_core/src/Form/AuctionItemRelistForm.php
modules/auctions_core/src/Form/AuctionItemRelistForm.php
<?php
namespace Drupal\auctions_core\Form;
use Drupal\auctions_core\AuctionToolsTrait;
use Drupal\auctions_core\Service\AuctionTools;
use Drupal\Component\Datetime\TimeInterface;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Datetime\DrupalDateTime;
use Drupal\Core\Entity\ContentEntityForm;
use Drupal\Core\Entity\EntityRepository;
use Drupal\Core\Entity\EntityTypeBundleInfo;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Messenger\MessengerInterface;
use Drupal\Core\Session\AccountProxy;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Form controller for Auction Items edit forms.
*
* @ingroup auctions_core
*/
class AuctionItemRelistForm extends ContentEntityForm {
use AuctionToolsTrait;
/**
* The current user account.
*
* @var \Drupal\Core\Session\AccountProxyInterface
*/
protected $account;
/**
* AuctionTools Helper service.
*
* @var \Drupal\auctions_core\Service\AuctionTools
*/
protected $auctionTools;
/**
* The config factory.
*
* @var \Drupal\Core\Config\ConfigFactoryInterface
*/
protected $configFactory;
/**
* The Messenger service.
*
* @var \Drupal\Core\Messenger\MessengerInterface
*/
protected $messenger;
/**
* Constructs an AuctionItemForm object.
*
* @param \Drupal\Core\Entity\EntityRepositoryInterface $entity_repository
* The entity repository service.
* @param \Drupal\Core\Entity\EntityTypeBundleInfoInterface $entity_type_bundle_info
* The entity type bundle service.
* @param \Drupal\Component\Datetime\TimeInterface $time
* The time service.
* @param \Drupal\Core\Session\AccountProxy $account
* The current user account.
* @param \Drupal\auctions_core\Service\AuctionTools $auctionTools
* The AuctionTools Helper service.
* @param \Drupal\Core\Config\ConfigFactoryInterface $configFactory
* The config factory.
* @param \Drupal\Core\Messenger\MessengerInterface $messenger
* The Messenger service.
*/
public function __construct(EntityRepository $entity_repository, EntityTypeBundleInfo $entity_type_bundle_info, TimeInterface $time, AccountProxy $account, AuctionTools $auctionTools, ConfigFactoryInterface $configFactory, MessengerInterface $messenger) {
parent::__construct($entity_repository, $entity_type_bundle_info, $time);
$this->account = $account;
$this->auctionTools = $auctionTools;
$this->configFactory = $configFactory;
$this->messenger = $messenger;
}
/**
* {@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('current_user'),
$container->get('auctions_core.tools'),
$container->get('config.factory'),
$container->get('messenger')
);
}
/**
* {@inheritdoc}
*/
public function buildForm(array $form, FormStateInterface $form_state) {
/** @var \Drupal\auctions_core\Entity\AuctionItem $entity */
$itemSettings = $this->configFactory->get('auctions.item_settings');
$form_state->setRebuild();
$entity = $this->entity;
$workflow = $entity->getWorkflow();
$getRelistCount = $entity->getRelistCount();
if ($workflow == 1 || $workflow == 2 || $workflow == 4) {
$this->messenger()->addError("You can not relist this auction Item. It is not finished yet.");
return $form;
}
$form = parent::buildForm($form, $form_state);
$form['workflow']['widget'][0]['#default_value'] = 2;
$currentRelist = $form_state->getValue('relist_count');
$form_state->setValue('relist_count', $currentRelist++);
$form['new_revision'] = [
'#type' => 'checkbox',
'#title' => $this->t('Create new revision'),
'#default_value' => FALSE,
'#weight' => 50,
];
$this->messenger()->addWarning("Relisting Be sure to adjust Auction Period as desired.");
// Can not start with adding bids, reverse entity ref.
$form['bids']['#access'] = FALSE;
$form['workflow']['#access'] = FALSE;
$form['revision_log_message']['#access'] = FALSE;
$form['status']['#access'] = FALSE;
$form['#after_build'][] = '::afterBuild';
$form['price_starting']['widget'][0]['value']['#states'] = [
'invisible' => [
':input[name="instant_only[value]"]' => ['checked' => TRUE],
],
'required' => [
':input[name="instant_only[value]"]' => ['checked' => FALSE],
],
];
$form['bid_step']['widget'][0]['value']['#states'] = [
'invisible' => [
':input[name="instant_only[value]"]' => ['checked' => TRUE],
],
'required' => [
':input[name="instant_only[value]"]' => ['checked' => FALSE],
],
];
$form['price_threshold']['widget'][0]['value']['#states'] = [
'invisible' => [
':input[name="instant_only[value]"]' => ['checked' => TRUE],
],
'required' => [
':input[name="price_buy_now[0][value]"]' => ['!value' => 0],
],
];
$form['price_buy_now']['widget'][0]['value']['#states'] = [
'required' => [
':input[name="instant_only[value]"]' => ['checked' => TRUE],
],
];
// Block negitives from input number element.
$form['price_starting']['widget'][0]['value']['#min'] = 0;
$form['price_starting']['widget'][0]['value']['#field_prefix'] = '$';
$form['bid_step']['widget'][0]['value']['#field_prefix'] = '$';
$form['bid_step']['widget'][0]['value']['#min'] = $itemSettings->get('bid-step');
$form['price_threshold']['widget'][0]['value']['#min'] = 0;
$form['price_threshold']['widget'][0]['value']['#step'] = '1';
$form['price_threshold']['widget'][0]['value']['#field_suffix'] = '%';
$form['price_threshold']['widget'][0]['value']['#size'] = '4';
$form['price_buy_now']['widget'][0]['value']['#field_prefix'] = '$';
$form['price_buy_now']['widget'][0]['value']['#min'] = 0;
$form['bid_step']['widget'][0]['value']['#default_value'] = $itemSettings->get('bid-step');
return $form;
}
/**
* Form element #after_build callback: Updates the entity with submitted data.
*/
public function afterBuild(array $element, FormStateInterface $form_state) {
// Only let use select one, change to radios.
// Daterange has pass years, remove them..
$now = new DrupalDateTime('now');
$years = $this->configFactory->get('auctions.item_settings')->get('years-ahead');
$current = $now->format('Y');
$then = $now->modify("$years year")->format('Y');
$rawRange = \range($current, $then);
$yearRange = \array_combine($rawRange, $rawRange);
$element['date']['widget'][0]['value']['year']['#options'] = $yearRange;
$element['date']['widget'][0]['end_value']['year']['#options'] = $yearRange;
// Rebuild the entity if #after_build is being called as part of a form
// rebuild, i.e. if we are processing input.
if ($form_state->isProcessingInput()) {
$this->entity = $this->buildEntity($element, $form_state);
}
return $element;
}
/**
* {@inheritdoc}
*/
public function save(array $form, FormStateInterface $form_state) {
$entity = $this->entity;
// Set workflow to relist status.
$entity->setWorkflow(2);
// // increment relist counter
$relistCount = $entity->getRelistCount();
$entity->setRelistCount($relistCount + 1);
// Round off any decimal before save.
$priceMonitor = $this->itemPriceMonitor();
foreach ($priceMonitor as $field => $method) {
$price = $form_state->getValue($field);
$roundPrice = $this->roundCents($price[0]['value']);
$entity->$method($roundPrice);
}
// Save as a new revision if requested to do so.
if (!$form_state->isValueEmpty('new_revision') && $form_state->getValue('new_revision') != FALSE) {
$entity->setNewRevision();
// If a new revision is created, save the current user as revision author.
$entity->setRevisionCreationTime($this->time->getRequestTime());
$entity->setRevisionUserId($this->account->id());
}
else {
$entity->setNewRevision(FALSE);
}
$entity->save();
\Drupal::service('cache_tags.invalidator')->invalidateTags(['auction_item:' . $entity->id()]);
$this->messenger()->addMessage($this->t('Relisted Auction Item <q>%label</q>. Item is Active again.', [
'%label' => $entity->label(),
]));
if ($entity->id()) {
$form_state->setRedirect('entity.auction_item.canonical', ['auction_item' => $entity->id()]);
}
}
}
