Перейти к содержанию

ocStore 1.5.5.1.2 - текст сохраняется с html разметкой


Перейти к решению Решений AlexDW,

Рекомендуемые сообщения

После переезда на новый хостинг и ряда мелких работ по оптимизации на сайте стали некорректно сохраняться все текстовые блоки - неважно, в статьях ли, в описании товаров. Установить, какое именно изменение привело к такой проблеме, невозможно.

 

Выглядит так:

 

При создании текста в редакторе (штатный ckeditor) или через исходный код всё выглядит прекрасно, после сохранения в визуальном редакторе весь текст оказывается с html разметкой, а в исходном коде вот так

image.png.e05050ae5d131de32d1e144b2a8a2e4e.png

 

magic_quotes_gpc отключены (техподдержка подтвердила)

config.allowedContent = true; в config.js прописано

 

Имеющиеся тексты не затронуло, только созданные новые или отредактированные старые.

 

Помогите, пожалуйста.

Ссылка на комментарий
Поделиться на другие сайты

В 11.07.2022 в 14:13, nikifalex сказал:

посмотрите что именно в базе через phpmyadmin. там где правильно и там где неправильно.

 

 

Цитата из БД начала той же статьи:

<p>В нашем магазине вы можете оформить подарочный сертификат на любую сумму для дальнейшей отправки получателю в электронном виде.</p>

 

Цитата из старой статьи, сохраненной в адекватном виде:

<p>Мы благодарны покупателям, оставляющим отзывы о наших товарах и нашей работе. Мы рады получать не только тёплые слова благодарности, но и критику, благодаря которой мы улучшаем ассортимент и сервис.</p&gt

 

UPD - спасибо за подсказку, так я хотя бы могу вносить правки напрямую в БД пока не получится наладить редактор.

Изменено пользователем cestclaire
Ссылка на комментарий
Поделиться на другие сайты

убедитесь что в файле admin\view\javascript\ckeditor\config.js

такие значения стоят:

    config.htmlEncodeOutput = false;
    config.entities = false;

Ссылка на комментарий
Поделиться на другие сайты

7 часов назад, AlexDW сказал:

убедитесь что в файле admin\view\javascript\ckeditor\config.js

такие значения стоят:

    config.htmlEncodeOutput = false;
    config.entities = false;

 

К сожалению, не помогло. Этих строк не было, я добавила. Может быть куда-то не туда вписала?

 

3fb6cae1e9.jpg.22ebb9ec8dc2560a10ac496b41deca93.jpg

 

Изменено пользователем cestclaire
Ссылка на комментарий
Поделиться на другие сайты

у вас явно не штатная версия редактора стоит, стандартная датирована 2012 годом

 

попробуйте переименовать свою папку admin\view\javascript\ckeditor в ckeditor_old

скопируйте оригинальную папку из дистрибутива вашей версии, обновите кеш браузера и проверьте

Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, AlexDW сказал:

у вас явно не штатная версия редактора стоит, стандартная датирована 2012 годом

 

попробуйте переименовать свою папку admin\view\javascript\ckeditor в ckeditor_old

скопируйте оригинальную папку из дистрибутива вашей версии, обновите кеш браузера и проверьте

 

Стояла штатная, была попытка поправить ситуацию обновлением редактора, но успехом она не увенчалась, проблема осталась в прежнем виде.

Ссылка на комментарий
Поделиться на другие сайты

сравните файл system\library\request.php с файлом из дистрибутива

(если стоит vqmod - то сравнивайте измененный файл, если он там есть)

Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, AlexDW сказал:

сравните файл system\library\request.php с файлом из дистрибутива

(если стоит vqmod - то сравнивайте измененный файл, если он там есть)

 

Открыла в соседних вкладках, совершенно идентичны. В кэше vqmod request.php нет.

ckeditor тоже поставила тот, что был в дистрибутиве - ничего не изменилось. Ну то есть редактор изменился, видно что другая, явно более старая версия, но проблема сохранилась.

 

Цитата

    config.htmlEncodeOutput = false;
    config.entities = false;

 

