Arhn - архитектура программирования

Вопрос разработки модуля Drupal, касающийся файлов cookie и перенаправлений

Помогите, пожалуйста? Я хочу разработать модуль, чтобы сделать что-то очень простое с PHP. Мне бросает вызов Drupal API. Я использую версию 6.

Цель:

1) Определите, просматривает ли пользователь конкретный узел (роль не имеет значения) 2) Если да, проверьте, установлен ли файл cookie а) Если файл cookie установлен, ничего не делайте б) Если файл cookie не установлен, установите файл cookie и затем перенаправьте пользователя на другой узел

Вот и все!

Я создал модуль и установил его, ошибки нет, но он тоже ничего не делает. Файл cookie не установлен. Я не уверен, как система Drupal любит перенаправлять запросы, поэтому, пожалуйста, понимание этого было бы полезно. БОЛЬШОЕ СПАСИБО!

<?php
//$Id: offer_survey.module,v 1.0 2009/09/21 11:31:55 blah Exp $
function offer_survey_init() {
  global $base_url;

  $offer_survey = true;
  $cookie_name = 'survey_offered';

  if ($node->nid == 651) {
    if ($_COOKIE[$cookie_name]) {
      // do nothing
    } else {
      setcookie($cookie_name,1,time() + (86400 * 365));
      //then do the redirect an internal webform URL
    }
  }
}

ПЕРЕСМОТРЕННАЯ ВЕРСИЯ (ПОСЛЕДНЯЯ)

<?php
//$Id: offer_survey.module,v 1.0 2009/09/21 11:31:55 durz Exp $
function offer_survey_init() {
  global $base_url;

  $offer_survey = true;
  $cookie_name = 'survey_offered';

  if (arg(0) === "testing") {   // the path of the page
   if (!$_COOKIE[$cookie_name]) {
   setcookie($cookie_name,1,time() + (86400 * 365));
   drupal_goto('new-destination'); // the path to be redirected to
 } 
  } 
}
22.09.2009

Ответы:


1

Есть несколько разных способов сделать это.

Один из вариантов — использовать hook_nodeapi, как предлагает Джереми. При этом у вас будет загружаемый/просматриваемый узел и т. д., доступный как переменная $node. Другим вариантом было бы в вашем hook_init посмотреть на $_GET и посмотреть, запрашивает ли пользователь рассматриваемый узел. Hook_nodeapi, пожалуй, самый простой способ сделать это.

Вы можете, как сказал Джереми, сохранить данные в пользовательском объекте, однако это возможно только в том случае, если ваш пользователь вошел в систему, поскольку в противном случае пользовательский объект будет анонимным пользователем, который одинаков для всех не вошедших в систему пользователей. В этом случае использование файла cookie может быть вариантом. Вы должны быть осторожны, так как вам нужно создать уникальное имя файла cookie для каждого сайта. В противном случае, если бы этот модуль был установлен на нескольких сайтах, пользователи не получали бы опросы после посещения только одного из них.

также в вашем коде вместо того, чтобы делать:

if ($_COOKIE[$cookie_name]) {
  // do nothing
} else {
  setcookie($cookie_name,1,time() + (86400 * 365));
  //then do the redirect an internal webform URL
}

Вместо этого вы должны использовать ! (не)оператор:

if (!$_COOKIE[$cookie_name]) {
  setcookie($cookie_name,1,time() + (86400 * 365));
  //then do the redirect an internal webform URL
}
22.09.2009
  • +1 за пометку, что user_save не будет сохраняться для анонимных пользователей и для файлов cookie для каждого сайта. 22.09.2009
  • Спасибо, я внес изменения в свой код. Я не знал, что $node не является глобальным. Обратите внимание, что я должен использовать файл cookie для анонимных пользователей. ОДНАКО этот модуль все еще не будет работать. Идеи? ‹?php //$Id: offer_survey.module,v 1.0 21.09.2009 11:31:55 Stoob Exp $ function offer_survey_init() { global $base_url; $offer_survey = правда; $cookie_name = 'предлагаемый_опрос'; if (arg(0) === testing) { // путь к странице if (!$_COOKIE[$cookie_name]) { setcookie($cookie_name,1,time() + (86400 * 365)); drupal_goto('новый пункт назначения'); // путь для перенаправления } } } 22.09.2009
  • Я дал ему тест с приведенным выше кодом, и он действительно работает. В первый раз, когда я иду на тестирование, меня перенаправляют, во второй раз — нет. Ваша проблема с тестированием этого заключается в том, что у вас может быть установлен файл cookie в вашем браузере, и поэтому вы всегда пропускаете оператор if. 23.09.2009

  • 2

    Ваш модуль называется offer_survey?

    Он включен?

    Ваш код выглядит так, как будто он не может работать, поскольку он использует переменную $node, которая не определена.

    Я думаю, вам больше повезет с использованием hook_nodeapi op=load

    После того, как вы разобрались с этими вещами, вы можете обнаружить, что drupal_goto полезен для перенаправления, и вы можете использовать user_save для постоянных данных, а не использовать set cookie напрямую.

    22.09.2009
  • Спасибо. я использовал drupal_goto. да модуль устанавливается и включается без ошибок. 22.09.2009

  • 3

    Это рабочий код. Обратите внимание, что необходимо было использовать arg(1) для оператора if(), а также идентификатор узла (nid), а не hook_nodeapi, что не сработало.

    Также необходимо было установить cookie_domain, который является глобальным для друпала.

    <?php
    //$Id: offer_survey.module,v 1.0 2009/09/21 11:31:55 Stoob Exp $
    function offer_survey_init() {
      global $base_url;
      global $cookie_domain;
    
      $offer_survey = true;
      $cookie_name = 'survey_offered';
    
      if (arg(1) == 2) {   // the number of the node (nid) of the page
        if (!isset($_COOKIE[$cookie_name])) {
          setcookie($cookie_name,1,time() + (86400 * 365),null,$cookie_domain); //lasts a year
          drupal_goto('new/destination'); // the path to be redirected to
        } 
      } 
    }
    
    22.09.2009

    4

    Если ваш кеш не отключен, hook_init() работает только с некэшированными запросами. Как только кэш сработает, ваши анонимные пользователи не получат этот файл cookie.

    Вам нужно поместить это в hook_boot(), но тогда вы не сможете использовать drupal_goto, так как при запуске _boot() он еще не загружен. Но это нормально, вы можете просто использовать header(), чтобы напрямую установить заголовок перенаправления Location.

    Рекомендуется остановить выполнение после перенаправления (хотя вы можете потерять информацию о сеансе, если не позволите drupal выполнить некоторую очистку, загляните внутрь того, что делает drupal_goto, если вы действительно хотите сделать это правильно).

    <?php
    //$Id: offer_survey.module,v 1.1 2010/10/21 11:31:55 tmcclure Exp $
    function offer_survey_boot() {
      global $base_url;
      global $cookie_domain;
    
      $offer_survey = true;
      $cookie_name = 'survey_offered';
    
      if (arg(1) == 2) {   // the number of the node (nid) of the page
        if (!isset($_COOKIE[$cookie_name])) {
          setcookie($cookie_name,1,time() + (86400 * 365),null,$cookie_domain); //lasts a year
          header('Location: '.$base_url.'/new/destination',TRUE,302); // the path to be redirected to
          exit();
        } 
      } 
    }
    
    28.10.2010
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..