contacts_subscriptions-1.x-dev/src/Form/SubscriptionForm.php

src/Form/SubscriptionForm.php
<?php

namespace Drupal\contacts_subscriptions\Form;

use Drupal\Component\Utility\UrlHelper;
use Drupal\Core\Entity\ContentEntityForm;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\Core\Url;

/**
 * Form controller for the subscriptions entity edit forms.
 */
class SubscriptionForm extends ContentEntityForm {

  /**
   * {@inheritdoc}
   */
  protected function prepareEntity() {
    parent::prepareEntity();

    // Clear the default value on the subscription user.
    if ($this->entity->isNew()) {
      $this->entity->set('uid', NULL);
    }
  }

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

    // Price must be specified if end date is provided.
    if (isset($form['price_override']) && isset($form['price_override_date'])) {
      $form['price_override_date']['#states'] = [
        'visible' => [
          ':input[name="price_override[0][value]"]' => ['filled' => TRUE],
        ],
      ];
    }

    // A Renewal Date is required for all active subscriptions, so ensure the
    // field appears when a subscription is set to active.
    if (isset($form['renewal']) && isset($form['status'])) {
      if (!empty($form['renewal']['widget'][0]['has_value'])) {
        $form['renewal']['widget'][0]['has_value']['#states'] = [
          'checked' => [
            'select#edit-status' => ['value' => 'active'],
          ],
        ];
      }
    }

    // Always create a new revision.
    if (!$this->entity->isNew()) {
      $form['revision']['#default_value'] = TRUE;
      $form['revision']['#disabled'] = TRUE;

      if (isset($form['uid'])) {
        $form['uid']['widget']['#disabled'] = TRUE;
      }
    }
    else {

      // Allow the URL to select the user a subscription should be linked to for
      // new subscriptions.
      if ($uid = $this->getRequest()->query->get('uid')) {
        /** @var \Drupal\decoupled_auth\Entity\DecoupledAuthUser $account */
        if ($account = $this->entityTypeManager->getStorage('user')->load($uid)) {
          if ($account->hasRole('crm_indiv')) {
            $form['uid']['widget'][0]['target_id']['#default_value'] = $account;
          }
        }
      }
    }

    return $form;
  }

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

    // Prepare cancel link.
    $query = $this->getRequest()->query;
    $url = NULL;
    // If a destination is specified, that serves as the cancel link.
    if ($query->has('destination')) {
      $options = UrlHelper::parse($query->get('destination'));
      try {
        $url = Url::fromUserInput('/' . ltrim($options['path'], '/'), $options);
      }
      catch (\InvalidArgumentException $e) {
        // Suppress the exception and fall back to the form's cancel url.
      }
    }

    $actions['cancel'] = [
      '#type' => 'link',
      '#title' => $this->t('Cancel'),
      '#attributes' => ['class' => ['button']],
      '#url' => $url ?? Url::fromRoute('entity.contacts_subscription.collection'),
      '#cache' => [
        'contexts' => [
          'url.query_args:destination',
        ],
      ],
    ];

    return $actions;
  }

  /**
   * {@inheritdoc}
   */
  public function validateForm(array &$form, FormStateInterface $form_state) {
    /** @var \Drupal\contacts_subscriptions\Entity\SubscriptionInterface $subscription */
    $subscription = parent::validateForm($form, $form_state);

    if (isset($form['price_override']) && isset($form['price_override_date'])) {
      $has_price = !$subscription->get('price_override')->isEmpty();
      $has_end_date = !$subscription->get('price_override_date')->isEmpty();
      if ($has_end_date && !$has_price) {
        $form_state->setError(
          $form['price_override']['widget'],
          new TranslatableMarkup('A price override must be set if an end date is specified.')
        );
      }
    }

    // @todo Move these to constraints.
    $status = $subscription->getStatusId();
    if ($status === 'active') {
      if (!$subscription->getRenewalDate(FALSE)) {
        $form_state->setError(
          $form['renewal']['widget'],
          new TranslatableMarkup('A renewal must be set for an active membership.')
        );
      }
    }
    if ($status !== 'none') {
      if (!$subscription->getProductId(FALSE)) {
        $form_state->setError(
          $form['product']['widget'],
          new TranslatableMarkup('A product must be set for a membership and cannot be cleared.')
        );
      }
    }

    if (isset($form['price_override'])) {

      return $subscription;
    }
  }

  /**
   * {@inheritdoc}
   */
  public function save(array $form, FormStateInterface $form_state) {
    $entity = $this->getEntity();
    $result = $entity->save();
    $link = $entity->toLink($this->t('View'))->toRenderable();

    $message_arguments = ['%label' => $this->entity->label()];
    $logger_arguments = $message_arguments + ['link' => render($link)];

    if ($result == SAVED_NEW) {
      $this->messenger()->addStatus($this->t('New membership %label has been created.', $message_arguments));
      $this->logger('contacts_subscriptions')->notice('Created new subscription %label', $logger_arguments);
    }
    else {
      $this->messenger()->addStatus($this->t('The membership %label has been updated.', $message_arguments));
      $this->logger('contacts_subscriptions')->notice('Updated new membership %label.', $logger_arguments);
    }

    $form_state->setRedirect('entity.contacts_subscription.canonical', ['contacts_subscription' => $entity->id()]);
  }

}

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

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