CMS Drupal

Заказали сделать для сайта Landing page. До этого вообще не знал что это такое. В двух словах, когда пользователь заходит с чужого сайта необходимо, чтобы вместо главной, открывалась другая страница, а когда заходит напрямую по ссылке, то основная главная.

Есть, конечно, для этого дела модуль. Но он мне показался слишком уж навороченным для простой в моем случае задачи, да к тому же у меня с небольшими заморочками ситуация, поэтому решил сделать своими руками. Чувствую, что мой вариант решения идеалогически не совсем верный. Но раз работает, то имеет право на жизнь.

Создаем модуль, в котором у нас будет всего лишь одна функция. Точнее хук nodeapi.

function alex_landing_page_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  switch ($op) {
    case 'view':
      if (!empty($_SESSION['alex_referrer'])) {
        $_SESSION['alex_referrer'] = '';
        break;
      }
 
      if (!empty($_SERVER['HTTP_REFERER'])) {
        $referrer = parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST);
        $_SESSION['alex_referrer'] = $referrer;
        if ($_SERVER['SERVER_NAME'] != $referrer) {
          //drupal_goto('landing_page1');
          $node = node_prepare(node_load(50));
          drupal_set_title($node->title);
        }
      }
      break;
  }
}

Немного поясню код. Понятно, что мы проверяем есть ли внешний реферер. И если такой есть, то подменяем любую текущую ноду ($node) на нужную нам. В данном случае у меня страница, на которую надо перенаправить пользователя имеет nid=50. Сессии в данном примере в принципе не нужны. В сессию я запихнул переменную 'alex_referrer' для случая, если вместо подмены ноды просто делать редирект функцией drupal_goto. Вот тогда, чтобы не зациклилось, понадобятся строки кода с сессиями. Но мне необходимо было, чтобы в адресной строке браузера была главная страница.
Поэтому никакого drupal_goto. А сессии, нам могут понадобиться дальше.

В большинстве случаев Landing page будет иметь дизайн отличающийся от общего дизайна сайта. Во всяком случае так было в моем случае. Поэтому для этой страницы необходим свой шаблон страницы. Можно, конечно создать в своей теме файл с названием page-node-50.tpl.php и там сверстать страницу. И она будет срабатывать при открытии нашей ноды (напомню, что 50 - это nid нашей Landing page). Но вот только при том приеме, что я использовал выше (подмена ноды вместо drupal_goto) данный шаблон не будет задействован, т.к. друпал будет думать, что текущая страница - это та, КОТОРУЮ мы подменяем, а не которой подменяем. Поэтому придется еще дописать немного кода в файле темы template.php.

function phptemplate_preprocess_page(&$vars) {
  if (!empty($_SESSION['alex_referrer'])) {
    $vars['template_files'][] = 'page-node-50';
  }
}

Т.е., если мы установили в хуке nodeapi переменную сессии, то значит на сайт вошли с другого сайта и в этой функции задействуем шаблон для Landing page.

Повторюсь, что чувствую, что нагородил огород, наверняка можно проще сделать, но мне в голову другого варианта не пришло.

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img>
  • Строки и параграфы переносятся автоматически.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>, <1c7>, <drupal5>, <drupal6>, <javascript>, <php>. Beside the tag style "<foo>" it is also possible to use "[foo]".