Две эти строки уже стояли. Пробовала дописать еще config.allowedContent = true; (по совету другого специалиста), тоже никаких изменений.

 

Кэш после каждого изменения каждый раз чищу весь, в браузере тоже.

 

Большое спасибо что пытаетесь помочь. Я, если честно, близка к отчаянию.

Ссылка на комментарий
Поделиться на другие сайты

Попробуйте всё же вариант с заменой редактора.

Но только теперь не чистите кэш, а откройте магазин в режиме Инкогнито.

Ссылка на комментарий
Поделиться на другие сайты

попробуйте поменять название какого-нибудь товара,

добавьте кавычки, сохраните пару раз и смотрите, что будет в названии и что фактически в БД

Ссылка на комментарий
Поделиться на другие сайты

5 часов назад, Tom сказал:

Попробуйте всё же вариант с заменой редактора.

Но только теперь не чистите кэш, а откройте магазин в режиме Инкогнито.

 

Привет! Я не думаю, что проблема может быть хоть сколько-то в браузере. Она проявляется на разных устройствах совершенно одинаково.

 

Плюс мне также кажется, что проблема даже и не в редакторе - изначально я её заметила при работе с batch editor и массовым добавлением заготовленных шаблонов в description (текст с html разметкой, например заголовок "таблица размеров", затем сама таблица вставленным изображением). И если раньше всё добавлялось правильно, визуально верно со стороны витрины, то в тот раз я увидела, что блоки добавляются с html разметкой не в исходный код, а в конечный. Написала разработчику, он покрутил, посмотрел, и мы с ним обнаружили, что проблема не в batch editor, а во всех текстовых блоках на сайте. Так вот, почему я считаю, что проблема даже не в редакторе - я использовала готовые шаблоны, которые были созданы и сохранены до возникновения проблемы, и она их не затронула, как и прочие старые тексты, и по идее они по команде должны дописываться в заданное место сразу в БД, но записываются уже в искажённом виде. Редактор в данном случае используется исключительно для просмотра итогового результата.

 

01.jpg.6415d4646bf7252600793b8d30990eb3.jpg

 

02.jpg.d251ead141f4e8c7878157448390f32b.jpg

Изменено пользователем cestclaire
Ссылка на комментарий
Поделиться на другие сайты

сталкивался я с этой проблемой лет 10 назад тоже на opencart 1.5

Но никак не могу вспомнить как это исправляется.

Если я не путаю, то дело именно в настройках хостинга и конфликте с какими то вещами в opencart.

типа magic_quotes_gpc но что-то другое, подобное.

и если на не путаю, эта похожая проблема на проблему с поиском русских слов или кавычек

 

 

Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, AlexDW сказал:

попробуйте поменять название какого-нибудь товара,

добавьте кавычки, сохраните пару раз и смотрите, что будет в названии и что фактически в БД

 

Вы правы, в названии тоже преобразуются символы. Вписала в название Проверка названия " < >, после сохранения вижу Проверка названия &quot; &lt; &gt;

 

4 минуты назад, nikifalex сказал:

сталкивался я с этой проблемой лет 10 назад тоже на opencart 1.5

Но никак не могу вспомнить как это исправляется.

Если я не путаю, то дело именно в настройках хостинга и конфликте с какими то вещами в opencart.

типа magic_quotes_gpc но что-то другое, подобное.

и если на не путаю, эта похожая проблема на проблему с поиском русских слов или кавычек

 

Я тоже уверена, что дело в каких-то настройках, потому что проблема возникла после переезда на новый хостинг - однако получается, что утверждать на 100% я не могу, потому как после переезда была еще пара доработок по оптимизации. И вышло так, что к работе с текстовыми блоками я приступила уже после всех этих доработок.

Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, cestclaire сказал:

Вы правы, в названии тоже преобразуются символы. Вписала в название Проверка названия " < >, после сохранения вижу Проверка названия &quot; &lt; &gt;

значит редактор здесь ни при чем

если проблема носит массовый характер, вероятно причина либо в настройках сервера mysql, либо в настройках соединения с ним, либо в структуре БД

 

убедитесь что в настройках БД

MySQL-кодировка: UTF-8 Unicode (utf8)

