Last active
November 13, 2017 06:01
-
-
Save bendasvadim/25a3ab8a1ca08fa91bb6495737c852a1 to your computer and use it in GitHub Desktop.
MODX Revolution и MySQL v5.7.x: проблема с сохранением значений TV-параметров
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Суть проблемы | |
Во время сохранения ресурса значения TV-параметров не сохраняются в таблице базы данных (modx_site_tmplvar_contentvalues), при этом внешне всё выглядит нормально: после сохранения в соответствующих полях отображаются обновлённые значения. Однако после перезагрузки страницы редактирования поля вновь оказываются пустыми (или заполненными значениями по умолчанию). | |
В файле error.log системы (раздел Управление→Отчёты→Журнал ошибок административной панели) отображается следующее сообщение об ошибке: | |
[2016-10-19 08:18:19] (ERROR @ /var/www/init/www/core/xpdo/om/xpdoobject.class.php : 240) Error HY000 executing statement: | |
Array | |
( | |
[0] => HY000 | |
[1] => 3065 | |
[2] => Expression #1 of ORDER BY clause is not in SELECT list, references column 'init.tvtpl.rank' which is not in SELECT list; this is incompatible with DISTINCT | |
) | |
Версия MODX Revolution: 2.5.0-pl | |
Версия MySQL: 5.7.15 | |
Причина | |
Потратив приличное количество времени на поиск решения в интернете, я узнал, что всё дело в новой версии MySQL и её обновлённых настройках по умолчанию: задействована настройка ONLY_FULL_GROUP_BY, в результате чего перестаёт работать часть запросов MODX. Как оказалось, проблема уже известна разработчикам (описание в багтрекере MODX на GitHub: https://github.com/modxcms/revolution/issues/12826) и будет исправлена в новых версиях движка (скорее всего в версии 2.5.2-pl). | |
Решение | |
Чтобы не ждать официального релиза с исправлениями и обновлять движок, вы можете самостоятельно внести правки в файлы ядра MODX, к счастью исправлять придётся немного: | |
Файл /core/model/modx/modresource.class.php: | |
$c = $resource->xpdo->newQuery('modTemplateVar'); | |
$c->query['distinct'] = 'DISTINCT'; | |
$c->select($resource->xpdo->getSelectColumns('modTemplateVar', 'modTemplateVar')); | |
$c->select($resource->xpdo->getSelectColumns('modTemplateVarTemplate', 'tvtpl', '', array('rank'))); | |
if ($resource->isNew()) { | |
$c->select(array( | |
'modTemplateVar.default_text AS value', | |
Добавлена строка №342. | |
Файл /core/model/modx/modtemplate.class.php: | |
$c = $this->xpdo->newQuery('modTemplateVar'); | |
$c->query['distinct'] = 'DISTINCT'; | |
$c->select($this->xpdo->getSelectColumns('modTemplateVar')); | |
$c->select($this->xpdo->getSelectColumns('modTemplateVarTemplate', 'tvtpl', '', array('rank'))); | |
$c->select(array('value' => $this->xpdo->getSelectColumns('modTemplateVar', 'modTemplateVar', '', array('default_text')))); | |
$c->innerJoin('modTemplateVarTemplate','tvtpl',array( | |
'tvtpl.tmplvarid = modTemplateVar.id', | |
Добавлена строка №144. | |
После внесения изменений механизм сохранения значений TV-параметров должен работать нормально. | |
Скажу ещё, что можно просто отказаться от использования MySQL последней версии, однако не думаю, что такой способ решения проблемы придётся вам по душе. | |
Источник http://riselab.ru/modx-revolution-i-mysql-v5-7-x-problema-s-sohraneniem-znachenij-tv-parametrov/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment