Именованный якорь
Последнее обновление Oct 20th, 2026 | История страницы | Улучшить эту страницу | Сообщить о проблеме
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
Budget
$194 per month—let's make that $500!
Learn moreЧто такое именованный якорь?¶
Именованный якорь — это ссылка на место внутри текущего ресурса.
Типичный именованный якорь выглядит так:
<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]].
Смотрите также¶
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
Budget
$194 per month—let's make that $500!
Learn more










