mailjet-8.x-2.7/modules/mailjet_subscription/src/Form/SubscriptionSignupPageForm.php

modules/mailjet_subscription/src/Form/SubscriptionSignupPageForm.php
<?php

namespace Drupal\mailjet_subscription\Form;

use Drupal\Core\Datetime\DrupalDateTime;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\mailjet\MailjetApi;
use Mailjet\Resources;
use Symfony\Component\HttpFoundation\RedirectResponse;

/**
 * Subscribe to a Mailjet list.
 */
class SubscriptionSignupPageForm extends FormBase
{
  /**
   * The ID for this form.
   * Set as class property so it can be overwritten as needed.
   *
   * @var string
   */
    private $formId = 'mailjet_signup_page_form';

  /**
   * The Mailjet Signup entity used to build this form.
   *
   * @var MailjetSignup
   */
    private $signup = NULL;

  /**
   * {@inheritdoc}
   */
    public function getFormID()
    {
        return $this->formId;
    }

    public function setFormID($formId)
    {
        $this->formId = $formId;
    }

    public function setSignupID($entity_Id)
    {
        $this->entity_id = $entity_Id;
    }

  /**
   * {@inheritdoc}
   */
    protected function getEditableConfigNames()
    {
        return ['mailjet_signup.page_form'];
    }

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

        $mailjetApiClient = mailjet_new();
        $entity = mailjet_subscription_load($this->entity_id);

        $list_id = $entity->lists;
        $user = \Drupal::currentUser();
        $is_un_subs = 0;

        $filters = [
        'ContactEmail' => $user->getEmail(),
        'ContactsList' => $list_id,
        ];

        $result = $mailjetApiClient->get(Resources::$Listrecipient, ['filters' => $filters]);
        if ($result->success() && $result->getCount() > 0) {
            $data = $result->getData();
            if (isset($data[0]['IsUnsubscribed'])) {
                $is_un_subs = (TRUE == $data[0]['IsUnsubscribed'] ? 0 : 1);
            }
        }

        if ($user->id() == 0 || ($user->id() !== 0 && $is_un_subs !== 1)) {
            $form['signup_id_form'] = [
            '#type' => 'hidden',
            '#value' => $this->entity_id,
            ];

            if (!empty($entity->description)) {
                $form['description'] = [
                '#markup' => t($entity->description),
                ];
            }

            $form['signup-email'] = [
            '#type' => 'textfield',
            '#title' => $entity->email_label,
            '#description' => 'Please enter your email address.',
            '#default_value' => '',
            '#required' => TRUE,
            '#attributes' => ['placeholder' => t('your@email.com')],
            ];

            $fields = [];
            $labels_fields = [];
            $fields_mailjet2 = [];
            $sort_config = explode(',', $entity->sort_fields);
            $fields_mailjet = explode(',', $entity->fields_mailjet);
            $labels = explode(',', $entity->labels_fields);

            $counter = 0;

            foreach ($fields_mailjet as $field) {
                $labels_fields[$field] = $labels[$counter];
                $counter++;
            }

            $counter = 0;
            foreach ($fields_mailjet as $field) {
                $fields_mailjet2[$field] = $fields_mailjet[$counter];
                $counter++;
            }

            $field_counter = 0;
            if (!(empty($sort_config[0]))) {
                foreach ($sort_config as $sort_field) {
                    if (in_array(trim($sort_field), $fields_mailjet2) != FALSE) {
                        $fields[$field_counter] = trim($sort_field);
                    }

                    $field_counter++;
                }

                $field_counter = 100;
                foreach ($fields_mailjet2 as $field) {
                    if (!in_array(trim($field), $fields) != FALSE) {
                        $fields[$field_counter] = trim($field);
                    }

                    $field_counter++;
                }
            } else {
                $fields = $fields_mailjet;
            }

            if (!(empty($fields_mailjet[0]))) {
              foreach ($fields as $field) {
                $type = 'textfield';
                $description_field = '';
                $required = TRUE;
                switch ((mailjet_get_propertiy_type($field))) {
                  case 'int':
                  case 'float':
                    $type = 'number';
                    $extra_attributes = [
                      '#min' => 0,
                      '#step' => 'any',
                    ];
                    break;

                  case 'str':
                    $description_field = t('Correct field format - text. Ex: First Name');
                    break;

                  case 'datetime':
                    $type = 'datetime';
                    $description_field = t('Correct field format - date. Ex: 26-02-2010');
                    break;

                  case 'bool':
                    $type = 'checkbox';
                    $required = FALSE;
                    break;
                }

                $form['signup-' . $field] = [
                    '#type' => $type,
                    '#title' => "" . $labels_fields[$field],
                    '#description' => $description_field,
                    '#required' => $required,
                  ] + ($extra_attributes ?? []);
              }
            }

            $form['actions'] = ['#type' => 'actions'];
            $form['actions']['submit'] = [
            '#type' => 'submit',
            '#value' => $entity->sumbit_label,
            ];
        } else {
            $form['signup_id_form'] = [
            '#type' => 'hidden',
            '#value' => $this->entity_id,
            ];

            $form['unsubscribe_id'] = [
            '#type' => 'hidden',
            '#value' => 1,
            ];

            $form['actions'] = ['#type' => 'actions'];
            $form['actions']['unsubscribe'] = [
            '#type' => 'submit',
            '#weight' => 100000,
            '#value' => t('Unsubscribe'),
            ];
        }

