/** * @covers ::getDefinitions */ public function testGetDefinitions() { $definitions = array('foo' => array('label' => $this->randomMachineName())); $this->discovery->expects($this->once())->method('getDefinitions')->willReturn($definitions); $this->moduleHandler->expects($this->once())->method('alter')->with('payment_line_item'); $this->assertSame($definitions, $this->sut->getDefinitions()); }
/** * Implements form #process callback. */ public function process(array $element, FormStateInterface $form_state, array $form) { $plugin_id = $this->getPluginId(); // Set internal configuration. $element += array('#value' => []); $element['#payment_line_items'] = static::getLineItems($element, $form_state); $element['#element_validate'] = array(function (array &$element, FormStateInterface $form_state, array &$form) use($plugin_id) { /** @var \Drupal\Component\Plugin\PluginManagerInterface $element_info_manager */ $element_info_manager = \Drupal::service('plugin.manager.element_info'); /** @var \Drupal\payment\Element\PaymentLineItemsInput $element_plugin */ $element_plugin = $element_info_manager->createInstance($plugin_id); $element_plugin->validate($element, $form_state, $form); }); $element['#tree'] = TRUE; $element['#id'] = $this->getElementId($element, $form_state); $element['#theme_wrappers'] = array('container'); // Validate the element configuration. if ($element['#cardinality'] != self::CARDINALITY_UNLIMITED && count($element['#default_value']) > $element['#cardinality']) { throw new \InvalidArgumentException('The number of default line items can not be higher than the cardinality.'); } foreach ($element['#default_value'] as $line_item) { if (!$line_item instanceof PaymentLineItemInterface) { throw new \InvalidArgumentException('A default line item does not implement \\Drupal\\payment\\Plugin\\Payment\\LineItem\\PaymentLineItemInterface.'); } } static::initializeLineItems($element, $form_state); $line_items = static::getLineItems($element, $form_state); // Build the line items. $element['line_items'] = array('#empty' => $this->t('There are no line items yet.'), '#header' => array(array('data' => $this->t('Name'), 'class' => array(RESPONSIVE_PRIORITY_MEDIUM)), array('data' => $this->t('Type'), 'class' => array(RESPONSIVE_PRIORITY_LOW)), $this->t('Configuration'), $this->t('Weight'), $this->t('Operations')), '#tabledrag' => array(array('action' => 'order', 'relationship' => 'self', 'group' => 'payment-line-item-weight')), '#type' => 'table', '#tree' => TRUE); foreach ($line_items as $delta => $line_item) { $element['line_items'][$line_item->getName()] = array('#attributes' => array('class' => array('payment-line-item', 'payment-line-item-name-' . $line_item->getName(), 'payment-line-item-plugin-' . $line_item->getPluginId()))); $element['line_items'][$line_item->getName()]['name'] = array('#markup' => $line_item->getName()); $line_item_definition = $line_item->getPluginDefinition(); $element['line_items'][$line_item->getName()]['type'] = array('#markup' => $line_item_definition['label']); $element['line_items'][$line_item->getName()]['plugin_form'] = $line_item->buildConfigurationForm([], $form_state); $element['line_items'][$line_item->getName()]['weight'] = array('#attributes' => array('class' => array('payment-line-item-weight')), '#default_value' => $delta, '#delta' => count($line_items), '#title' => $this->t('Weight'), '#type' => 'weight'); $element['line_items'][$line_item->getName()]['delete'] = array('#ajax' => array('callback' => array(get_class($this), 'ajaxDeleteSubmit'), 'effect' => 'fade', 'event' => 'mousedown'), '#limit_validation_errors' => [], '#submit' => array(array(get_class($this), 'deleteSubmit')), '#type' => 'submit', '#value' => $this->t('Delete')); } // "Add more line items" button. $element['add_more'] = array('#access' => $element['#cardinality'] == self::CARDINALITY_UNLIMITED || count($line_items) < $element['#cardinality'], '#attributes' => array('class' => array('payment-add-more')), '#type' => 'container'); $options = []; foreach ($this->paymentLineItemManager->getDefinitions() as $line_item_plugin_id => $line_item_definition) { $options[$line_item_plugin_id] = $line_item_definition['label']; } natcasesort($options); $element['add_more']['type'] = array('#options' => $options, '#title' => $this->t('Type'), '#type' => 'select'); $element['add_more']['add'] = array('#ajax' => array('callback' => [get_class($this), 'instantiate#ajaxAddMoreSubmit#' . $plugin_id], 'effect' => 'fade', 'event' => 'mousedown', 'wrapper' => $element['#id']), '#limit_validation_errors' => array(array_merge($element['#parents'], array('add_more', 'type'))), '#submit' => array(function (array $form, FormStateInterface $form_state) use($plugin_id) { /** @var \Drupal\Component\Plugin\PluginManagerInterface $element_info_manager */ $element_info_manager = \Drupal::service('plugin.manager.element_info'); /** @var \Drupal\payment\Element\PaymentLineItemsInput $element_plugin */ $element_plugin = $element_info_manager->createInstance($plugin_id); $element_plugin->addMoreSubmit($form, $form_state); }), '#type' => 'submit', '#value' => $this->t('Add and configure a new line item')); return $element; }