Проблемы с тегом изображения при использовании CKEditor
Я использую Uploadcare для загрузки и хранения изображений, и это работает.
Тем не менее, похоже, что CKEditor 4.1.1 задыхается от этих изображений.
Добавление изображения через CKEditor.
Первоначальное расположение изображения соответствует ожидаемому. Тем не менее, когда данные сохраняются, CKEditor явно делает что-то странное перед фиксацией данных.
В нескольких тестах, во время форматирования и перестановки HTML, CKEditor убирает атрибут изображения "style" и первую открывающую двойную кавычку, которую я вижу в текстовых данных самой базы данных.
Такое поведение полностью воспроизводимо.
Редактирование изображения через CKEditor.
Изначально изображение выглядит нормально. Но когда я просматриваю исходный код, HTML-код изображения очищается для отображения в виде текста, а не для отображения в качестве объекта изображения.
Отключение сторонних плагинов.
Как упоминалось ранее, я использую Uploadcare, в дополнение к Word Count и Char Count. Я отключил оба плагина, но это ничего не изменило.
Мысли.
В процессе сохранения я просто очищаю данные с помощью функции $this->db->escape() в CodeIgniter, которую невозможно обойти, иначе данные не будут зафиксированы, и я получу ошибку.
Просто чтобы быть ясно, во время тестирования, ошибки возникли с любым типом объекта изображения; либо добавлены вручную, либо через Uploadcare.
На моей странице просмотра у меня есть:
<script type="text/javascript">
CKEDITOR.replace('note', {
allowedContent: true
});
</script>
Что - согласно документации - "отключит фильтр (данные не будут фильтроваться, все функции будут активированы)".
Однако, это не работает, и это делает точно так же, как раньше; удаление атрибута style по имени и преобразование HTML в их обычные текстовые эквиваленты.
Если я выберу что-то конкретное, это отключит почти все, включая плагины, и - как ни странно - то самое, для чего я написал правило:
<script type="text/javascript">
CKEDITOR.replace('note', {
allowedContent: {
'img': {
styles: 'height, width'
}
}
});
</script>
Поэтому я понятия не имею, что происходит.
Я также попробовал совет в ветке на их форумах, где кто-то испытывает точно такую же проблему, как и я, но ни один из методов не работает, что позволяет мне полагать, что это проблема, связанная с самим CKEditor, а не с обработкой данных. само по себе.
Если у кого-нибудь есть какие-либо советы относительно того, как я могу убедить CKEditor в передаче изображений, я буду рад любому совету.
2 ответа
- настройка
allowedContent: true
на 99,9% остановит CKEditor разбор изображений, если вы сделаете это правильно. Ваш
allowedContent
настройка (2-й пример кода) неверна. Не позволяетsrc
а такжеalt
атрибутов. Изображение безsrc
будет отброшен CKEditor как недействительный. Так что вы должны иметь по крайней мере:allowedContent: { img: { attributes: '!src, alt', // src is required styles: 'height, width' } }
- Так что пункт 1. или 2. должен работать - я делал это много раз, поэтому я в этом уверен. Таким образом, я думаю, что у вас есть вторая проблема, когда ваш сервер что-то ломает.
Проблема здесь (помимо необходимости в allowContent: true или правильно установленных правилах) заключается в XSS-фильтрации CodeIgniter. Прежде чем мы получим доступ к $_POST (или $_GET/$_REQUEST), CI уже запустил фильтрацию этих данных и в этом случае уничтожил их. Этот параметр нельзя изменить для каждого контроллера, так как он уже запущен до загрузки контроллера.
Таким образом, вы можете полностью отключить его в /application/config/config.php (не рекомендуется)
$config['global_xss_filtering'] = FALSE;
Или менее сложный подход (но все же не идеальный), чтобы вручную отключить его на определенных страницах (например, в моем примере отключить его на всех страницах в / admin / help). Также в /application/config/config.php.
$config['global_xss_filtering'] = TRUE;
# Override the XSS filtering on /admin/help
if (preg_match("/^\/admin\/help/", $_SERVER["QUERY_STRING"])) {
$config['global_xss_filtering'] = FALSE;
}
У меня были именно те проблемы, которые у вас были, и это решило проблему для меня.