Personalized content that relies on JavaScript libraries sometimes fails to behave as expected

Created on 15 March 2023, over 1 year ago
Updated 16 September 2024, 2 months ago

Problem/Motivation

For Personalized content that relies on JavaScript, Drupal fails to load the required JavaScript or behaviors, causing personalized content or HTML to malfunction when dependent on JavaScript libraries.

Steps to reproduce

Export a content or block which relies on javascript to Personalization. Create a campaign and add the exported content to slot. Publish the campaign and open the page to see the Personalized content.

Proposed resolution

Load all necessary JavaScript libraries on all pages and reattach Drupal behaviors for the element after personalized content is available

Remaining tasks

User interface changes

API changes

Data model changes

🐛 Bug report
Status

Needs work

Version

4.0

Component

Code

Created by

🇮🇳India kk5190

Live updates comments and jobs are added and updated live.
Sign in to follow issues

Merge Requests

Comments & Activities

  • Issue created by @kk5190
  • Status changed to Needs work over 1 year ago
  • 🇨🇦Canada scor Toronto

    fixing missing new line at end of patch

  • 🇨🇦Canada scor Toronto
  • 🇧🇪Belgium cgoffin

    I get the following warning:

    Warning: foreach() argument must be of type array|object, null given in Drupal\acquia_perz\PerzHelper::attachLibrariesForPerz() (regel 400 van /var/www/html/docroot/modules/contrib/acquia_perz/src/PerzHelper.php)

    I updated the patch to fix this.

  • Status changed to Needs review over 1 year ago
  • Open on Drupal.org →
    Core: 10.0.7 + Environment: PHP 8.1 & MySQL 5.7
    last update over 1 year ago
    Waiting for branch to pass
  • Open on Drupal.org →
    Core: 10.0.7 + Environment: PHP 8.1 & MySQL 5.7
    last update over 1 year ago
    Waiting for branch to pass
  • Open on Drupal.org →
    Core: 10.0.7 + Environment: PHP 8.1 & MySQL 5.7
    last update over 1 year ago
    Waiting for branch to pass
  • Open on Drupal.org →
    Core: 10.0.7 + Environment: PHP 8.1 & MySQL 5.7
    last update over 1 year ago
    Waiting for branch to pass
  • 🇧🇪Belgium BramDriesen Belgium 🇧🇪
  • Status changed to RTBC over 1 year ago
  • 🇧🇪Belgium BramDriesen Belgium 🇧🇪

    RTBC since this solved an issue for us with lazy loading of images

  • Status changed to Needs work over 1 year ago
  • 🇧🇪Belgium BramDriesen Belgium 🇧🇪

    Needs a re-roll. Patch in #6 is missing the addition of the new files it seems.

  • 🇨🇦Canada scor Toronto

    Thanks for updating the patch. Yes the new patch is missing the 2 new files acquia_perz.libraries.yml and js/perz.js.

  • Open on Drupal.org →
    Core: 10.0.7 + Environment: PHP 8.1 & MySQL 5.7
    last update over 1 year ago
    Waiting for branch to pass
  • Open in Jenkins → Open on Drupal.org →
    Core: 10.0.7 + Environment: PHP 8.1 & MySQL 5.7
    last update over 1 year ago
    Composer require-dev failure
  • Status changed to Needs review over 1 year ago
  • 🇧🇪Belgium BramDriesen Belgium 🇧🇪

    Incorporated the fix from #6 with the patch of #4 in a merge request.

  • Open on Drupal.org →
    Core: 10.0.7 + Environment: PHP 8.1 & MySQL 5.7
    last update over 1 year ago
    Waiting for branch to pass
  • 🇨🇦Canada scor Toronto

    Thanks @BramDriesen. updating patch with most recent MR for people who may prefer to use files from this issue.

  • Status changed to Needs work about 1 year ago
  • 🇧🇪Belgium BramDriesen Belgium 🇧🇪

    This fixes the behaviour for page loads. But not while editing content in the experience editor.

    Acquia support case number: 00977157

  • 🇮🇳India kk5190

    Adding Fix for JS not working properly for lazy loading images on Experience Builder

  • 🇧🇪Belgium BramDriesen Belgium 🇧🇪
    1. +++ b/js/perz.js
      @@ -0,0 +1,25 @@
      +        // Additional Fix for Experience builder
      

      Should describe what is being fixed.

    2. +++ b/js/perz.js
      @@ -0,0 +1,25 @@
      +        if (typeof window.AcquiaLift !== 'undefined') {
      +          if (typeof window.AcquiaLift.executionContext !== 'undefined' && window.AcquiaLift.executionContext === "experience-builder-iframe") {
      

      Double quotes

    Also, this should have been a commit to the issue fork. OR if working with patches you need to provide an interdiff to show what changed.

  • 🇧🇪Belgium BramDriesen Belgium 🇧🇪
  • Open on Drupal.org →
    Core: 10.1.4 + Environment: PHP 8.1 & MySQL 5.7
    last update about 1 year ago
    Waiting for branch to pass
  • Status changed to Needs review about 1 year ago
  • Open on Drupal.org →
    Core: 10.1.4 + Environment: PHP 8.1 & MySQL 5.7
    last update about 1 year ago
    Waiting for branch to pass
  • 🇧🇪Belgium BramDriesen Belgium 🇧🇪

    Updated the JS file based on the last patch and updated the code remarks. Still need to test this.

  • Open on Drupal.org →
    Core: 10.1.4 + Environment: PHP 8.1 & MySQL 5.7
    last update about 1 year ago
    Waiting for branch to pass
  • Open on Drupal.org →
    Core: 10.1.4 + Environment: PHP 8.1 & MySQL 5.7
    last update about 1 year ago
    Waiting for branch to pass
  • 🇧🇪Belgium BramDriesen Belgium 🇧🇪

    Static patch uploaded based on the latest rebased issue fork.

  • Open on Drupal.org →
    Core: 10.1.4 + Environment: PHP 8.1 & MySQL 5.7
    last update about 1 year ago
    Waiting for branch to pass
  • 🇧🇪Belgium BramDriesen Belgium 🇧🇪

    Last patch did not apply

  • Open on Drupal.org →
    Core: 10.1.4 + Environment: PHP 8.1 & MySQL 5.7
    last update about 1 year ago
    Waiting for branch to pass
  • 🇧🇪Belgium BramDriesen Belgium 🇧🇪

    Now for real 🙈

  • Status changed to RTBC about 1 year ago
  • 🇧🇪Belgium BramDriesen Belgium 🇧🇪

    I believe this is now working as expected. I'll ask for some additional tests from my team members.

  • Status changed to Needs work about 1 year ago
  • 🇧🇪Belgium BramDriesen Belgium 🇧🇪

    Okay, just tested this again. It's still not working.

    - Pushed a new component content (just a component with an image and lazy loading enabled).
    - Synced content
    - Added the content to an available slot --> Broken image handler
    - Saved campaign
    - Edit experience again --> Image is loading fine

  • 🇮🇳India kk5190

    Hello Brian,
    I retested the issue, and it appears to be functioning correctly in the scenario you mentioned. Could you please provide additional details regarding this? Have we cleared the cache of the website or browser after applying the patch? Providing more information about the site's studio component and the method you're using for enabling lazy loading might assist me in reproducing the issue. Could you also verify in the source if the perz.js file contains the new changes by inspecting it through the developer tools?

  • Status changed to RTBC about 1 year ago
  • 🇧🇪Belgium BramDriesen Belgium 🇧🇪

    This magically started working. Gotta love SiteStudio react changes that you have no control over and just come into your website when you do a rebuild/deploy.

    Have we cleared the cache of the website or browser after applying the patch?

    Just a reminder we live in 2023 and have wonderful tools like CI/CD that do this automatically on deploy. So of course the cache is cleared.

    Providing more information about the site's studio component and the method you're using for enabling lazy loading might assist me in reproducing the issue.

    This is provided in the Acquia ticket.

    Could you also verify in the source if the perz.js file contains the new changes by inspecting it through the developer tools?

    Yes it is.

  • Open on Drupal.org →
    Core: 10.2.1 + Environment: PHP 8.1 & MySQL 5.7
    last update 8 months ago
    Waiting for branch to pass
  • 🇮🇳India kk5190

    Adding Fix for JS not working properly for lazy loading images on Experience Builder in some cases.

  • Open on Drupal.org →
    Core: 10.2.1 + Environment: PHP 8.1 & MySQL 5.7
    last update 8 months ago
    Waiting for branch to pass
  • 🇮🇳India bendale

    Thanks @scor for both the patches.
    I checked 4.1.5 and 4.1.7 with their corresponding patches and the behaviour was not resolved, we still see that the personalisation block does not show up with JS aggregation enabled, in addition to this, the 4.1.5 patch conflicts with site studio. However, both of these patches do not solve the JS aggregation-related issue.

  • Status changed to Needs work 6 months ago
  • 🇮🇳India kk5190

    Latest patch for latest version 4.1.8 https://www.drupal.org/files/issues/2024-08-07/perz_site_studio.patch .

    This patch introduces a toggle switch, "Dynamic JavaScript Support," under the Advanced Configuration of Acquia Personalization Settings. This feature enables the personalization of dynamic JavaScript components, including Site Studio components.

  • Pipeline finished with Failed
    3 months ago
    Total: 423s
    #261242
  • Pipeline finished with Failed
    3 months ago
    #261277
  • Pipeline finished with Failed
    3 months ago
    Total: 418s
    #261462
  • Pipeline finished with Failed
    3 months ago
    Total: 434s
    #261478
  • Pipeline finished with Success
    3 months ago
    #261509
  • 🇧🇪Belgium cgoffin

    I noticed a race condition where the event listener often is added after the triggering of the event. Moving adding the event listener outside of the Drupal behavior fixed this. Commit added and here also a patch against 4.1.8.

  • Pipeline finished with Success
    2 months ago
    Total: 450s
    #281117
  • Pipeline finished with Success
    2 months ago
    Total: 487s
    #281116
  • Pipeline finished with Success
    2 months ago
    Total: 394s
    #282012
  • Pipeline finished with Success
    2 months ago
    Total: 397s
    #282013
  • 🇧🇪Belgium cgoffin

    It still doesn't work for the Acquia Site Studio modal component. This is because the div containing the modal is replaced to the top of the body and isn't in the context anymore. For this reason I updated the attachment of the behaviors to do it for the full page instead of for only the context. Here also a patch with the adjustment.

  • 🇧🇪Belgium cgoffin

    I also noticed that using the DeprecationHandler to render the content sent to the personalization tool, loses the attachments because the elements variable isn't passed by reference anymore. For this reason, I changed the code to do a manual check and call to the right method. Here also a patch for v4.1.8.

  • Pipeline finished with Failed
    2 months ago
    Total: 388s
    #284240
  • Pipeline finished with Failed
    2 months ago
    Total: 434s
    #284241
  • Pipeline finished with Success
    about 2 months ago
    Total: 401s
    #291301
Production build 0.71.5 2024