Сергей Шлоков

Сергей Шлоков

Был в сети 06 ноября 2025, 19:54
Заказы не принимаю
Я надеюсь, вы понимаете о чем пишете.
TV — это способ расширения системных таблиц, позволяющий эмулировать добавление новых полей — на странице теги полей и TV одинаковы. Он позволяет обычным менеджерам, не программистам, достаточно легко расширять таблицу ресурсов под собственные простые задачи (заметьте, для таблицы юзеров придуман другой механизм). Но за удобство надо платить. Для более сложных задач авторы MODX предлагают решение в виде CRC, в котором вы можете добавлять свои поля в таблицу!!! Вот вам два легальных способа расширения таблиц. Если вы сторонник только первого способа, то предложенный мной вариант явно не для вас. Я даже написал рекомендацию для таких как вы.
Как вариант сделать простенький сниппет и вызывать его на странице
[[!getFileInfo? &file=`[[*tv_file]]`
А сам сниппет приблизительно такой
<?php
$fileInfo = array();
$fileInfo['filesize'] = filesize($file);
$tmp = explode('.',$file);
$fileInfo['filseExt'] = end($tmp);
$modx->setPlaceholders($fileInfo);
Соответственно, доступны 2 плейсхолдера для страницы [[+filesize]] и [[+fileExt]].
Это не совсем дубль. ТВ-шки используются для отображения в форме в админке — они могут быть разного типа, чекбоксы, селекты и т.п. Они нужны для работы менеджеров. А поля в таблице сохраняют только текущее значение ТВ. Они предназначены для использования в запросах. Василий привел пример джойнов для двух ТВ. И это выглядит пугающе. А представьте, что вам нужно обработать несколько ТВ-шек. Мало того, что потратите кучу времени, чтобы грамотно составить запрос со всеми этими джойнами, так еще и такой запрос будет нагружать сайт. А в данном случае, вы работаете с одной таблицей со всеми вытекающими плюсами. Это нужно не всем, а только тем, кто активно пользуется ТВ-шками.
Кроме того, нет ничего страшного в том, чтобы добавить даже 30 полей. Думаю, даже вы не заметите разницы, а уж mySQL точно.
Проблема в том, что в классе modRequest в 247 строчке подгружаются ТВ-шки и затирают значение поля. Выход нашел пока только один — ТВ-шкам давать префикс. Например, создаем ТВ «tv.action», а поле для нее создаем «action».
Тогда в плагине нужно писать так
$resource->set('action', $resource->getTVValue('tv.action'));
В админке и в выборках все нормально, работает как положено. А если попробовать вывести на страницу, например, [[*action]] из моего примера, то получаю всегда 1, независимо от значения в таблице ресурсов и TV. Для интереса создал поле varchar для текстовой ТВ-шки. Сохраняется нормально (пишет в таблицу значение «test»), а на страницу выводит массив
Array ( [0] => test [1] => test [2] => default [3] => [4] => text )