Не работает tagmanager2 в modx

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

Решение — в конце, а сначала порядок дебага.

В моем случае при нажатии на кнопку сохранения просто ничего не происходило, пришлось разбираться что к чему.

Первым делом идем в лог modx и смотрим на что ругается (идеально смотреть через  tail -f и при этом в браузере воспроизводить проблемное действие, в данном случае — сохранение). Лог лежит в core/cache/logs/error.log относительно корня сайта.

В моем случае я увидел там следующее (часть текста изменена в целях анонимности клиента):

[2018-04-08 00:47:32] (ERROR @ /var/www/mysupersite/core/xpdo/om/xpdoobject.class.php : 1452) Error HY000 executing statement:
INSERT INTO modx_tag_manager2_tags (category, tvid, tvname, tvcaption, tags, index) VALUES (32, 30, ‘discountVal’, ‘Скидка за красивые глаза’, ‘[{\»value\»:\»==0\»,\»active\»:true},{\»value\»:\»==0,95||\\u0421\\u043a<обрезано много лишнего>
(
[0] => HY000
[1] => 1366
[2] => Incorrect string value: ‘\xD0\xA1\xD0\xBA\xD0\xB8…’ for column ‘tvcaption’ at row 1
)

Как видим, ругается mysql и ругается на неверное значение, которое мы пытаемся записать в поле tvcaption. Смотим выше, это поле четвертое в запросе, и в него мы пытаемся записать ‘Скидка за красивые глаза’  прямо так, русскими буквами. Странно, учитывая, что другие поля с русским текстом энкодятся, ну да ладно, не нам судить разработчиков.

Проблема в том, что mysql отказыватся принять предлагаемое значение, считая его некорректным. Связано это с тем, что в mysql с версии (вроде бы) 5.6 по умолчанию в sql_mode включен в т.ч. режим STRICT_TRANS_TABLES, который и не позволяет принимать некорректное значение. Можно его выключить, и возможно даже заработает, но это не верный путь. В моем случае сохранение заработало, но потом показывало вопросиками то что сохранено.

Смотрим дальше и видим первопричину — в настройках подключения modx к базе данных стоит кодировка utf8 по умолчанию, а вот у таблицы и интересующего нас поля modx_tag_manager2_tags задана кодировка  latin1_swedish_ci. Решить эту проблему можно изменив кодировку для таблицы или столбца на верную, я решил менять только для столбца.

Итак, заходим в консоль mysql, выбираем интересующую нас базу данных и делаем:

ALTER TABLE modx_tag_manager2_tags MODIFY tvcaption varchar(128) CHARACTER SET utf8;

После этого можно проверять, всё работает.

P.S. возможны аналогичные проблемы и на других плагинах и на других таблицах и полях, вместо того чтобы бездумно тиражировать решение — сначала проверьте тип поля, там может быть указан другой тип и длина. Посмотреть можно командой show full columns from <имя таблицы>;

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *