acquia_commercemanager-8.x-1.122/modules/acm_customer/src/Plugin/CustomerForm/Addresses.php

modules/acm_customer/src/Plugin/CustomerForm/Addresses.php
<?php

namespace Drupal\acm_customer\Plugin\CustomerForm;

use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Link;
use Drupal\Core\Url;

/**
 * Provides the customer profile page.
 *
 * @ACMCustomerForm(
 *   id = "addresses",
 *   label = @Translation("Addresses"),
 *   defaultPage = "addresses",
 * )
 */
class Addresses extends CustomerFormBase implements CustomerFormInterface {

  /**
   * {@inheritdoc}
   */
  public function defaultConfiguration() {
    return [
      'weight' => 0,
    ] + parent::defaultConfiguration();
  }

  /**
   * Builds a summary of addresses.
   *
   * @param array $addresses
   *   The addresses to build a summary for.
   * @param bool $show_add
   *   TRUE to show an add address button, FALSE to not show it.
   *
   * @return array
   *   An render array.
   */
  public function buildSummary(array $addresses = [], $show_add = TRUE) {
    $build = [];

    // Display an "Add Address" button.
    if ($show_add) {
      $build['add_address'] = [
        '#type' => 'acm_composite',
        '#field_type' => 'acm_address',
        '#default_value' => empty($addresses) ? $this->t('You have no saved addresses.') : '',
        '#form_mode' => FALSE,
        '#buttons' => [
          'add' => [
            '#type' => 'link',
            '#title' => $this->t('Add address'),
            '#url' => Url::fromRoute('acm_customer.view_page', [
              'page' => $this->getPageId(),
              'action' => 'add',
            ]),
            '#attributes' => [
              'class' => [
                'form-item__add-button',
              ],
            ],
          ],
        ],
      ];
    }

    // Build the summary for each user address.
    foreach ($addresses as $address) {
      if ($address['default_billing'] && $address['default_shipping']) {
        $address['heading'] = $this->t('Default Billing and Shipping Address');
      }
      elseif ($address['default_billing']) {
        $address['heading'] = $this->t('Default Billing Address');
      }
      elseif ($address['default_shipping']) {
        $address['heading'] = $this->t('Default Shipping Address');
      }
      else {
        $address['heading'] = '';
      }

      // Build a link for each action.
      $actions = [
        'edit' => [
          'label' => t('Edit'),
        ],
        'delete' => [
          'label' => t('Delete'),
          'options' => [
            'attributes' => [
              'class' => ['bypass-js'],
            ],
          ],
        ],
      ];

      $links = [];

      foreach ($actions as $action => $config) {
        $options = isset($config['options']) ? $config['options'] : [];
        $label = isset($config['label']) ? $config['label'] : $action;
        $link = Link::fromTextAndUrl($label, Url::fromRoute('acm_customer.view_page', [
          'page' => $this->getPageId(),
          'action' => $action,
          'id' => $address['address_id'],
        ], $options));

        $link = $link->toRenderable();
        $links[$action] = [
          '#type' => 'container',
          '#attributes' => [
            'class' => ["customer-address__{$action}-button"],
          ],
          'link' => $link,
        ];
      }

      $build[] = [
        '#theme' => 'user_address',
        '#address' => $address,
        '#links' => $links,
      ];
    }

    return $build;
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state, array &$complete_form, $action = NULL, $id = NULL) {
    /** @var \Drupal\acm\Connector\APIWrapperInterface $api_wrapper */
    $api_wrapper = $this->getApiWrapper();
    /** @var \Drupal\acm\User\AccountProxyInterface $commerce_user_manager */
    $commerce_user_manager = $this->getCommerceUserManager();
    /** @var \Drupal\acm\User\CommerceAccountInterface $user */
    $user = $commerce_user_manager->getAccount();

    $addresses = $user->getAddresses();

    // Add wrapper around the form for Backbone.js to target.
    $complete_form['#prefix'] = '<div class="customer-addresses-form-wrapper">';
    $complete_form['#suffix'] = '</div>';

    $form['#attributes']['class'][] = 'customer-addresses';

    if ($action == 'delete' && isset($id)) {
      try {
        $customer_id = $user->id();
        // Delete the address.
        $api_wrapper->deleteCustomerAddress($customer_id, $id);
        // Load the updated user and set the account in the manager. This is
        // required since the user info is cached.
        $customer = $api_wrapper->getCustomer($customer_id);
        $commerce_user_manager->setAccount($customer);
      }
      catch (\Exception $e) {
      }

      $this->customerPagesManager->redirectToPage($this->getPageId());
      return $form;
    }

    if ($action == 'view') {
      $form['addresses'] = $this->buildSummary($addresses);
      return $form;
    }

    if ($action == 'add') {
      $this->buildAddressFields($form, $complete_form);
      return $form;
    }

    foreach ($addresses as $delta => $address) {
      if (isset($id) && $id != $address['address_id']) {
        $form[$delta] = $this->buildSummary([$address], FALSE);
        continue;
      }

      $this->buildAddressFields($form, $complete_form, $address);
    }

    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function validateForm(array &$form, FormStateInterface $form_state, array &$complete_form) {
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state, array &$complete_form) {
    $user = $this->getCommerceUserManager()->getAccount();
    $addresses = $user->getAddresses();
    $values = $form_state->getValues($form['#parents']);
    $address_values = $values['addresses']['address_wrapper']['address'];

    // Updating old address.
    foreach ($addresses as &$address) {
      if ($address['address_id'] != $address_values['address_id']) {
        unset($address);
      }

      // Update the stored address with the new values.
      foreach ($address_values as $key => $value) {
        $address[$key] = $value;
      }
    }

    // Adding new address.
    if (empty($address_values['address_id'])) {
      $addresses[] = $address_values;
    }

    $this->getCommerceUserManager()->updateAccount(['addresses' => $addresses]);
  }

  /**
   * Builds the address fields.
   *
   * @param array $form
   *   The form.
   * @param array $complete_form
   *   The complete form structure.
   * @param array $address
   *   The default address values.
   */
  protected function buildAddressFields(array &$form, array &$complete_form, array $address = []) {
    $form['address_wrapper'] = [
      '#type' => 'container',
      '#attributes' => [
        'id' => ['address_wrapper'],
        'class' => ['customer-address-form'],
      ],
    ];

    $checkout_config = \Drupal::config('acm_checkout.settings');
    $validate_saved_address = $checkout_config->get('validate_saved_address');
    $address_review_text = $checkout_config->get('saved_address_review_text');
    $address_failed_text = $checkout_config->get('saved_address_failed_text');

    $include_address_id = empty($address) ? FALSE : TRUE;
    $form['address_wrapper']['address'] = [
      '#type' => 'acm_address',
      '#default_value' => $address,
      '#display_title' => TRUE,
      '#display_firstname' => TRUE,
      '#display_lastname' => TRUE,
      '#display_billing' => TRUE,
      '#display_shipping' => TRUE,
      '#include_address_id' => $include_address_id,
      '#validate_address' => $validate_saved_address,
      '#address_review_text' => $address_review_text,
      '#address_failed_text' => $address_failed_text,
    ];

    $form['address_wrapper']['actions'] = [
      '#type' => 'actions',
    ];

    $form['address_wrapper']['actions']['cancel'] = [
      '#type' => 'link',
      '#title' => $this->t('Cancel'),
      '#url' => Url::fromRoute('acm_customer.view_page', [
        'page' => $this->getPageId(),
      ]),
    ];

    $form['address_wrapper']['actions']['save'] = [
      '#type' => 'submit',
      '#value' => $this->t('Save'),
    ];

    // Remove parent actions.
    unset($complete_form['actions']);
  }

}

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

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