Рубрики
Работа

Скрываем ссылку за редиректом — Drupal 7

Речь исключительно про Link field, для ссылок из контента существует модуль gotwo. Предпосылки могут быть разные, но задача скрыть ссылку — не такая редка вещь.

Дано: Drupal 7.8, тип содержимого с единственной ссылкой (link field).

Задача: сделать так, чтобы ссылка отображалась в виде /node/*nid*/goto, а при нажатии перекидывала посетителя на адрес, фактически содержащийся в ссылке (link url).

Потребуются: модули redirect, custom formatters, rules.

Custom Formatters можно заменить на шаблон поля. Для примера field--field-url.tpl.php

<?php foreach ($items as $delta => $item) : ?>
<a rel="nofollow"
     title="<?php print $element['#object']->field_url['und'][0]['title']; ?>"
     href="/node/<?php print $element['#object']->nid;?>/goto">LINK TEXT</a>
<?php endforeach; ?>

Текст ссылки можно заменить на любое значение из $element['#object'], это все данные по текущему документу (node).
Custom formatter слегка удобнее использовать и оперативно редактировать. У меня получился такой код для link_field:


// Custom formatter for a link_field.
$node = $variables['#object'];
foreach (element_children($variables['#items']) as $delta) {
  $item = $variables['#items'][$delta];

  $source = "Перейти по ссылке";
  $destination = 'node/'.$node->nid.'/goto';

  return l($source, $destination, array('html' => false, 'attributes'=>array('rel'=>'nofollow', 'title'=>'Перейти в по ссылке '.$node->title, 'class'=>array('my-link-field'))));
}

Затем для нужного view mode меняем вывод нужной ссылки (Структура — Типы материалов — ВашТип — Управление отображением). Все, ссылку заготовили, но она пока ведет в никуда. Точнее, на ту же страницу, что и /node/*nid*, как любая ссылка на /node/*nid*/whatever.

Правило (Rule) настраиваем на событие "После редактирования существующего документа" и "После сохранения нового документа", чтобы не пропустить возможные изменения ссылки. Отфильтровываем условиями тип материала, если необходимо. Действие будет типа PHP code (модуль PHP нужно заранее включить). Код примерно такой, взят почти полностью из тестов, идущих с модулем Redirect.


$redirect_defaults = array(
          'uid' => $node->uid,
          'status_code' => 302,
        );
    $redirect_path = $node->field_url['und'][0]['url']; // real URL to redirect to
    $source_path = 'node/'.$node->nid.'/goto'; // fake url (tweak to your link field custom formatter)
    redirect_delete_by_path($source_path); // delete existing redirects to avoid PDO errors
    $source_parsed = redirect_parse_url($source_path);
    $redirect['source'] = $source_parsed['url'];
    if (isset($source_parsed['query'])) {
      $redirect['source_options']['query'] = $source_parsed['query'];
    }

    $redirect_parsed = redirect_parse_url($redirect_path);
    $redirect['redirect'] = $redirect_parsed['url'];
    if (isset($redirect_parsed['query'])) {
      $redirect['redirect_options']['query'] = $redirect_parsed['query'];
    }
    if (isset($redirect_parsed['fragment'])) {
      $redirect['redirect_options']['fragment'] = $redirect_parsed['fragment'];
    }

    $redirect = (object) $redirect;
    redirect_object_prepare($redirect, $redirect_defaults);
    redirect_save($redirect);

Теперь после создания или изменения документа будет выполняться правило, которое создает перенаправление с локального адреса /node/NNN/goto на адрес, указанный в поле field_url документа с идентификатором NNN.

Если контент уже был, то нужно «передернуть» все материалы нужного типа — сфабриковать событие, по которому сработает правило. Я для этого использовал views bulk operations (VBO).

Вероятно, не самый простой и изящный способ, но вполне прозрачный и рабочий, по-моему.

2 ответа к “Скрываем ссылку за редиректом — Drupal 7”

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *