commerce-8.x-2.8/modules/order/src/Plugin/Field/FieldWidget/UnitPriceWidget.php
modules/order/src/Plugin/Field/FieldWidget/UnitPriceWidget.php
<?php namespace Drupal\commerce_order\Plugin\Field\FieldWidget; use Drupal\commerce_price\Price; use Drupal\Component\Utility\NestedArray; use Drupal\Core\Field\FieldDefinitionInterface; use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Field\WidgetBase; use Drupal\Core\Form\FormStateInterface; /** * Plugin implementation of the 'commerce_unit_price' widget. * * @FieldWidget( * id = "commerce_unit_price", * label = @Translation("Unit price"), * field_types = { * "commerce_price", * } * ) */ class UnitPriceWidget extends WidgetBase { /** * {@inheritdoc} */ public static function defaultSettings() { return [ 'require_confirmation' => FALSE, ] + parent::defaultSettings(); } /** * {@inheritdoc} */ public function settingsForm(array $form, FormStateInterface $form_state) { $element = parent::settingsForm($form, $form_state); $element['require_confirmation'] = [ '#type' => 'checkbox', '#title' => $this->t('Require confirmation before overriding the unit price'), '#default_value' => $this->getSetting('require_confirmation'), ]; return $element; } /** * {@inheritdoc} */ public function settingsSummary() { $summary = parent::settingsSummary(); if ($this->getSetting('require_confirmation') == 1) { $summary[] = $this->t('Require confirmation before overriding the unit price'); } else { $summary[] = $this->t('Do not require confirmation before overriding the unit price'); } return $summary; } /** * {@inheritdoc} */ public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) { $element = []; /** @var \Drupal\commerce_order\Entity\OrderItemInterface $order_item */ $order_item = $items[$delta]->getEntity(); if ($this->getSetting('require_confirmation')) { $element['override'] = [ '#type' => 'checkbox', '#title' => $this->t('Override the unit price'), '#default_value' => $order_item->isUnitPriceOverridden(), ]; } $element['amount'] = [ '#type' => 'commerce_price', '#title' => $this->fieldDefinition->getLabel(), '#required' => $this->fieldDefinition->isRequired(), '#available_currencies' => array_filter($this->getFieldSetting('available_currencies')), ]; if (!$items[$delta]->isEmpty()) { $element['amount']['#default_value'] = $items[$delta]->toPrice()->toArray(); } if ($this->getSetting('require_confirmation')) { $checkbox_parents = array_merge($form['#parents'], [$this->fieldDefinition->getName(), 0, 'override']); $checkbox_path = array_shift($checkbox_parents); $checkbox_path .= '[' . implode('][', $checkbox_parents) . ']'; $element['amount']['#states'] = [ 'visible' => [ ':input[name="' . $checkbox_path . '"]' => ['checked' => TRUE], ], ]; } return $element; } /** * {@inheritdoc} */ public function extractFormValues(FieldItemListInterface $items, array $form, FormStateInterface $form_state) { $field_name = $this->fieldDefinition->getName(); $path = array_merge($form['#parents'], [$field_name, 0]); $values = NestedArray::getValue($form_state->getValues(), $path); if ($values) { /** @var \Drupal\commerce_order\Entity\OrderItemInterface $order_item */ $order_item = $items[0]->getEntity(); if (!$this->getSetting('require_confirmation') || !empty($values['override'])) { $unit_price = new Price($values['amount']['number'], $values['amount']['currency_code']); $order_item->setUnitPrice($unit_price, TRUE); } // Put delta mapping in $form_state, so that flagErrors() can use it. $field_state = static::getWidgetState($form['#parents'], $field_name, $form_state); foreach ($items as $delta => $item) { $field_state['original_deltas'][$delta] = $delta; } static::setWidgetState($form['#parents'], $field_name, $form_state, $field_state); } } /** * {@inheritdoc} */ public static function isApplicable(FieldDefinitionInterface $field_definition) { $entity_type = $field_definition->getTargetEntityTypeId(); $field_name = $field_definition->getName(); return $entity_type == 'commerce_order_item' && $field_name == 'unit_price'; } }