        if (!empty($entity->js_field)) {
            $form['#attached']['html_head'][] = [
            [
            '#type' => 'html_tag',
            '#tag' => 'script',
            '#value' => htmlspecialchars_decode($entity->js_field),
            ],
            'mailjet_js',
            ];
        }

        if (!empty($entity->css_field)) {
            $form['#attached']['html_head'][] = [
            [
            '#type' => 'html_tag',
            '#tag' => 'style',
            '#value' => htmlspecialchars_decode($entity->css_field),
            ],
            'mailjet_css',
            ];
        }
        return $form;
    }

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

        $form_values = $form_state->getValues();
      /**
       * @var \stdClass $signup_form
       */
        $signup_form = mailjet_subscription_load($this->entity_id);

        if (!isset($form_values['unsubscribe_id']) && empty($form_values['unsubscribe_id'])) {
            if (!\Drupal::service('email.validator')->isValid($form_values['signup-email'])) {
                $form_state->setErrorByName('signup-email', t('Please enter a valid email address!'));
            }

            $labels_fields = explode(',', $signup_form->labels_fields);
            $fields = explode(',', $signup_form->fields_mailjet);
            $counter = 0;

            if (!(empty($fields[0]))) {
                foreach ($fields as $field) {
                    $field_value = $form_values['signup-' . $field];
                    $field_name = $field;
                    $missmatch_values = !empty($entity->error_data_types) ? $entity->error_data_types : 'Incorrect data values. Please enter correct data type in %id';

                    $missmatch_values = str_replace("%id", $labels_fields[$counter], $missmatch_values);

                  switch (mailjet_get_propertiy_type($field_name)) {
                    case 'str':
                      if (!(is_string($field_value)) && !empty($field_value)) {
                        $form_state->setErrorByName('signup-' . $field, $missmatch_values);
                      }
                      break;

                    case 'bool':
                      if ($field_value) {
                        $form_state->setValue('signup-' . $field, TRUE);
                      }
                      else {
                        $form_state->setValue('signup-' . $field, FALSE);
                      }
                      break;
                  }

                  $counter++;
                }
            }
        }
    }

    private function manageFields($mailjetApiClient, $entity, $form_values, $contact_id)
    {
        $data = [];
        $fields = explode(',', $entity->fields_mailjet);

      // Collect data from filled fields
        if (!(empty($fields[0]))) {
            foreach ($fields as $field) {
              if (!empty($field) && !empty($form_values['signup-' . $field])) {
                $data_value = $form_values['signup-' . $field];

                $data[] = [
                  'Name' => $field,
                  'Value' => $data_value,
                ];
              }
            }
        }

        if (empty($data)) {
          // There is no contact data
            return TRUE;
        }

        $body = [
        'ContactID' => $contact_id,
        'Data' => $data
        ];

        $response = $mailjetApiClient->put(Resources::$Contactdata, ['id' => $contact_id, 'body' => $body]);
        if (!$response->success()) {
            $start = '[{ "';
            $end = '" :';
            $ini = strpos($response->getErrorMessage(), $start);
            $ini += strlen($start);
            $len = strpos($response->getErrorMessage(), $end, $ini) - $ini;
            $filed_prop_name = trim(substr($response->getErrorMessage(), $ini, $len));
            $missmatch_values = !empty($entity->error_data_types) ? $entity->error_data_types : 'Incorrect data values. Please enter correct data type in %id';
            $missmatch_values = str_replace("%id", $filed_prop_name, $missmatch_values);

            switch (mailjet_get_propertiy_type($filed_prop_name)) {
                case 'int':
                    \Drupal::messenger()->addMessage($missmatch_values, 'error');
                    break;

                case 'str':
                    \Drupal::messenger()->addMessage($missmatch_values, 'error');
                    break;

                case 'datetime':
                    \Drupal::messenger()->addMessage($missmatch_values, 'error');
                    break;

                case 'bool':
                    \Drupal::messenger()->addMessage($missmatch_values, 'error');
                    break;
            }
            return FALSE;
        }
        return TRUE;
    }

  /**
   * {@inheritdoc}
   */
    public function submitForm(array &$form, FormStateInterface $form_state)
    {
        global $base_url;
        $form_values = $form_state->getValues();
        $entity = mailjet_subscription_load($form_values['signup_id_form']);
        $email_text_button = !empty($entity->email_text_button) ? $entity->email_text_button : t('Click here to confirm');
        $email_text_description = !empty($entity->email_text_description) ? $entity->email_text_description : t('You may copy/paste this link into your browser:');
        $email_text_thank_you = !empty($entity->email_text_thank_you) ? $entity->email_text_thank_you : t('Thanks,');
        $owner = !empty($entity->email_owner) ? $entity->email_owner : t('Mailjet');
        $email_footer_text = !empty($entity->email_footer_text) ? $entity->email_footer_text : t('Did not ask to subscribe to this list? Or maybe you have changed your mind? Then simply ignore this email and you will not be subscribed');
        $email = $form_values['signup-email'];
        $heading_text = !empty($entity->confirmation_email_text) ? $entity->confirmation_email_text : t('Please confirm your subscription to');

        $list_id = $entity->lists;

        $properties = $this->fetchPropertiesOnWidgetSubscribe($form_state);

        $user = \Drupal::currentUser();
        $mailjetApiClient = mailjet_new();
  //    $check_complate = FALSE;

      //Unsubscribe
        if (!empty($form_values['unsubscribe_id'])) {
    //      $url = 'http://api.mailjet.com/v3/REST/user/' . $user->getEmail();
    //      $result = $mailjetApiClient->generalRequest(FALSE, [], 'GET', $url);
    //      $result_arr = json_decode($result);
    //      $user_id = $result_arr->Data[0]->ID;

            $responseContactList = MailjetApi::syncMailjetContact($list_id, ['Email' => $user->getEmail()], 'unsub');

    //echo $list_id;
    //echo "<pre>";
    //var_dump($response);
    //exit;
            if (FALSE != $responseContactList) {
                \Drupal::logger('mailjet_messages')
                ->error(t('The contact was unsubscribed from list #' . $list_id . '.'));
                \Drupal::messenger()->addMessage(t('The contact was unsubscribed successfully!'));
                $response = new RedirectResponse($base_url);
                $response->send();
                return;
            } else {
                \Drupal::logger('mailjet_messages')
                ->error(t('The contact was not unsubscribed from list #' . $list_id . '.'));
                \Drupal::messenger()->addMessage(t('Error'), 'error');
            }
            return;
        }

        $user_exists = mailjet_find_conctact($email, $list_id);

      // The user exists in the given list
        if ($user_exists) {
            $message = str_replace('%', $email, $entity->contact_exist);
            \Drupal::messenger()->addMessage($message, 'error');
            return;
        }

        $langcode = \Drupal::currentUser()->getPreferredLangcode();

        $query_string = http_build_query([
        'sec_code' => base64_encode($email),
        'list' => $list_id,
        'properties' => base64_encode(json_encode($properties, TRUE)),
        'others' => $form_values['signup_id_form'],
        ]);
        $subscribe_url = $base_url . '/confirmation-subscribe?' . $query_string;
        $mailManager = \Drupal::service('plugin.manager.mail');
        $module = 'mailjet';
        $key = 'activation_mail';
        $to = $email;
        $params['message'] = prepare_mail_template($heading_text, $email_text_button, $email_text_description, $email_text_thank_you, $owner, $subscribe_url, $email_footer_text);
        if ($mailManager->mail($module, $key, $to, $langcode, $params, NULL, TRUE)) {
            $confirmation_message = str_replace("%", $email, $entity->confirmation_message);
            if (!empty($entity->confirmation_message)) {
                \Drupal::messenger()->addMessage(t($confirmation_message), 'status');
            } else {
                \Drupal::messenger()->addMessage(t('Subscription confirmation email was sent to ' . $email . '. Please check your inbox and confirm the subscription.'));
            }
        }

      //redicrect or redicrect and display success message after all process
        if (!empty($entity->destination_page)) {
          //redirect or redirect and display success message
            $subscribe_url = $entity->destination_page;

            $response = new RedirectResponse($subscribe_url);
            $response->send();
            return;
        }
    }

  private function fetchPropertiesOnWidgetSubscribe(FormStateInterface $form_state) {
    $form_values = $form_state->getValues();
    $properties = [];
    // We loop all form values to find contact properties.
    foreach ($form_values as $key => $value) {
      if ($key != 'signup-email' && stristr($key, 'signup-')) {
        if ($value instanceof DrupalDateTime) {
          $value = $value->format(\DateTimeInterface::RFC3339);
        }
        $properties[$key] = $value;
      }
    }
    return $properties;
  }

}

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

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