/**
  * Implements #element_validate callback for self::fieldSettingsForm().
  */
 public static function fieldSettingsFormValidate(array $element, FormStateInterface $form_state)
 {
     $add_more_button_form_parents = array_merge($element['#array_parents'], ['line_items', 'add_more', 'add']);
     // Only set the field settings as a value when it is not the "Add more"
     // button that has been clicked.
     $triggering_element = $form_state->getTriggeringElement();
     if ($triggering_element['#array_parents'] != $add_more_button_form_parents) {
         $values = $form_state->getValues();
         $values = NestedArray::getValue($values, $element['#array_parents']);
         $line_items_data = [];
         foreach (PaymentLineItemsInput::getLineItems($element['line_items'], $form_state) as $line_item) {
             $line_items_data[] = ['plugin_id' => $line_item->getPluginId(), 'plugin_configuration' => $line_item->getConfiguration()];
         }
         $value = ['currency_code' => $values['currency_code'], 'line_items_data' => $line_items_data];
         $form_state->setValueForElement($element, $value);
     }
 }
 /**
  * @covers ::validate
  */
 public function testValidate()
 {
     $line_item_name_a = $this->randomMachineName();
     $line_item_name_b = $this->randomMachineName();
     $line_item_name_c = $this->randomMachineName();
     $root_element_name = $this->randomMachineName();
     $form_build = array('foo' => array('#name' => $root_element_name, '#parents' => array('foo'), 'line_items' => []));
     $line_item_a = $this->getMock(PaymentLineItemInterface::class);
     $line_item_b = $this->getMock(PaymentLineItemInterface::class);
     $line_item_c = $this->getMock(PaymentLineItemInterface::class);
     /** @var \PHPUnit_Framework_MockObject_MockObject[] $line_items */
     $line_items = array($line_item_name_a => $line_item_a, $line_item_name_b => $line_item_b, $line_item_name_c => $line_item_c);
     foreach ($line_items as $line_item_name => $line_item) {
         $form_build['foo']['line_items'][$line_item_name] = array('plugin_form' => array('#foo' => $this->randomMachineName()));
         $line_item->expects($this->atLeastOnce())->method('getName')->willReturn($line_item_name);
         $line_item->expects($this->once())->method('validateConfigurationForm')->with($form_build['foo']['line_items'][$line_item_name]['plugin_form']);
         $line_item->expects($this->once())->method('submitConfigurationForm')->with($form_build['foo']['line_items'][$line_item_name]['plugin_form']);
     }
     $form_state = new FormState();
     $form_state->set('payment.element.payment_line_items_input.configured.' . $root_element_name, array_values($line_items));
     $form_state->setValues(array('foo' => array('line_items' => array($line_item_name_a => array('weight' => 3), $line_item_name_b => array('weight' => 1), $line_item_name_c => array('weight' => 2)))));
     $this->sut->validate($form_build['foo'], $form_state, $form_build);
     $element = $this->sut;
     $line_items = $element::getLineItems($form_build['foo'], $form_state);
     $this->assertSame(array($line_item_b, $line_item_c, $line_item_a), $line_items);
 }
 /**
  * {@inheritdoc}
  */
 public function submitForm(array &$form, FormStateInterface $form_state)
 {
     $line_items_data = [];
     /** @var \Drupal\payment\Plugin\Payment\LineItem\PaymentLineItemInterface $line_item */
     foreach (PaymentLineItemsInput::getLineItems($form['container']['line_item'], $form_state) as $line_item) {
         $line_items_data[] = array('plugin_id' => $line_item->getPluginId(), 'plugin_configuration' => $line_item->getConfiguration());
     }
     \Drupal::state()->set('payment_test_line_item_form_element', $line_items_data);
 }