Browse Source

deactivated vuejs for simplenews pages = fixed unsubscribe bug

bach 2 years ago
parent
commit
2b48c867ea

+ 1 - 0
composer.json

@@ -139,6 +139,7 @@
         "drupal/restui": "^1.16",
         "drupal/role_delegation": "^1.1",
         "drupal/role_expire": "^2.0",
+        "drupal/rules": "3.x-dev@dev",
         "drupal/search_api": "^1.19",
         "drupal/search_api_autocomplete": "^1.2",
         "drupal/search_api_page": "^1.x-dev",

+ 58 - 1
composer.lock

@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "28c5d047d6b22eec98aba7c5c09e2978",
+    "content-hash": "1b136647bf70d7d1c350f23bced3287a",
     "packages": [
         {
             "name": "alchemy/zippy",
@@ -12236,6 +12236,62 @@
                 "source": "https://git.drupalcode.org/project/role_expire"
             }
         },
+        {
+            "name": "drupal/rules",
+            "version": "dev-3.x",
+            "source": {
+                "type": "git",
+                "url": "https://git.drupalcode.org/project/rules.git",
+                "reference": "ec0b4dbc1fb9a0b59cac43908f1af5137e946dea"
+            },
+            "require": {
+                "drupal/core": "^9.1 || ^10",
+                "drupal/typed_data": "^1.0"
+            },
+            "type": "drupal-module",
+            "extra": {
+                "branch-alias": {
+                    "dev-3.x": "3.x-dev"
+                },
+                "drupal": {
+                    "version": "8.x-3.x-dev",
+                    "datestamp": "1645514637",
+                    "security-coverage": {
+                        "status": "not-covered",
+                        "message": "Dev releases are not covered by Drupal security advisories."
+                    }
+                },
+                "drush": {
+                    "services": {
+                        "drush.services.yml": "^9 || ^10"
+                    }
+                }
+            },
+            "notification-url": "https://packages.drupal.org/8/downloads",
+            "license": [
+                "GPL-2.0-or-later"
+            ],
+            "authors": [
+                {
+                    "name": "TR",
+                    "homepage": "https://www.drupal.org/user/202830"
+                },
+                {
+                    "name": "fago",
+                    "homepage": "https://www.drupal.org/user/16747"
+                },
+                {
+                    "name": "klausi",
+                    "homepage": "https://www.drupal.org/user/262198"
+                }
+            ],
+            "description": "React on events and conditionally evaluate actions.",
+            "homepage": "https://www.drupal.org/project/rules",
+            "support": {
+                "source": "https://git.drupalcode.org/project/rules",
+                "issues": "https://www.drupal.org/project/issues/rules"
+            }
+        },
         {
             "name": "drupal/search_api",
             "version": "1.23.0",
@@ -25086,6 +25142,7 @@
         "drupal/mimemail": 20,
         "drupal/profile": 20,
         "drupal/redirect": 20,
+        "drupal/rules": 20,
         "drupal/search_api_page": 20,
         "drupal/select_translation": 20,
         "drupal/session_limit": 10,

+ 1 - 0
config/sync/core.extension.yml

@@ -172,6 +172,7 @@ module:
   restui: 0
   role_delegation: 0
   role_expire: 0
+  rules: 0
   search_api: 0
   search_api_db: 0
   search_api_solr: 0

+ 36 - 0
config/sync/filter.format.restricted_html.yml

@@ -0,0 +1,36 @@
+uuid: 3ca6603a-2a65-4276-9cc7-50b1a9a6a7f9
+langcode: en
+status: true
+dependencies:
+  enforced:
+    module:
+      - filter
+      - rules
+_core:
+  default_config_hash: VrFjOQn2l2n6baaj2Z6IkYt9OdtsLjYPUVg7HgkkGLU
+name: 'Restricted HTML'
+format: restricted_html
+weight: 1
+filters:
+  filter_html:
+    id: filter_html
+    provider: filter
+    status: true
+    weight: -10
+    settings:
+      allowed_html: '<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>'
+      filter_html_help: true
+      filter_html_nofollow: false
+  filter_autop:
+    id: filter_autop
+    provider: filter
+    status: true
+    weight: 0
+    settings: {  }
+  filter_url:
+    id: filter_url
+    provider: filter
+    status: true
+    weight: 0
+    settings:
+      filter_url_length: 72

+ 1 - 0
config/sync/language/fr/filter.format.restricted_html.yml

@@ -0,0 +1 @@
+name: 'HTML restreint'

+ 8 - 0
config/sync/rules.settings.yml

@@ -0,0 +1,8 @@
+_core:
+  default_config_hash: ZKaBtyYFEhfwE4xVP-khSsZabdsN3NSjwOfzaZksez0
+system_log:
+  log_level: warning
+debug_log:
+  enabled: false
+  system_debug: false
+  log_level: debug

+ 17 - 0
config/sync/ultimate_cron.job.rules_cron.yml

@@ -0,0 +1,17 @@
+uuid: bd0b5826-cc41-44ad-b62a-e342aa06f0ce
+langcode: en
+status: true
+dependencies:
+  module:
+    - rules
+title: 'Default cron handler'
+id: rules_cron
+weight: 0
+module: rules
+callback: rules_cron
+scheduler:
+  id: simple
+launcher:
+  id: serial
+logger:
+  id: database

+ 2 - 0
config/sync/user.role.anonymous.yml

@@ -3,6 +3,7 @@ langcode: fr
 status: true
 dependencies:
   config:
+    - filter.format.restricted_html
     - filter.format.wysiwyg
     - rest.resource.user_registration
   module:
@@ -35,6 +36,7 @@ permissions:
   - 'execute materio persisted graphql requests'
   - 'restful post user_registration'
   - 'subscribe to newsletters'
+  - 'use text format restricted_html'
   - 'use text format wysiwyg'
   - 'view body'
   - 'view commerce_product'

+ 166 - 27
web/modules/custom/materio_simplenews/src/Form/MaterioSubscriptionsBlockForm.php

@@ -3,8 +3,11 @@
 namespace Drupal\materio_simplenews\Form;
 
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Url;
 use Drupal\simplenews\Form\SubscriptionsFormBase;
 
+// ! NOT USED ANY MORE
+
 /**
  * Configure simplenews subscriptions of the logged user.
  */
@@ -19,6 +22,27 @@ class MaterioSubscriptionsBlockForm extends SubscriptionsFormBase {
    */
   public $message;
 
+   /**
+   * The newsletters available to select from.
+   *
+   * @var string[]
+   */
+  protected $newsletterIds = [];
+
+  /**
+   * The default newsletters.
+   *
+   * @var string[]
+   */
+  protected $defaultNewsletterIds = [];
+
+  /**
+   * Whether to show "Manage existing" link.
+   *
+   * @var bool
+   */
+  protected $showManage = FALSE;
+
   /**
    * {@inheritdoc}
    */
@@ -34,23 +58,95 @@ class MaterioSubscriptionsBlockForm extends SubscriptionsFormBase {
    */
   public function setUniqueId($id) {
     $this->uniqueId = $id;
+    return $this;
+  }
+
+  /**
+   * Set message.
+   *
+   * @param string $message
+   *   Message to use as description for the block.
+   *
+   * @return $this
+   */
+  public function setMessage($message) {
+    $this->message = $message;
+    return $this;
+  }
+
+  /**
+   * Set the newsletters available to select from.
+   *
+   * @param string[] $newsletters
+   *   Newsletter IDs available to select from.
+   * @param string[] $defaults
+   *   (optional) Newsletter IDs selected by default.
+   *
+   * @return $this
+   */
+  public function setNewsletterIds(array $newsletters, array $defaults = []) {
+    $visible = array_keys(simplenews_newsletter_get_visible());
+    // Exclude newsletters already subscribed.
+    $subscribed = $this->entity->getSubscribedNewsletterIds();
+    $this->newsletterIds = array_diff(array_intersect($newsletters, $visible), $subscribed);
+    $this->defaultNewsletterIds = array_diff(array_intersect($defaults, $visible), $subscribed);
+    return $this;
+  }
+
+  /**
+   * Returns the newsletters available to select from.
+   *
+   * @return string[]
+   *   The newsletter IDs available to select from, as an indexed array.
+   */
+  public function getNewsletterIds() {
+    return $this->newsletterIds;
+  }
+
+  /**
+   * Set whether to show "Manage existing" link.
+   *
+   * @param bool $show
+   *   TRUE to show "Manage existing" link, FALSE to hide.
+   *
+   * @return $this
+   */
+  public function setShowManage($show) {
+    $this->showManage = $show;
+    return $this;
   }
 
   /**
    * {@inheritdoc}
    */
   public function form(array $form, FormStateInterface $form_state) {
-    // Hide subscription widget if only one newsletter available.
-    if (count($this->getNewsletters()) == 1) {
-      $this->getSubscriptionWidget($form_state)->setHidden();
+    $this->getSubscriptionWidget($form_state)->setAvailableNewsletterIds($this->newsletterIds);
+
+    if (!$form_state->getUserInput()) {
+      // Set defaults.
+      foreach ($this->defaultNewsletterIds as $newsletter_id) {
+        $this->entity->subscribe($newsletter_id, SIMPLENEWS_SUBSCRIPTION_STATUS_SUBSCRIBED, 'website');
+      }
     }
 
     $form = parent::form($form, $form_state);
+    $form['subscriptions']['widget']['#title'] = $this->t('Manage your newsletter subscriptions');
+    $form['subscriptions']['widget']['#description'] = $this->t('Select the newsletter(s) to which you want to subscribe.');
+    $hidden_default_ids = array_diff($this->defaultNewsletterIds, $this->getNewsletterIds());
+    $form['subscriptions']['widget']['#required'] = empty($hidden_default_ids);
+    $form['subscriptions']['widget']['#access'] = !empty($this->newsletterIds);
 
-    $form['message'] = array(
-      '#type' => 'item',
-      '#markup' => $this->message,
-    );
+
+    if (!$this->newsletterIds && !$this->defaultNewsletterIds) {
+      $this->message = $this->t('You are already subscribed');
+    }
+
+    if ($this->message) {
+      $form['message'] = [
+        '#type' => 'item',
+        '#markup' => $this->message,
+      ];
+    }
 
     unset($form['subscriptions']['widget']['#title']);
     unset($form['subscriptions']['widget']['#description']);
@@ -63,41 +159,84 @@ class MaterioSubscriptionsBlockForm extends SubscriptionsFormBase {
     unset($form['mail']['widget'][0]['value']['#title']);
     unset($form['mail']['widget'][0]['value']['#description']);
 
-    $mailvalue = $form['mail']['widget'][0];
-    $test='test';
-
     return $form;
   }
 
+
   /**
    * {@inheritdoc}
    */
   protected function actions(array $form, FormStateInterface $form_state) {
     $actions = parent::actions($form, $form_state);
-    $actions[static::SUBMIT_UPDATE]['#value'] = $this->t('Update');
+
+    $actions['submit']['#value'] = $this->t('Subscribe');
+    if (!$this->newsletterIds && !$this->defaultNewsletterIds) {
+      $actions['submit']['#attributes']['disabled'] = TRUE;
+    }
+
+    if ($this->showManage) {
+      $user = \Drupal::currentUser();
+      $link = $user->isAuthenticated() ? Url::fromRoute('simplenews.newsletter_subscriptions_user', ['user' => $user->id()]) : Url::fromRoute('simplenews.newsletter_validate');
+      $actions['manage'] = [
+        '#title' => $this->t('Manage existing'),
+        '#type' => 'link',
+        '#url' => $link,
+      ];
+    }
+
     return $actions;
   }
+  
+  /**
+   * {@inheritdoc}
+   */
+  public function validateForm(array &$form, FormStateInterface $form_state) {
+    $mail = $form_state->getValue(['mail', 0, 'value']);
+    if ($this->entity->isNew() && $subscriber = Subscriber::loadByMail($mail)) {
+      $this->setEntity($subscriber);
+    }
+
+    parent::validateForm($form, $form_state);
+
+    $mail = $form_state->getValue(['mail', 0, 'value']);
+    // Cannot subscribe blocked users.
+    if (($user = user_load_by_mail($mail)) && $user->isBlocked()) {
+      $message = $this->t('The email address %mail belongs to a blocked user.', ['%mail' => $mail]);
+      $form_state->setErrorByName('mail', $message);
+    }
+  }
+
+  /**
+   * Submit callback that subscribes to selected newsletters.
+   *
+   * @param array $form
+   *   The form structure.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The form state object.
+   */
+  public function submitExtra(array $form, FormStateInterface $form_state) {
+    /** @var \Drupal\simplenews\Subscription\SubscriptionManagerInterface $subscription_manager */
+    $subscription_manager = \Drupal::service('simplenews.subscription_manager');
+
+    // Subscribe the selected newsletters and any defaults that are hidden.
+    $selected_ids = $this->extractNewsletterIds($form_state, TRUE);
+    $hidden_default_ids = array_diff($this->defaultNewsletterIds, $this->getNewsletterIds());
+
+    foreach (array_unique(array_merge($selected_ids, $hidden_default_ids)) as $newsletter_id) {
+      $subscription_manager->subscribe($this->entity->getMail(), $newsletter_id, NULL, 'website');
+    }
+    $sent = $subscription_manager->sendConfirmations();
+    $this->messenger()->addMessage($this->getSubmitMessage($form_state, $sent));
+  }
 
   /**
    * {@inheritdoc}
    */
-  protected function getSubmitMessage(FormStateInterface $form_state, $op, $confirm) {
-    switch ($op) {
-      case static::SUBMIT_UPDATE:
-        return $this->t('The newsletter subscriptions for %mail have been updated.', array('%mail' => $form_state->getValue('mail')[0]['value']));
-
-      case static::SUBMIT_SUBSCRIBE:
-        if ($confirm) {
-          return $this->t('You will receive a confirmation e-mail shortly containing further instructions on how to complete your subscription.');
-        }
-        return $this->t('You have been subscribed.');
-
-      case static::SUBMIT_UNSUBSCRIBE:
-        if ($confirm) {
-          return $this->t('You will receive a confirmation e-mail shortly containing further instructions on how to cancel your subscription.');
-        }
-        return $this->t('You have been unsubscribed.');
+  protected function getSubmitMessage(FormStateInterface $form_state, $confirm) {
+    if ($confirm) {
+      return $this->t('You will receive a confirmation e-mail shortly containing further instructions on how to complete your subscription.');
     }
+    return $this->t('You have been subscribed.');
   }
 
 }

+ 2 - 0
web/modules/custom/materio_simplenews/src/Plugin/Block/MaterioSimplenewsSubscriptionBlock.php

@@ -12,6 +12,8 @@ use Drupal\Core\Session\AccountInterface;
 use Drupal\simplenews\Entity\Subscriber;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
+// ! NOT USED ANY MORE
+
 /**
  * Provides an 'Simplenews subscription' block with all available newsletters and an email field.
  *

File diff suppressed because it is too large
+ 0 - 0
web/themes/custom/materiotheme/assets/dist/main.js


BIN
web/themes/custom/materiotheme/assets/dist/main.js.gz


+ 2 - 1
web/themes/custom/materiotheme/assets/scripts/main.js

@@ -101,7 +101,8 @@ export let _v_sitebranding_block, _v_user_block, _v_header_menu,
           drupalDecoupled.route_name.indexOf('entity.webform.canonical') !== -1 ||
           drupalDecoupled.route_name.indexOf('entity.webform.confirmation') !== -1 ||
           drupalDecoupled.route_name.indexOf('materio_expo.qr_controller_getfile') !== -1 ||
-          (drupalDecoupled.route_name === 'entity.node.canonical' && drupalDecoupled.entity_bundle === 'simplenews_issue')
+          (drupalDecoupled.route_name === 'entity.node.canonical' && drupalDecoupled.entity_bundle === 'simplenews_issue') ||
+          drupalDecoupled.route_name.indexOf('simplenews') !== -1
       ) {
         console.debug('NO VUEJS')
         return true

Some files were not shown because too many files changed in this diff