contacts_events-8.x-1.x-dev/modules/teams/src/Form/TeamForm.php

modules/teams/src/Form/TeamForm.php
<?php

namespace Drupal\contacts_events_teams\Form;

use Drupal\Core\Entity\ContentEntityForm;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Routing\RouteMatchInterface;

/**
 * Form controller for Team edit forms.
 *
 * @ingroup contacts_events_teams
 */
class TeamForm extends ContentEntityForm {

  /**
   * The team entity.
   *
   * @var \Drupal\contacts_events_teams\Entity\TeamInterface
   */
  protected $entity;

  /**
   * {@inheritdoc}
   */
  public function getEntityFromRouteMatch(RouteMatchInterface $route_match, $entity_type_id) {
    /** @var \Drupal\contacts_events_teams\Entity\Team $team */
    $team = parent::getEntityFromRouteMatch($route_match, $entity_type_id);

    // Pre-populate event ID from URL.
    if ($team->isNew()) {
      $team->setEvent($route_match->getParameter('contacts_event'));
    }

    return $team;
  }

  /**
   * {@inheritdoc}
   */
  public function form(array $form, FormStateInterface $form_state) {
    $form = parent::form($form, $form_state);

    // Make event read-only.
    $event_field = $this->entity->get('event');
    $form['event'] = $event_field->view();

    // Filter the list of forms to only those that are active (plus current).
    $this->filterApplicationForms($form['form']['widget']['#options']);

    // Adjust wording of team leaders 'Add another item' button.
    $form['leaders']['widget']['add_more']['#value'] = $this->t('Add another team leader');

    // Add the event minimum value for the min age description.
    if ($min_age = $event_field->entity->getSetting('teams.min_age')) {
      $form['age_min']['widget'][0]['value']['#description'] = $this->t('@original The event minimum of %min will always apply.', [
        '@original' => $form['age_min']['widget'][0]['value']['#description'],
        '%min' => $this->formatPlural($min_age, '1 year', '@count years'),
      ]);
    }

    // Rearrange the team email fields.
    $this->overrideTeamEmailTabs($form);

    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function save(array $form, FormStateInterface $form_state) {
    $entity = $this->entity;

    $status = parent::save($form, $form_state);

    switch ($status) {
      case SAVED_NEW:
        $this->messenger()
          ->addMessage($this->t('Created the %label team for %event.', [
            '%label' => $entity->label(),
            '%event' => $entity->getEvent()->label(),
          ]));
        break;

      default:
        $this->messenger()
          ->addMessage($this->t('Saved the %label team for %event.', [
            '%label' => $entity->label(),
            '%event' => $entity->getEvent()->label(),
          ]));
    }
    $form_state->setRedirect('entity.c_events_team.collection', [
      'contacts_event' => $entity->getEvent()->id(),
    ]);
  }

  /**
   * Filters the list of enabled application forms.
   *
   * @param array $options
   *   The team form options.
   */
  private function filterApplicationForms(array &$options) {
    /** @var \Drupal\contacts_events_teams\Entity\TeamApplicationType[] $app_forms */
    $app_forms = $this->entityTypeManager
      ->getStorage('c_events_team_app_type')
      ->loadMultiple(array_keys($options));

    // Only include enabled forms plus the one that's currently set on the
    // team (if any).
    foreach ($options as $app_form_id => $label) {
      if ($app_form_id !== '_none' && $app_form_id !== $this->entity->form->target_id) {
        if (!$app_forms[$app_form_id]->status()) {
          unset($options[$app_form_id]);
        }
      }
    }
  }

  /**
   * Helper function to do all of the team email customisations.
   *
   * @param array $form
   *   The current form array.
   */
  protected function overrideTeamEmailTabs(array &$form) {
    $emails = [
      'application_request_team',
      'application_accepted',
      'application_submitted',
    ];

    // "Override team emails" option should be hidden if "disable team emails"
    // is checked.
    $form['team_email_override']['#states']['visible'] = [
      ':input[name="disable_automatic_emails[value]"]' => ['checked' => FALSE],
    ];

    foreach ($emails as $email_id) {
      // If the top-level "Override Team Emails" is unchecked, then hide the
      // specific overrides. Also hide them if "Disable automatic emails for
      // this team" is checked.
      $form[$email_id . '_enabled']['#states']['visible'] = [
        ':input[name="team_email_override[value]"]' => ['checked' => TRUE],
        // phpcs:ignore Squiz.Arrays.ArrayDeclaration.NoKeySpecified
        'and',
        ':input[name="disable_automatic_emails[value]"]' => ['checked' => FALSE],
      ];

      // For each of the override emails, ensure their body/subject are hidden
      // if the specific override is disabled.
      if (isset($form[$email_id . '_subject'])) {
        $form[$email_id . '_subject']['#states'] = $this->getEnableStates($email_id);
      }
      if (isset($form[$email_id . '_body'])) {
        $form[$email_id . '_body']['#states'] = $this->getEnableStates($email_id);

        // Add token tree.
        if ($this->moduleHandler->moduleExists('token')) {
          $form[$email_id . '_body']['tokens'] = [
            '#type' => 'container',
            '#theme' => 'token_tree_link',
            '#weight' => 20,
            '#token_types' => [
              'site',
              'contacts_ticket',
              'c_events_team',
              'contacts_event',
            ],
            '#global_types' => FALSE,
            '#states' => $this->getEnableStates($email_id),
          ];
        }

      }
      if (isset($form[$email_id . '_b_man'])) {
        $form[$email_id . '_b_man']['#states'] = $this->getEnableStates($email_id);
      }
    }
  }

  /**
   * Helper function to get the states for a team email enabled field.
   *
   * @param string $email_id
   *   The ID of the email.
   *
   * @return array
   *   A states array for the enabled value.
   */
  protected function getEnableStates(string $email_id): array {
    return [
      'invisible' => [
        [
          [':input[name="' . $email_id . '_enabled[value]"]' => ['checked' => FALSE]],
          'and',
          [':input[name="team_email_override[value]"]' => ['checked' => FALSE]],
        ],
        'or',
        [
          [':input[name="disable_automatic_emails[value]"]' => ['checked' => TRUE]],
        ],
      ],
    ];
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc