Jump to main content Jump to doc navigation

Что такое именованный якорь?

Именованный якорь — это ссылка на место внутри текущего ресурса.

Типичный именованный якорь выглядит так:

<a name="prohibited"></a>

С включёнными дружественными URL-адресами обычная ссылка href="#prohibited" уводит браузер в корень сайта: у адреса страницы нет своего фрагмента, к которому можно привязаться. Есть два способа собрать ссылку так, чтобы она работала.

Ссылка на якорь вручную

Ссылка на текущий ресурс с именованным якорем «prohibited»:

<a href="[[~[[*id]]]]#prohibited">Prohibited Activities</a>

Ссылка на ресурс с идентификатором 12 с тем же якорем:

<a href="[[~12]]#prohibited">Prohibited Activities</a>

[!WARNING] Путь, который возвращает [[~id]], относителен к сайту, поэтому он верен только тогда, когда в шаблоне есть <base href="[[!++site_url]]" />. Без <base href> браузер отсчитывает путь от адреса текущей страницы, и ссылка ломается на каждой странице, которая лежит глубже корня.

Тегу нужен сам тег в head:

<base href="[[!++site_url]]" />

Схему ссылки задаёт системная настройка link_tag_scheme. Значение по умолчанию -1 даёт относительный URL, full — абсолютный. Каждая ссылка может попросить свою схему:

<a href="[[~12? &scheme=`full`]]#prohibited">Prohibited Activities</a>

Добавление адреса плагином

Другой способ — плагин, который добавляет адрес текущего ресурса к каждому якорю.

Это делает экстра AnchorsAway. Свой плагин делает то же самое: поместите код ниже в новый плагин и назначьте его на вкладке «Системные события» событию OnWebPagePrerender. Код взят из треда Plugin: AnchorsAway в архиве старого форума.

if ($modx->resource->get('id') != $modx->config['site_start']) {
    $modx->resource->_output = str_replace('href="#', 'href="' . $modx->makeUrl($modx->resource->get('id')) . '#', $modx->resource->_output);
}

Сначала код проверяет, что мы не на главной странице: там добавлять адрес не нужно. Когда это не так, он заменяет все вхождения href="# на href="<адрес>#, и якоря начинают работать.

[!TIP] OnWebPagePrerender вызывается после того, как страница собрана, и до того, как она отправлена, поэтому изменение $modx->resource->_output, сделанное в событии, доходит до браузера.

Ещё два места в ядре делают ту же правку:

  • modX::beforeRender() — публичный метод класса modX, вызывается прямо перед OnWebPagePrerender. Класс, наследующий modX, может переопределить его и изменить вывод там.
  • Событие парсера OnParseDocument — получает разбираемое содержимое, поэтому якоря можно исправить прямо в содержимом. Событие срабатывает на каждом проходе разбора, поэтому правка должна быть безопасна при повторе.

С плагином на месте ссылка на якорь другого ресурса по-прежнему выглядит как [[~12]].

Смотрите также

  1. Интеграция шаблонов
  2. Серия видео «Быстрый старт»
  3. Именованный якорь
  4. Шаблоны
  5. Чанки
  6. Сниппеты

Support the team building MODX with a monthly donation.

The budget raised through OpenCollective is transparent, including payouts, and any contributor can apply to be paid for their work on MODX.

Backers

  • modmore
  • STERC
  • Digital Penguin
  • Jens Wittmann – Gestaltung & Entwicklung
  • CrewMark
  • Fabian Christen
  • Sepia River Studios
  • Dannevang Digital
  • A. Moreno
  • Alex
  • Chris Fickling
  • Stéphane Jäggi
  • Murray Wood
  • Anton Tarasov
  • JT Skaggs
  • deJaya
  • Lefthandmedia
  • eydolan
  • Following Sea
  • Guido Gallenkamp
  • YJ
  • Raffy
  • Snow Creative
  • Nick Clark
  • Guest
  • Helen
  • krisznet
  • Yanni
  • Richard

Budget

$194 per month—let's make that $500!

Learn more