Вопрос разработки модуля Drupal, касающийся файлов cookie и перенаправлений - PullRequest
0 голосов
/ 22 сентября 2009

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

Цель:

1) Определить, просматривает ли пользователь определенный узел (роль не имеет значения) 2) Если да, проверьте, установлен ли файл cookie a) Еслиcookie установлен, ничего не делать b) Если 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
 } 
  } 
}

Ответы [ 4 ]

2 голосов
/ 22 сентября 2009

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

Один из вариантов - использовать 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
}
1 голос
/ 22 сентября 2009

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

Он включен?

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

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

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

0 голосов
/ 28 октября 2010

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

Вам нужно поместить это в 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();
    } 
  } 
}
0 голосов
/ 23 сентября 2009

Это рабочий код. Обратите внимание, что было необходимо использовать 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
    } 
  } 
}
...