Сопоставление соединения с MySQL: utf8_unicode_ci

 

сравните с оригиналами свои файлы
system\library\db.php
system\database\mysql.php
system\database\mysqli.php

 

(при сравнении не забывайте про vqmod)

Ссылка на комментарий
Поделиться на другие сайты

В 13.07.2022 в 12:03, cestclaire сказал:

Цитата из БД начала той же статьи:

&amp;lt;p&amp;gt;В нашем магазине вы можете оформить подарочный сертификат на любую сумму для дальнейшей отправки получателю в электронном виде.&amp;lt;/p&amp;gt;

 

Цитата из старой статьи, сохраненной в адекватном виде:

&lt;p&gt;Мы благодарны покупателям, оставляющим отзывы о наших товарах и нашей работе. Мы рады получать не только тёплые слова благодарности, но и критику, благодаря которой мы улучшаем ассортимент и сервис.&lt;/p&gt

Похоже, что на каком-то этапе происходит повторное экранирование HTML сущностей.

Вот что получается:

Оригинал: <p>

Первое преобразование: &lt;p&gt;
  &lt; - это <
  &gt; - это >

Второе преобразование: &amp;lt;p&amp;gt;
  &amp; - Это уже ненужная замена & на &amp;

 

Как костыль - можно на фронте два раза описание прогнать через 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

Но в данном случае, похоже, есть ещё какой-то лишний прогон. Может вклинивается какой-то модуль.

Может и хостинг шалить, тут ничего нельзя исключать.

Ссылка на комментарий
Поделиться на другие сайты

В 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;
        }

 

Остальное идентично.

 

Большое спасибо, что пытаетесь помочь.

Изменено пользователем cestclaire
Ссылка на комментарий
Поделиться на другие сайты

  • Решение
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);

потом создайте новую статью в админке, с кавычками и тд, сохраните и посмотрите

Ссылка на комментарий
Поделиться на другие сайты

13 минут назад, AlexDW сказал:

еще, в виде эксперимента - попробуйте в файле system\library\request.php

заменить строку

$data = htmlspecialchars($data, ENT_COMPAT, 'UTF-8');

на

$data = htmlspecialchars($data, ENT_COMPAT, 'UTF-8', false);

 

Сработало!

Теперь адекватно отображается и в админке, и на фронте.

000.jpg.a031469bbf9a5da1a7661bfb281b394a.jpg

 

Спасибо вам большое

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, cestclaire сказал:

Сработало!

Теперь адекватно отображается и в админке, и на фронте.

главное потом про эту правку не забудьте, если вдруг где-то что-то побочное всплывет

это больше "костыльное" решение, по уму нужно первопричину двойного кодирования устранить

 

но мысли пока кончились по этому поводу

разве что у вас где-то идет переопределение самой функции htmlspecialchars

Ссылка на комментарий
Поделиться на другие сайты

Итак, я могла бы стыдливо промолчать, но я смело признаюсь, что вся проблема оказалась в том, что я долблюсь в глазки.

Проблему решил без костылей фикс от разработчика модуля оптимизации БД (индексы и кэш), о котором было написано в мануале, который я честно читала, да главное упустила.

Необходимо было заменить файл 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!

Ссылка на комментарий
Поделиться на другие сайты

55 минут назад, cestclaire сказал:

фикс от разработчика модуля оптимизации БД (индексы и кэш)

а можно ссылку то на этот модуль? уж очень он загадочный

 

 

Ссылка на комментарий
Поделиться на другие сайты

https://shop.opencart-russia.ru/imdboptimizer15

Покупала здесь. На этом форуме модуля вроде бы нет.

Сам модуль сработал прекрасно, нагрузка на MySQL снизилась в 100 раз. 

Ссылка на комментарий
Поделиться на другие сайты

5 минут назад, nikifalex сказал:

а можно ссылку то на этот модуль? уж очень он загадочный

 

https://shop.opencart-russia.ru/imdboptimizer15

Покупала здесь. На этом форуме модуля вроде бы нет.

Сам модуль сработал прекрасно, нагрузка на MySQL снизилась в 100 раз. 

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...