Лирическое отступление.
Мне очень интересно, когда на форуме люди обсуждают различные варианты применения переменных TV, они сами пробуют применять обсуждаемые решения? Неужели никто не заметил, что в версии 0.6.1 нельзя добавить TV после создания документа? То есть можно ввести значение вместе с вводом нового документа или исправить введенное ранее, но если при создании TV не задать, то потом ввести его будет невозможно. Ошибка появилась только в версии 0.9.6.1 и осталась в 0.9.6.1p2. Неужели никто не заметил? А если заметил, то, как обходит проблему? Если же исправил, то почему ни с кем не поделился? Правда, справедливости ради, проблема возникает не всегда, так как можно использовать режимы работы MySQL, в которых все будет работать, но по умолчанию работать не должно.
Решение проблемы достаточно простое, я о нем написал в англоязычной части форума, но повторю и тут.
Проблема в том, что в числовое поле базы данных записывается нечисловое значение. При этом проверка записи в базу не производится, иначе была бы обнаружена ошибка MySQL для таблицы site_tmplvar_contentvalues:
Incorrect integer value: ’’ for column ’id’ (SQL: REPLACE INTO `<путь>site_tmplvar_contentvalues` (id, tmplvarid, contentid, value) VALUES (
’’, 1, 11, ’xxxx’)).
Для решения проблемы нужно найти файл
manager/processors/save_content.processor.php
и заменить в нем строки
$tvChanges[] = '(\''.$tvIds[$tvId].'\', '.$tvId.', '.$id.', \''.mysql_escape_string($tvVal).'\')';
на
if ($tvIds[$tvId] == '') $tvIds[$tvId]="NULL";
else $tvIds[$tvId]='\''.$tvIds[$tvId].'\'';
$tvChanges[] = '('.$tvIds[$tvId].', '.$tvId.', '.$id.', \''.mysql_escape_string($tvVal).'\')';
В итоге в базу будет отправляться запрос
REPLACE INTO `<путь>site_tmplvar_contentvalues` (id, tmplvarid, contentid, value) VALUES (
NULL, 1, 11, ’xxxx’)