cestclaire Posted July 11, 2022 at 09:38 AM Share Posted July 11, 2022 at 09:38 AM После переезда на новый хостинг и ряда мелких работ по оптимизации на сайте стали некорректно сохраняться все текстовые блоки - неважно, в статьях ли, в описании товаров. Установить, какое именно изменение привело к такой проблеме, невозможно. Выглядит так: При создании текста в редакторе (штатный ckeditor) или через исходный код всё выглядит прекрасно, после сохранения в визуальном редакторе весь текст оказывается с html разметкой, а в исходном коде вот так magic_quotes_gpc отключены (техподдержка подтвердила) config.allowedContent = true; в config.js прописано Имеющиеся тексты не затронуло, только созданные новые или отредактированные старые. Помогите, пожалуйста. 0 Quote Link to comment Share on other sites More sharing options...
nikifalex Posted July 11, 2022 at 11:13 AM Share Posted July 11, 2022 at 11:13 AM посмотрите что именно в базе через phpmyadmin. там где правильно и там где неправильно. 1 Quote Link to comment Share on other sites More sharing options...
cestclaire Posted July 13, 2022 at 09:03 AM Author Share Posted July 13, 2022 at 09:03 AM (edited) В 11.07.2022 в 14:13, nikifalex сказал: посмотрите что именно в базе через phpmyadmin. там где правильно и там где неправильно. Цитата из БД начала той же статьи: &lt;p&gt;В нашем магазине вы можете оформить подарочный сертификат на любую сумму для дальнейшей отправки получателю в электронном виде.&lt;/p&gt; Цитата из старой статьи, сохраненной в адекватном виде: <p>Мы благодарны покупателям, оставляющим отзывы о наших товарах и нашей работе. Мы рады получать не только тёплые слова благодарности, но и критику, благодаря которой мы улучшаем ассортимент и сервис.</p> UPD - спасибо за подсказку, так я хотя бы могу вносить правки напрямую в БД пока не получится наладить редактор. Edited July 13, 2022 at 05:44 PM by cestclaire 0 Quote Link to comment Share on other sites More sharing options...
AlexDW Posted July 13, 2022 at 10:11 AM Share Posted July 13, 2022 at 10:11 AM убедитесь что в файле admin\view\javascript\ckeditor\config.js такие значения стоят: config.htmlEncodeOutput = false; config.entities = false; 1 Quote модули для удобной работы с Opencart Link to comment Share on other sites More sharing options...
cestclaire Posted July 13, 2022 at 05:36 PM Author Share Posted July 13, 2022 at 05:36 PM (edited) 7 часов назад, AlexDW сказал: убедитесь что в файле admin\view\javascript\ckeditor\config.js такие значения стоят: config.htmlEncodeOutput = false; config.entities = false; К сожалению, не помогло. Этих строк не было, я добавила. Может быть куда-то не туда вписала? Edited July 13, 2022 at 05:37 PM by cestclaire 0 Quote Link to comment Share on other sites More sharing options...
AlexDW Posted July 13, 2022 at 06:01 PM Share Posted July 13, 2022 at 06:01 PM у вас явно не штатная версия редактора стоит, стандартная датирована 2012 годом попробуйте переименовать свою папку admin\view\javascript\ckeditor в ckeditor_old скопируйте оригинальную папку из дистрибутива вашей версии, обновите кеш браузера и проверьте 0 Quote модули для удобной работы с Opencart Link to comment Share on other sites More sharing options...
cestclaire Posted July 13, 2022 at 06:04 PM Author Share Posted July 13, 2022 at 06:04 PM 1 минуту назад, AlexDW сказал: у вас явно не штатная версия редактора стоит, стандартная датирована 2012 годом попробуйте переименовать свою папку admin\view\javascript\ckeditor в ckeditor_old скопируйте оригинальную папку из дистрибутива вашей версии, обновите кеш браузера и проверьте Стояла штатная, была попытка поправить ситуацию обновлением редактора, но успехом она не увенчалась, проблема осталась в прежнем виде. 0 Quote Link to comment Share on other sites More sharing options...
AlexDW Posted July 13, 2022 at 06:25 PM Share Posted July 13, 2022 at 06:25 PM сравните файл system\library\request.php с файлом из дистрибутива (если стоит vqmod - то сравнивайте измененный файл, если он там есть) 1 Quote модули для удобной работы с Opencart Link to comment Share on other sites More sharing options...
cestclaire Posted July 13, 2022 at 06:33 PM Author Share Posted July 13, 2022 at 06:33 PM 1 минуту назад, AlexDW сказал: сравните файл system\library\request.php с файлом из дистрибутива (если стоит vqmod - то сравнивайте измененный файл, если он там есть) Открыла в соседних вкладках, совершенно идентичны. В кэше vqmod request.php нет. ckeditor тоже поставила тот, что был в дистрибутиве - ничего не изменилось. Ну то есть редактор изменился, видно что другая, явно более старая версия, но проблема сохранилась. Цитата config.htmlEncodeOutput = false; config.entities = false; Две эти строки уже стояли. Пробовала дописать еще config.allowedContent = true; (по совету другого специалиста), тоже никаких изменений. Кэш после каждого изменения каждый раз чищу весь, в браузере тоже. Большое спасибо что пытаетесь помочь. Я, если честно, близка к отчаянию. 0 Quote Link to comment Share on other sites More sharing options...
Tom Posted July 14, 2022 at 03:41 AM Share Posted July 14, 2022 at 03:41 AM Попробуйте всё же вариант с заменой редактора. Но только теперь не чистите кэш, а откройте магазин в режиме Инкогнито. 1 Quote Link to comment Share on other sites More sharing options...
AlexDW Posted July 14, 2022 at 06:17 AM Share Posted July 14, 2022 at 06:17 AM попробуйте поменять название какого-нибудь товара, добавьте кавычки, сохраните пару раз и смотрите, что будет в названии и что фактически в БД 1 Quote модули для удобной работы с Opencart Link to comment Share on other sites More sharing options...
cestclaire Posted July 14, 2022 at 09:26 AM Author Share Posted July 14, 2022 at 09:26 AM (edited) 5 часов назад, Tom сказал: Попробуйте всё же вариант с заменой редактора. Но только теперь не чистите кэш, а откройте магазин в режиме Инкогнито. Привет! Я не думаю, что проблема может быть хоть сколько-то в браузере. Она проявляется на разных устройствах совершенно одинаково. Плюс мне также кажется, что проблема даже и не в редакторе - изначально я её заметила при работе с batch editor и массовым добавлением заготовленных шаблонов в description (текст с html разметкой, например заголовок "таблица размеров", затем сама таблица вставленным изображением). И если раньше всё добавлялось правильно, визуально верно со стороны витрины, то в тот раз я увидела, что блоки добавляются с html разметкой не в исходный код, а в конечный. Написала разработчику, он покрутил, посмотрел, и мы с ним обнаружили, что проблема не в batch editor, а во всех текстовых блоках на сайте. Так вот, почему я считаю, что проблема даже не в редакторе - я использовала готовые шаблоны, которые были созданы и сохранены до возникновения проблемы, и она их не затронула, как и прочие старые тексты, и по идее они по команде должны дописываться в заданное место сразу в БД, но записываются уже в искажённом виде. Редактор в данном случае используется исключительно для просмотра итогового результата. Edited July 14, 2022 at 09:27 AM by cestclaire 0 Quote Link to comment Share on other sites More sharing options...
nikifalex Posted July 14, 2022 at 09:29 AM Share Posted July 14, 2022 at 09:29 AM сталкивался я с этой проблемой лет 10 назад тоже на opencart 1.5 Но никак не могу вспомнить как это исправляется. Если я не путаю, то дело именно в настройках хостинга и конфликте с какими то вещами в opencart. типа magic_quotes_gpc но что-то другое, подобное. и если на не путаю, эта похожая проблема на проблему с поиском русских слов или кавычек 1 Quote Link to comment Share on other sites More sharing options...
cestclaire Posted July 14, 2022 at 09:37 AM Author Share Posted July 14, 2022 at 09:37 AM 3 часа назад, AlexDW сказал: попробуйте поменять название какого-нибудь товара, добавьте кавычки, сохраните пару раз и смотрите, что будет в названии и что фактически в БД Вы правы, в названии тоже преобразуются символы. Вписала в название Проверка названия " < >, после сохранения вижу Проверка названия " < > 4 минуты назад, nikifalex сказал: сталкивался я с этой проблемой лет 10 назад тоже на opencart 1.5 Но никак не могу вспомнить как это исправляется. Если я не путаю, то дело именно в настройках хостинга и конфликте с какими то вещами в opencart. типа magic_quotes_gpc но что-то другое, подобное. и если на не путаю, эта похожая проблема на проблему с поиском русских слов или кавычек Я тоже уверена, что дело в каких-то настройках, потому что проблема возникла после переезда на новый хостинг - однако получается, что утверждать на 100% я не могу, потому как после переезда была еще пара доработок по оптимизации. И вышло так, что к работе с текстовыми блоками я приступила уже после всех этих доработок. 0 Quote Link to comment Share on other sites More sharing options...
AlexDW Posted July 14, 2022 at 01:51 PM Share Posted July 14, 2022 at 01:51 PM 3 часа назад, cestclaire сказал: Вы правы, в названии тоже преобразуются символы. Вписала в название Проверка названия " < >, после сохранения вижу Проверка названия " < > значит редактор здесь ни при чем если проблема носит массовый характер, вероятно причина либо в настройках сервера mysql, либо в настройках соединения с ним, либо в структуре БД убедитесь что в настройках БД MySQL-кодировка: UTF-8 Unicode (utf8) Сопоставление соединения с MySQL: utf8_unicode_ci сравните с оригиналами свои файлы system\library\db.php system\database\mysql.php system\database\mysqli.php (при сравнении не забывайте про vqmod) 1 Quote модули для удобной работы с Opencart Link to comment Share on other sites More sharing options...
mpn2005 Posted July 14, 2022 at 06:33 PM Share Posted July 14, 2022 at 06:33 PM В 13.07.2022 в 12:03, cestclaire сказал: Цитата из БД начала той же статьи: &lt;p&gt;В нашем магазине вы можете оформить подарочный сертификат на любую сумму для дальнейшей отправки получателю в электронном виде.&lt;/p&gt; Цитата из старой статьи, сохраненной в адекватном виде: <p>Мы благодарны покупателям, оставляющим отзывы о наших товарах и нашей работе. Мы рады получать не только тёплые слова благодарности, но и критику, благодаря которой мы улучшаем ассортимент и сервис.</p> Похоже, что на каком-то этапе происходит повторное экранирование HTML сущностей. Вот что получается: Оригинал: <p> Первое преобразование: <p> < - это < > - это > Второе преобразование: &lt;p&gt; & - Это уже ненужная замена & на & Как костыль - можно на фронте два раза описание прогнать через html_entity_decode После вот такой строки в catalog/controller/product/product.php: $this->data['description'] = html_entity_decode($product_info['description'], ENT_QUOTES, 'UTF-8'); Добавить ещё один прогон: $this->data['description'] = html_entity_decode($this->data['description'], ENT_QUOTES, 'UTF-8'); Но вообще надо разбираться, где вклинивается лишнее преобразование html сущностей. Штатное проходит в библиотеке system/library/request.php там все _GET и _POST прогоняются через функцию htmlspecialchars Но в данном случае, похоже, есть ещё какой-то лишний прогон. Может вклинивается какой-то модуль. Может и хостинг шалить, тут ничего нельзя исключать. 1 Quote Link to comment Share on other sites More sharing options...
cestclaire Posted July 17, 2022 at 12:55 PM Author Share Posted July 17, 2022 at 12:55 PM (edited) В 14.07.2022 в 21:33, mpn2005 сказал: Как костыль - можно на фронте два раза описание прогнать через html_entity_decode К сожалению, костыль не помог - строку вставила, весь кэш почистила, проблема осталась. UPD - прошу прощения, затупила, вы же написали что на фронте, а я продолжила проверять повторным просмотром текста в админке. Действительно, на фронте всё прилично, двойное кодирование расшифровывается. И я теперь терзаюсь - вроде можно продолжать работать (а то я уже три недели не могу добавлять товары на сайт, там каждый раз нужна доработка description), а вроде и не хочется засорять БД тем кривым кодом, что продолжает туда писаться. В 14.07.2022 в 16:51, AlexDW сказал: убедитесь что в настройках БД MySQL-кодировка: UTF-8 Unicode (utf8) Сопоставление соединения с MySQL: utf8_unicode_ci Сопоставление было utf8_general_ci, я исправила на utf8_unicode_ci, но тоже ничего не поменялось. В 14.07.2022 в 16:51, AlexDW сказал: сравните с оригиналами свои файлы system\library\db.php system\database\mysql.php system\database\mysqli.php system\database\mysqli.php идентичен system\library\db.php различается на одну строку в оригинале и в кэше vqmod в оригинале: require_once(DIR_DATABASE . $driver . '.php'); в кэше vqmod: require_once(\VQMod::modCheck(DIR_DATABASE . $driver . '.php')); system\database\mysql.php различается вместо вот этих строк public function query($sql) { if ($this->link) { $resource = mysql_query($sql, $this->link); в файле на сайте находится вот такой кусок кода public function query($sql) { if ($this->link) { $sysstart = microtime(true); $resource = mysql_query($sql, $this->link); $row = array(); if(DEBUG){ $caller = debug_backtrace(); $row['file'] = $caller[1]['file']; $row['line'] = $caller[1]['line']; $row['Duration'] = round(( microtime(true) - $sysstart), 5); $row['Query'] = $sql; Debug::$_profs[] = $row; } Остальное идентично. Большое спасибо, что пытаетесь помочь. Edited July 17, 2022 at 01:03 PM by cestclaire 0 Quote Link to comment Share on other sites More sharing options...
Solution AlexDW Posted July 17, 2022 at 01:44 PM Solution Share Posted July 17, 2022 at 01:44 PM 9 минут назад, cestclaire сказал: Сопоставление было utf8_general_ci, я исправила на utf8_unicode_ci тогда верните как было, хотя в принципе особой разницы нет 17 минут назад, cestclaire сказал: в оригинале: ... вместо вот этих строк здесь нет ничего, что влияло бы на двойное преобразование получается, либо на самом сервере какая-то настройка такое дает либо где-то в коде вашего движка но вроде все доступные в коде места, где такое могло быть, просмотрели еще, в виде эксперимента - попробуйте в файле system\library\request.php заменить строку $data = htmlspecialchars($data, ENT_COMPAT, 'UTF-8'); на $data = htmlspecialchars($data, ENT_COMPAT, 'UTF-8', false); потом создайте новую статью в админке, с кавычками и тд, сохраните и посмотрите 3 Quote модули для удобной работы с Opencart Link to comment Share on other sites More sharing options...
cestclaire Posted July 17, 2022 at 02:00 PM Author Share Posted July 17, 2022 at 02:00 PM 13 минут назад, AlexDW сказал: еще, в виде эксперимента - попробуйте в файле system\library\request.php заменить строку $data = htmlspecialchars($data, ENT_COMPAT, 'UTF-8'); на $data = htmlspecialchars($data, ENT_COMPAT, 'UTF-8', false); Сработало! Теперь адекватно отображается и в админке, и на фронте. Спасибо вам большое 0 Quote Link to comment Share on other sites More sharing options...
AlexDW Posted July 17, 2022 at 03:49 PM Share Posted July 17, 2022 at 03:49 PM 1 час назад, cestclaire сказал: Сработало! Теперь адекватно отображается и в админке, и на фронте. главное потом про эту правку не забудьте, если вдруг где-то что-то побочное всплывет это больше "костыльное" решение, по уму нужно первопричину двойного кодирования устранить но мысли пока кончились по этому поводу разве что у вас где-то идет переопределение самой функции htmlspecialchars 0 Quote модули для удобной работы с Opencart Link to comment Share on other sites More sharing options...
cestclaire Posted July 17, 2022 at 03:52 PM Author Share Posted July 17, 2022 at 03:52 PM Я пока отметила как решённое, но тема остаётся открытой, может кому-то что-то придёт в голову. Спасибо большое 0 Quote Link to comment Share on other sites More sharing options...
cestclaire Posted July 18, 2022 at 11:13 AM Author Share Posted July 18, 2022 at 11:13 AM Итак, я могла бы стыдливо промолчать, но я смело признаюсь, что вся проблема оказалась в том, что я долблюсь в глазки. Проблему решил без костылей фикс от разработчика модуля оптимизации БД (индексы и кэш), о котором было написано в мануале, который я честно читала, да главное упустила. Необходимо было заменить файл system\library\request.php на содержащий следующий код: <?php class Request { public $get = array(); public $post = array(); public $cookie = array(); public $files = array(); public $server = array(); protected static $im_is_cleaned = false; public function __construct() { if (!Request::$im_is_cleaned) { $_GET = $this->clean($_GET); $_POST = $this->clean($_POST); $_REQUEST = $this->clean($_REQUEST); $_COOKIE = $this->clean($_COOKIE); $_FILES = $this->clean($_FILES); $_SERVER = $this->clean($_SERVER); Request::$im_is_cleaned = true; } $this->get = $_GET; $this->post = $_POST; $this->request = $_REQUEST; $this->cookie = $_COOKIE; $this->files = $_FILES; $this->server = $_SERVER; } public function clean($data) { if (is_array($data)) { foreach ($data as $key => $value) { unset($data[$key]); $data[$this->clean($key)] = $this->clean($value); } } else { $data = htmlspecialchars($data, ENT_COMPAT, 'UTF-8'); } return $data; } } ?> и всё заработало без костылей. Ещё раз спасибо всем тем, кто пытался помочь и помог, а тема останется в помощь тем, кто столкнется с той же проблемой и в назидание потомкам - RTFM! 0 Quote Link to comment Share on other sites More sharing options...
nikifalex Posted July 18, 2022 at 12:09 PM Share Posted July 18, 2022 at 12:09 PM 55 минут назад, cestclaire сказал: фикс от разработчика модуля оптимизации БД (индексы и кэш) а можно ссылку то на этот модуль? уж очень он загадочный 1 Quote Link to comment Share on other sites More sharing options...
cestclaire Posted July 18, 2022 at 12:13 PM Author Share Posted July 18, 2022 at 12:13 PM https://shop.opencart-russia.ru/imdboptimizer15 Покупала здесь. На этом форуме модуля вроде бы нет. Сам модуль сработал прекрасно, нагрузка на MySQL снизилась в 100 раз. 0 Quote Link to comment Share on other sites More sharing options...
cestclaire Posted July 18, 2022 at 12:14 PM Author Share Posted July 18, 2022 at 12:14 PM 5 минут назад, nikifalex сказал: а можно ссылку то на этот модуль? уж очень он загадочный https://shop.opencart-russia.ru/imdboptimizer15 Покупала здесь. На этом форуме модуля вроде бы нет. Сам модуль сработал прекрасно, нагрузка на MySQL снизилась в 100 раз. 0 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.