Jump to content

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


cestclaire
 Share

Go to solution Solved by AlexDW,

Recommended Posts

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

 

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

 

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

image.png.e05050ae5d131de32d1e144b2a8a2e4e.png

 

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

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

 

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

 

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

Link to comment
Share on other sites

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

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

 

 

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

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

 

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

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

 

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

Edited by cestclaire
Link to comment
Share on other sites

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

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

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

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

 

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

 

3fb6cae1e9.jpg.22ebb9ec8dc2560a10ac496b41deca93.jpg

 

Edited by cestclaire
Link to comment
Share on other sites

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

 

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

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

Link to comment
Share on other sites

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

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

 

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

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

 

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

Link to comment
Share on other sites

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

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

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

 

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

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

 

Цитата

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

 

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

 

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

 

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

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

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

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

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

 

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

 

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

 

01.jpg.6415d4646bf7252600793b8d30990eb3.jpg

 

02.jpg.d251ead141f4e8c7878157448390f32b.jpg

Edited by cestclaire
Link to comment
Share on other sites

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

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

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

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

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

 

 

Link to comment
Share on other sites

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

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

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

 

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

 

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

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

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

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

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

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

 

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

Link to comment
Share on other sites

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)

Link to comment
Share on other sites

В 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

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

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

Link to comment
Share on other sites

В 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 by cestclaire
Link to comment
Share on other sites

  • Solution
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);

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

Link to comment
Share on other sites

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

 

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

Link to comment
Share on other sites

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

Сработало!

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

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

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

 

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

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

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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

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

 

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

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

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

Link to comment
Share on other sites

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...