jQuery / Drupal Добавить строку ко всем HREF на сайте (любая страница) - PullRequest
0 голосов
/ 18 октября 2010

Итак, у меня есть сайт с дюжиной страниц, использующий Drupal в качестве CMS. Хотите знать, как установить / добавить все ссылки href на любой странице с динамическим атрибутом?

так вот пример URL:

http://www.site.com/?q=node/4

и я хотел добавить к URL-адресу вот так:

http://www.site.com/?q=node/4&attr=1234

Теперь у меня есть навигационная панель на сайте, и когда я наводю указатель мыши на ссылку, я вижу URL, но мне нужно добавить строку & attr = 1234 в конце. Строка является динамической, поэтому она может время от времени меняться.

Я думал, что jQuery был бы хорошим выбором для этого, но есть ли у Drupal какая-либо функциональность?

Теперь я видел пару сообщений в стеке:

Проблема в том, что я изучаю Drupal и имею минимальный опыт работы с jQuery, но с обоими лучше. Я вижу, что jQuery может заменить HREF, но похоже, что они жестко закодировали HREF, может ли jQuery найти все HREF на странице и добавить к ней строку? Также у Drupal есть эта функциональность, и какой подход был бы лучшим?

Также нужно, чтобы это работало для чистого или стандартного формата URL, поэтому я думаю, что Apache справится с этим, я просто хотел убедиться.

Спасибо за любую помощь

EDIT:

Похоже, что общее мнение о том, что Drupal должен обрабатывать запросы такого типа. Просто ищу лучшую реализацию. Лучше всего было бы просто вызвать функцию, но я бы хотел, чтобы она динамически добавлялась ко всем существующим href, поскольку я хочу, чтобы это было динамическим, а не жестким кодированием любых вызовов url / href. Так что я могу добавлять / удалять страницы на лету без необходимости что-либо переконфигурировать / перекодировать.

Спасибо за отличные советы, хотя

РЕДАКТИРОВАТЬ # 2:

Хорошо, возможно, я задаю вопрос. Вот то, что мне нужно, и почему оно еще не работает для меня.

Мне нужно передать значение в URL, которое изменяет внешний вид сайта. Мне нужно, чтобы он передавался почти на каждый тег href на странице, но не на страницах выхода пользователя или администратора.

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

Теперь я вижу, что нижние навигационные ссылки используют эту функцию Drupal: menu_navigation_links () в menu.inc, но верхняя навигационная система использует пользовательскую функцию.

Эта функция в скрипте template.php выглядит как та, которая создает ссылки

function lplus($text, $path, $options = array()) {
  global $language;

  // Merge in defaults.
  $options += array(
      'attributes' => array(),
      'html' => FALSE,
    );

  // Append active class.
  if (($path == $_GET['q'] || ($path == '<front>' && drupal_is_front_page())) &&
      (empty($options['language']) || $options['language']->language == $language->language)) {
    if (isset($options['attributes']['class'])) {
      $options['attributes']['class'] .= ' active';
    }
    else {
      $options['attributes']['class'] = 'active';
    }
  }

  // Remove all HTML and PHP tags from a tooltip. For best performance, we act only
  // if a quick strpos() pre-check gave a suspicion (because strip_tags() is expensive).
  if (isset($options['attributes']['title']) && strpos($options['attributes']['title'], '<') !== FALSE) {
    $options['attributes']['title'] = strip_tags($options['attributes']['title']);
  }

  return '<a href="'. check_url(url($path, $options)) .'"'. drupal_attributes($options['attributes']) .'><b>'. ($options['html'] ? $text : check_plain($text)) .'</b></a>';
}

не уверен, как включить то, что мне нужно, в эту функцию.

Так что на домашней странице отсутствует узел? Q =, и если я добавляю амперсанд, он выдает ошибку.

http://www.site.com/&attr=1234 // throws error

Но если я модифицирую его в правильный формат, он будет работать нормально

http://www.site.com/?attr=1234

Ответы [ 5 ]

2 голосов
/ 18 октября 2010

Предполагая, что когда вы имеете в виду страницы, вы имеете в виду тип контента страниц (будет работать для любого другого типа контента, если это действительно контент, а не что-то в блоке или представлении).

Вы можете легкозамените содержимое любого узла, который должен быть просмотрен, запустив str_replace или регулярное выражение.Например, используя str_replace:

function module_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  switch($op) {
    case "view":
      $node->body = str_replace($expected_link, $desired_link);
      break;
  }
}

, где вы определяете нужную ссылку где-то еще.Не оптимальное решение, но браузеры, не поддерживающие Javascript (да, они все еще существуют!) Не могут обойти принудительные желаемые URL, если вы попытаетесь изменить его с помощью Javascript.

1 голос
/ 18 октября 2010

Я не советую вам использовать jQuery для этого. Лучше всего использовать эту сторону сервера в PHP (Drupal). Вы можете перезаписать ссылки динамически в вашу страницу предварительной обработки .

В вашем файле template.php :

function *yourtheme*_preprocess_page(&$vars, $hook){
  //You can do it for the region that you need
  $vars['content'] = preg_replace('/<a href="(.*?)"/i', '<a href="$1&attr=1234"', $vars['content']);
}

Примечание:

  • Я не пробовал, это только намек.
  • Он также добавит ваши параметры во внешние ссылки.
1 голос
/ 18 октября 2010

Здесь есть хорошее обсуждение связанной темы: http://drupal.org/node/249864

Это не будет использовать jquery (вместо этого вы перезапишете функцию с использованием PHP), но вы можете получить тот же результат.Это предполагает, однако, что вы работаете со ссылками в меню.

1 голос
/ 18 октября 2010

Я думаю, вам следует изучить PURL (http://drupal.org/project/purl) и некоторые модули, с которыми он работает, например. пробелы и контекст.

1 голос
/ 18 октября 2010

Я думаю, что делать это в Drupal / PHP было бы чище. Проверьте модуль Pathauto: http://drupal.org/node/17345

...