Настройка ссылок с rel="dofollow" для администратора в Cotonti (CKEditor + HTML Purifier)
Описание: Полная инструкция по изменению поведения редактора ссылок. Администратор получает ссылки с rel="dofollow" и без принудительных target="_blank", noreferrer, noopener. Обычные пользователи сохраняют стандартное поведение CKEditor. Все изменения выполняются через правку пресета HTML Purifier и условного блока в шаблоне, без вмешательства в ядро системы.
Шаг 1. Настройка HTML Purifier (разрешить rel="dofollow" и запретить target для администратора)
Файл: plugins/htmlpurifier/presets/htmlpurifier.group_5.preset.php
- было
'HTML.Nofollow'=> true, - стало
'HTML.Nofollow'=>false,
Затем, Добавьте в массив $htmlpurifier_preset две строки (если их нет):
'Attr.AllowedRel' => ['dofollow', 'nofollow', 'noreferrer', 'noopener', 'external', 'ugc', 'sponsored'],
'HTML.ForbiddenAttributes' => ['*@target'],
Первая строка разрешает HTML Purifier оставлять у ссылок атрибут rel с перечисленными значениями (в том числе dofollow, которое по умолчанию вырезается).
Вторая строка полностью удаляет атрибут target у всех элементов (включая ссылки), поэтому администратор никогда не получит target="_blank".
Убедитесь, что в том же массиве есть 'HTML.Nofollow' => false (обычно уже стоит) — это отключает принудительную вставку nofollow.
Шаг 2. Настройка CKEditor (только для администратора)
В шаблоне, который выводит редактор (например, market.edit.tpl, page.edit.tpl), перед формой вставьте следующий блок:
<!-- IF {PHP.usr.maingrp} == 5 -->
<script>
var ckeditorConfig = {
link: {
addTargetToExternalLinks: false,
decorators: {
dofollow: {
mode: 'manual', // ручной чекбокс в диалоге ссылки
label: 'dofollow', // подпись рядом с чекбоксом
attributes: {
rel: 'dofollow' // устанавливаемый атрибут
}
}
}
}
};
</script>
<!-- ENDIF -->
Этот код:
- Отключает автоматическое добавление
target="_blank" и rel="noreferrer noopener" для администратора. - Добавляет в диалог вставки/редактирования ссылки чекбокс с подписью «dofollow».
Если чекбокс отмечен — ссылка получит rel="dofollow".
Если не отмечен — ссылка останется без атрибута rel (или с тем, что вы укажете вручную).
Обычные пользователи (не группа 5) не увидят этот блок, и для них CKEditor продолжит работать со стандартными настройками.
Шаг 3. Очистка кэша браузера
После сохранения всех файлов откройте страницу с редактором и нажмите Ctrl+Shift+R (или Cmd+Shift+R на macOS) — это загрузит обновлённые скрипты.
Результат
- Администратор:
– Ссылки никогда не содержат target="_blank", noreferrer, noopener.
– При вставке ссылки доступен чекбокс «dofollow», который управляет атрибутом rel.
– HTML Purifier больше не вырезает rel="dofollow" и убирает target при сохранении. - Обычный пользователь:
– Поведение не меняется: внешние ссылки по‑прежнему получают target="_blank" и rel="noreferrer noopener". - Другие шаблоны: если CKEditor используется на других страницах (статьи, комментарии), повторите Шаг 2 для соответствующих шаблонов.
- Обратная совместимость: если нужно временно вернуть старое поведение для админа, достаточно удалить или закомментировать условный блок в шаблоне. Настройки Purifier можно оставить — они не мешают.
Данная инструкция проверена на Cotonti с CKEditor и HTML Purifier. Если что‑то пойдёт не так, убедитесь, что файлы сохранены без синтаксических ошибок и кэш браузера действительно сброшен.
Может кому пригодится, Вот именно мой файл: plugins/htmlpurifier/presets/htmlpurifier.group_5.preset.php
<?php
/**
* HTML Purifier preset for Superadmins (MainGroupId=5)
*
* @package HTML Purifier
* @copyright (c) Cotonti Team
* @license https://github.com/Cotonti/Cotonti/blob/master/License.txt
*/
defined('COT_CODE') or die('Wrong URL');
require_once Cot::$cfg['plugins_dir'] . '/htmlpurifier/lib/standalone/HTMLPurifier/Filter/YouTube.php';
/**
* HTML Purifier config set
* @see http://htmlpurifier.org/live/configdoc/plain.html
*/
$htmlpurifier_preset = [
// === Автоформатирование ===
'AutoFormat.AutoParagraph' => false, // Не оборачивать автоматически текст в <p>
'AutoFormat.DisplayLinkURI' => false, // Не показывать URL рядом со ссылкой
'AutoFormat.Linkify' => false, // Не превращать обычные URL в ссылки
'AutoFormat.RemoveEmpty.RemoveNbsp' => false, // Не удалять при удалении пустых элементов
'AutoFormat.RemoveEmpty' => true, // Удалять пустые элементы (например, <span></span>)
'AutoFormat.RemoveSpansWithoutAttributes' => true, // Удалять <span> без атрибутов
// === Пользовательские фильтры ===
'Filter.Custom' => [], // Дополнительные фильтры не добавляем
// === HTML и вывод ===
'HTML.Allowed' => null, // Разрешены все теги (null = использовать политику по умолчанию)
'HTML.FlashAllowFullScreen' => true, // Разрешить полноэкранный режим для Flash (устаревшее, но оставлено)
'HTML.Nofollow' => false, // НЕ добавлять автоматически rel="nofollow" ко всем ссылкам
'HTML.SafeObject' => true, // Включать безопасный режим для <object>
'HTML.SafeEmbed' => true, // Включать безопасный режим для <embed>
// === ДОБАВЛЕНО: управление rel и target для администратора ===
// Разрешаем только указанные значения для атрибута rel (остальные будут вырезаны)
'Attr.AllowedRel' => ['dofollow', 'nofollow', 'noreferrer', 'noopener', 'external', 'ugc', 'sponsored'],
// Запрещаем атрибут target у всех элементов (в том числе у <a>), чтобы убрать target="_blank"
'HTML.ForbiddenAttributes' => ['*@target'],
// === Доверие и безопасность ===
'HTML.Trusted' => true, // Входные данные считаются доверенными → больше тегов/атрибутов разрешено
'HTML.ForbiddenElements' => ['script'], // Явно запрещаем <script> (несмотря на Trusted)
// === Flash и YouTube ===
'Output.FlashCompat' => true, // Совместимость с Flash (для старых вставок)
'Filter.YouTube' => true, // Включаем фильтр для преобразования YouTube-ссылок во встраиваемые плееры
// === URI ===
'URI.DisableExternal' => false, // Не запрещать внешние ссылки
'URI.DisableExternalResources' => false, // Не запрещать внешние ресурсы (изображения и т.п.)
// === Атрибуты ===
'Attr.AllowedFrameTargets' => array( '_blank', '_self', '_parent', '_top'), // Разрешённые значения target для фреймов (если они есть)
'Attr.EnableID' => true, // Разрешить использование атрибута id (для якорей)
];