Exemplo n.º 1
0
 /**
  * {@inheritdoc}
  */
 public function form(array $form, FormStateInterface $form_state)
 {
     /** @var \Drupal\address\Entity\ZoneInterface $zone */
     $zone = $this->entity;
     $user_input = $form_state->getUserInput();
     $form['#tree'] = TRUE;
     $form['name'] = ['#type' => 'textfield', '#title' => $this->t('Name'), '#default_value' => $zone->getName(), '#maxlength' => 255, '#required' => TRUE];
     $form['id'] = ['#type' => 'machine_name', '#title' => $this->t('Machine name'), '#default_value' => $zone->getId(), '#machine_name' => ['exists' => '\\Drupal\\address\\Entity\\Zone::load', 'source' => ['name']], '#maxlength' => 255, '#required' => TRUE];
     $form['scope'] = ['#type' => 'textfield', '#title' => $this->t('Scope'), '#description' => $this->t('Used to group zones by purpose. Examples: tax, shipping.'), '#default_value' => $zone->getScope(), '#maxlength' => 255];
     $form['priority'] = ['#type' => 'weight', '#title' => $this->t('Priority'), '#description' => $this->t('Zones with a higher priority will be matched first.'), '#default_value' => (int) $zone->getPriority(), '#delta' => 10];
     $wrapper_id = Html::getUniqueId('zone-members-ajax-wrapper');
     $form['members'] = ['#type' => 'table', '#header' => [$this->t('Type'), $this->t('Zone member'), $this->t('Weight'), $this->t('Operations')], '#tabledrag' => [['action' => 'order', 'relationship' => 'sibling', 'group' => 'zone-member-order-weight']], '#weight' => 5, '#prefix' => '<div id="' . $wrapper_id . '">', '#suffix' => '</div>'];
     $index = 0;
     /** @var \Drupal\address\Plugin\ZoneMember\ZoneMemberInterface $member */
     foreach ($zone->getMembers() as $key => $member) {
         $member_form =& $form['members'][$index];
         $member_form['#attributes']['class'][] = 'draggable';
         $member_form['#weight'] = isset($user_input['members'][$index]) ? $user_input['members'][$index]['weight'] : $member->getWeight();
         $member_form['type'] = ['#type' => 'markup', '#markup' => $member->getPluginDefinition()['name']];
         $member_parents = ['members', $index, 'form'];
         $member_form_state = $this->buildMemberFormState($member_parents, $form_state);
         $member_form['form'] = $member->buildConfigurationForm([], $member_form_state);
         $member_form['form']['#element_validate'] = ['::memberFormValidate'];
         $member_form['weight'] = ['#type' => 'weight', '#title' => $this->t('Weight for @title', ['@title' => $member->getName()]), '#title_display' => 'invisible', '#default_value' => $member->getWeight(), '#attributes' => ['class' => ['zone-member-order-weight']]];
         $member_form['remove'] = ['#type' => 'submit', '#name' => 'remove_member' . $index, '#value' => $this->t('Remove'), '#limit_validation_errors' => [], '#submit' => ['::removeMemberSubmit'], '#member_index' => $index, '#ajax' => ['callback' => '::membersAjax', 'wrapper' => $wrapper_id]];
         $index++;
     }
     // Sort the members by weight. Ensures weight is preserved on ajax refresh.
     uasort($form['members'], ['\\Drupal\\Component\\Utility\\SortArray', 'sortByWeightProperty']);
     $plugins = [];
     foreach ($this->memberManager->getDefinitions() as $plugin => $definition) {
         $plugins[$plugin] = $definition['name'];
     }
     $form['members']['_new'] = ['#tree' => FALSE];
     $form['members']['_new']['type'] = ['#prefix' => '<div class="zone-member-new">', '#suffix' => '</div>'];
     $form['members']['_new']['type']['plugin'] = ['#type' => 'select', '#title' => $this->t('Zone member type'), '#title_display' => 'invisible', '#options' => $plugins, '#empty_value' => ''];
     $form['members']['_new']['type']['add_member'] = ['#type' => 'submit', '#value' => $this->t('Add'), '#validate' => ['::addMemberValidate'], '#submit' => ['::addMemberSubmit'], '#limit_validation_errors' => [['plugin']], '#ajax' => ['callback' => '::membersAjax', 'wrapper' => $wrapper_id]];
     $form['members']['_new']['member'] = ['data' => []];
     $form['members']['_new']['operations'] = ['data' => []];
     return parent::form($form, $form_state);
 }