acquia_commercemanager-8.x-1.122/modules/acm_customer/src/Plugin/CustomerForm/Profile.php
modules/acm_customer/src/Plugin/CustomerForm/Profile.php
<?php
namespace Drupal\acm_customer\Plugin\CustomerForm;
use Drupal\acm\Element\AcmTitleSelect;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Url;
/**
* Provides the customer profile page.
*
* @ACMCustomerForm(
* id = "profile",
* label = @Translation("Profile"),
* defaultPage = "profile",
* )
*/
class Profile extends CustomerFormBase implements CustomerFormInterface {
/**
* {@inheritdoc}
*/
public function isVisible() {
// If not using ecomm sessions, then a drupal account is created for each
// customer, so we don't need a profile page.
return $this->getConfigFactory()
->get('acm.commerce_users')
->get('use_ecomm_sessions');
}
/**
* {@inheritdoc}
*/
public function defaultConfiguration() {
return [
'weight' => 0,
] + parent::defaultConfiguration();
}
/**
* {@inheritdoc}
*/
public function buildForm(array $form, FormStateInterface $form_state, array &$complete_form, $action = NULL, $id = NULL) {
$user = $this->getCommerceUserManager()->getAccount();
// Add wrapper around the form for Backbone.js to target.
$complete_form['#prefix'] = '<div class="customer-profile-form-wrapper">';
$complete_form['#suffix'] = '</div>';
$form['user_fields'] = [
'#type' => 'container',
'#tree' => TRUE,
'#attributes' => [
'class' => [
'customer-profile',
],
],
];
$title_options = AcmTitleSelect::processAcmTitleSelect([]);
$form['user_fields']['title'] = [
'#type' => 'acm_composite',
'#field_type' => 'acm_title_select',
'#title' => $this->t('Title'),
'#empty_option' => $this->t('Select'),
'#default_value' => $user->getTitle(),
'#display_value' => $title_options['#options'][$user->getTitle()],
];
$form['user_fields']['firstname'] = [
'#type' => 'acm_composite',
'#field_type' => 'textfield',
'#title' => $this->t('First name'),
'#default_value' => $user->getFirstname(),
];
$form['user_fields']['lastname'] = [
'#type' => 'acm_composite',
'#field_type' => 'textfield',
'#title' => $this->t('Last name'),
'#default_value' => $user->getLastname(),
];
$form['user_fields']['dob'] = [
'#type' => 'acm_composite',
'#field_type' => 'date',
'#title' => $this->t('Birthdate'),
'#default_value' => empty($user->getDateOfBirth()) ? NULL : date('Y-m-d', strtotime($user->getDateOfBirth())),
'#display_value' => empty($user->getDateOfBirth()) ? NULL : date('m/d/Y', strtotime($user->getDateOfBirth())),
];
$form['user_fields']['email'] = [
'#type' => 'acm_composite',
'#field_type' => 'acm_email_update',
'#title' => $this->t('Email'),
'#default_value' => $user->getEmail(),
'#validate' => ['::validateEmail'],
];
$form['user_fields']['password'] = [
'#type' => 'acm_composite',
'#field_type' => 'acm_password_update',
'#title' => $this->t('Password'),
'#display_value' => $this->t('**********'),
];
// Remove all fields except the requested.
foreach ($form['user_fields'] as $field_name => &$field) {
if (!isset($field['#field_type'])) {
continue;
}
// The form is in view mode, or the current field does no match the one
// that we want to edit.
if ($action == 'view' || $field_name != $id) {
$this->addEditButton($field, $field_name);
$field['#form_mode'] = FALSE;
// Make sure field is no longer required.
$field['#required'] = FALSE;
continue;
}
if ($field_name == 'password') {
$field['#title_display'] = 'hidden';
}
// Remove the display value so the form element shows, and add a save
// and cancel button.
$this->addSaveButtons($field, $field_name);
}
return $form;
}
/**
* Adds an edit button to a form field.
*
* @param array $field
* The form field.
* @param string $field_name
* The name of the form field.
*/
public function addEditButton(array &$field, $field_name) {
$field['#buttons']['edit'] = [
'#type' => 'link',
'#title' => $this->t('Edit'),
'#url' => Url::fromRoute('acm_customer.view_page', [
'page' => $this->getPageId(),
'action' => 'edit',
'id' => $field_name,
]),
'#attributes' => [
'class' => [
'form-item__edit-button',
],
],
];
}
/**
* Adds a save and cancel button to a form field.
*
* @param array $field
* The form field.
* @param string $field_name
* The name of the form field.
*/
public function addSaveButtons(array &$field, $field_name) {
$field['#display_value'] = FALSE;
$field['#buttons']['cancel'] = [
'#type' => 'link',
'#title' => $this->t('Cancel'),
'#url' => Url::fromRoute('acm_customer.view_page', [
'page' => $this->getPageId(),
]),
'#attributes' => [
'class' => [
'form-item__cancel-button',
],
],
];
$field['#buttons']['save'] = [
'#type' => 'submit',
'#value' => $this->t('Save'),
'#submit' => ['::submitForm'],
'#attributes' => [
'class' => [
'form-item__save-button',
],
],
];
}
/**
* {@inheritdoc}
*/
public function validateForm(array &$form, FormStateInterface $form_state, array &$complete_form) {
$profile = $form_state->getValue('profile');
$username = $profile['user_fields']['email'];
$pass_old = $profile['user_fields']['password']['password_old'];
$customer_auth = \Drupal::service('acm.auth');
$token = $customer_auth->authenticate($username, $pass_old);
if (empty($token)) {
$form_state->setError($form['user_fields']['password'], t('The Old Password you entered is incorrect. Please re-enter the password.'));
}
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state, array &$complete_form) {
$values = $form_state->getValues($form['#parents']);
$field_values = $values['profile']['user_fields'];
foreach ($field_values as $field_name => $field) {
if (empty($field)) {
unset($field_values[$field_name]);
}
// Flatten password values.
// @todo: Need to verify password was set properly.
if ($field_name == 'password') {
if (!empty($field['password']) && !empty($field['password_old'])) {
$field_values['password'] = $field['password'];
$field_values['password_old'] = $field['password_old'];
}
else {
unset($field_values['password']);
}
}
}
// The email field will come through as an array with the email and
// password. We need to flatten it.
if (isset($field_values['email']) && is_array($field_values['email'])) {
$field_values['password'] = $field_values['email']['password'];
$field_values['email'] = $field_values['email']['email'];
}
$this->getCommerceUserManager()->updateAccount($field_values);
}
}
