0

I currently have a module on http://hitechwolf.com that creates a welcome overlay upon a user's first visit, This should work by utilizing a jquery created cookie and showing the overlay based on its existence. The jquery works, the cookie is created, but for anonymous users the cookie is ignored and the overlay shows on every page. I've implemented jquery.cookie but it still completely ignores the cookie for anonymous users. I'm at the end of my rope, any help or alternatives would really be appreciated.

welcome-overlay.js

/**
 * @file
 *  Toggles Welcome Overlay, upon first button
 *  clicks toggles different content, second toggles overlay
 */

(function ($, Drupal) {
  Drupal.behaviors.welcomeOverlay = {
    attach: function () {
      var cookieName = 'firstWelcome';
      cookieValue = 'returning';
      cookieDays = 60;


      /** Create Cookie Creation Function **/
      function createCookie(name, value, days) {
        if (days) {
          var date = new Date();
          date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
              expires = "; expires=" + date.toGMTString();
        } 
        else {
          var expires = "";
        }
          document.cookie = name + "=" + value + expires + "; path=/";
      }

      /** Check for Specfic Cookie **/
      function readCookie(name) {
        var nameEQ = name + "=";
            ca = document.cookie.split(';');
        for (var i = 0; i < ca.length; i++) {
          var c = ca[i];
          while (c.charAt(0) == ' ') { c = c.substring(1, c.length);
            if (c.indexOf(nameEQ) === 0) { 
              return c.substring(nameEQ.length, c.length);
            }
          }
        }
        return null;
      }


    /** Sets value corresponding to cookie existance **/
      var visited = readCookie(cookieName);
          visited2 = document.cookie.search(cookieName);

      /** If Non-existant Create Cookie and Show Content **/
      if (visited === null || visited2 < 0) {
          // $(document).ready(function () {
          // Seconds Before Overlay Slides Over Content
          setTimeout(function () {
            overlay.slideToggle('800', 'linear', function () {
              appearFirst.fadeTo('800', 1, 'linear');
            });
          }, 1500);
          createCookie(cookieName, cookieValue, cookieDays);
      }  
    }
  }
})(jQuery, Drupal);

welcome-overlay.module

function welcome_overlay_preprocess_page(&$variables) {
  /** Include the jquery.cookie plugin **/
 drupal_add_library('system', 'jquery.cookie');
 /** Attach jquery/css to module **/
  $path = drupal_get_path('module', 'welcome_overlay');
  drupal_add_css($path . '/welcome_overlay.css');
  drupal_add_js($path . '/welcome_overlay.js');
} 
5
  • 1
    Perhaps you'll find this useful?
    – Darvanen
    Dec 16, 2014 at 5:26
  • thank you it works! hook_init instead of within the preprocess. Whenever/If you can, can you please just confirm by visiting again. One caveat that scares me though is chrome incognito still ignores the cookie.
    – Bakajuice
    Dec 16, 2014 at 6:09
  • Yep, works for me, your site background stretches strangely on a 24" monitor in case you didn't know =)
    – Darvanen
    Dec 16, 2014 at 6:46
  • Thanks alot XD, if you'd like submit this as an answer, because it answers the question. Also when you say strangely...in no way do you have to do this, but would you be willing to take a quick screenshot, I've made this with a 22", might have to implement some max-widths.
    – Bakajuice
    Dec 16, 2014 at 6:52
  • Sure, make a drupal.org profile or point me to it so I can contact you.
    – Darvanen
    Dec 16, 2014 at 7:25

1 Answer 1

0

Instead of making a custom cookie, try using Drupal's cookie system.

Set:

user_cookie_save(array('key' => 'value'));

Get:

var = $_COOKIE['Drupal_visitor_key'];

I just realised this is in php, not javascript as you have used so I will expand. I made my overlay by creating a new page with hook_menu and am using hook_init to check for cookie values, redirecting to my new page if required.

2
  • ...and the more I think about it, JQuery is a much better idea, less strain on the server. Sorry I can't help with your particular issue.
    – Darvanen
    Dec 16, 2014 at 5:24
  • all is well, if jQuery continues to falter than I'll use your method. Thanks :)
    – Bakajuice
    Dec 16, 2014 at 6:38

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.