Как разрешить скрипты в TinyMCE на CMS-страницах Prestashop 9

    При редактировании контента в админке Prestashop 9 пользователи часто сталкиваются с проблемой: редактор TinyMCE вырезает или блокирует вставку JavaScript, CSS и других скриптов. Это связано с обновлённой системой безопасности и новым API редактора, который в версии 9 значительно отличается от Prestashop 1.5. В этой статье мы разберём несколько способов отключить фильтрацию кода и разрешить загрузку скриптов в CMS-страницах.

    Почему TinyMCE блокирует скрипты в Prestashop 9

    Начиная с версии 8.x, Prestashop использует обновлённую версию TinyMCE, которая по умолчанию применяет строгую валидацию входящего HTML. Редактор удаляет теги script, style, iframe и атрибуты on* для предотвращения XSS-атак. В Prestashop 9 эта защита усилена, поэтому старые методы отключения фильтрации (через конфиги или модули) перестали работать. Чтобы обойти ограничение, нужно изменить настройки редактора на уровне ядра или через переопределение.

    Способ 1: Отключение валидации в конфигурации TinyMCE

    Первый и самый безопасный метод - отключить проверку кода непосредственно в параметрах редактора. Для этого откройте файл /admin/themes/default/template/controllers/cms_content/helpers/form/form.tpl (путь может отличаться в зависимости от темы админки). Найдите строку, где инициализируется TinyMCE, и добавьте параметр valid_elements: '*[*]', который разрешает все теги и атрибуты. Пример:

    tinyMCE.init({
      selector: 'textarea.rte',
      valid_elements: '*[*]',
      extended_valid_elements: 'script[src|type|async|defer],iframe[src|width|height|frameborder]'
    });

    После внесения правок обязательно очистите кэш Prestashop в разделе «Настройки → Производительность» и кэш браузера.

    Способ 2: Изменение параметров через модуль переопределения

    Если вы не хотите редактировать файлы ядра, создайте собственный модуль или используйте хуки. В Prestashop 9 доступен хук actionAdminControllerSetMedia, через который можно добавить свой JavaScript, переопределяющий настройки TinyMCE. Пример кода для вставки в модуль:

    public function hookActionAdminControllerSetMedia() {
      $this->context->controller->addJS($this->_path.'views/js/tinymce_custom.js');
    }

    В файле tinymce_custom.js пропишите параметры, аналогичные первому способу, но с дополнительной проверкой на существование редактора. Этот метод сохраняет изменения при обновлении CMS.

    Способ 3: Отключение проверки кода через базу данных

    В Prestashop 9 часть настроек редактора хранится в таблице ps_configuration. Найдите запись с именем PS_TINYMCE_CONFIG и измените её значение, добавив параметры valid_elements и extended_valid_elements. Учтите, что после обновления CMS эта запись может быть перезаписана, поэтому рекомендуется комбинировать этот способ с переопределением через модуль.

    Особенности для разных версий Prestashop

    В Prestashop 1.5-1.6 достаточно было отключить опцию «Использовать HTMLPurifier» в настройках. В версии 9 такой опции нет - фильтрация встроена в сам редактор. Если вы обновлялись с 8.x до 9, проверьте, не остались ли старые модули, которые могли конфликтовать с TinyMCE. Рекомендуется отключить все сторонние редакторы и использовать только встроенный.

    Как проверить, что скрипты работают

    После внесения изменений создайте новую CMS-страницу в админке (например, «О нас»), переключитесь в режим исходного кода (кнопка «Source code») и вставьте тестовый скрипт, например <script>alert('test')</script>. Сохраните страницу и откройте её на фронтенде. Если скрипт выполнился - настройка прошла успешно. Если нет - проверьте кэш и права на файлы.

    Безопасность при включении скриптов

    Разрешая скрипты на CMS-страницах, вы снижаете защиту от XSS-атак. Убедитесь, что доступ к редактированию контента есть только у доверенных администраторов. Используйте Content Security Policy (CSP) на уровне сервера, чтобы ограничить выполнение скриптов только с проверенных источников. В Prestashop 9 можно добавить CSP через файл .htaccess или конфигурацию веб-сервера.

    Часто задаваемые вопросы