Упрощаем работу с TV
Продолжая тему, начатую Василием, предлагаю решение для упрощения работы с TV. Оно поможет тем, у кого логика сайта завязана на TV — запросы, фильтры и т.п. Решается эта задача созданием полей в таблице ресурсов и копированием в них значений TV.
Покажу на своем примере.
- Создаем TV «tv.action», которая будет признаком, что ресурс акционный. Это нужно для выборки только тех ресурсов, которые участвуют в акции. 1 — участвует, 0 — нет. Обратите внимание на префикс.
- В таблице modx_site_content создаем поле «action». Удобнее всего через phpMyAdmin.
- Создадим вот такой небольшой плагин для нашего поля
- Теперь на странице ресурса пишем, например, такой запрос с обычным where и без подключения TV-шек
Тип: tinyint Длина: 1 Значение по-умолчанию: 0 Атрибуты: UNSIGNED
<?php switch ($modx->event->name) { case 'OnMODXInit': // Загружаем наше поле в модель ресурса $modx->loadClass('modResource'); $modx->map['modResource']['fields']['action'] = 0; $modx->map['modResource']['fieldMeta']['action'] = array( 'dbtype' => 'tinyint', 'precision' => 1, 'attributes' => 'unsigned', 'phptype' => 'integer', 'null' => false, 'default' => 0, ); break; case 'OnDocFormSave': // Сохраняем ТВ в поле таблицы ресурса $resource->set('action', $resource->getTVValue('tv.action')); $resource->save(); break; }
Не забываем отметить нужные события.
[[!pdoResources? &parents=`0` &where=`{"action":"1"}` &tpl=`myTpl` &depth=`0` ]]
и получаем все ресурсы, для которых установлен признак акции. И никакой мороки с значениями по умолчанию, джойнами и т.п. Сложные типы TV-шек не тестировал, но думаю должно работать. Для тех, у кого много TV, скорость запросов должна заметно вырасти. Было бы интересно узнать результаты до и после.
В результате ТВ-шки работают как обычно, а вот запросы значительно упростились, так как они теперь работают только с одной таблицей. И на странице можно указывать тег с именем добавленного поля ([[*action]]
), парсер обработает его быстрее, так как он не будет делать дополнительный запрос к таблице ТВ-шек. Вот такой велосипед получился.
Важно!
Имя ТВ и поля должны отличаться! В противном случае, при использовании TV на странице сайта значение поля будет некорректным. Можно добавить префикс «tv» к имени ТВ-шки.
Причина в том, что в классе modRequest в 247 строчке подгружаются ТВ-шки и затирают значение поля. Выход нашел пока только один — ТВ-шкам давать префикс. Например, создаем ТВ «tv.action», а поле для нее создаем «action».
Тогда в плагине нужно писать так
$resource->set('action', $resource->getTVValue('tv.action'));
Рекомендация!
Данный прием нужно использовать осторожно и только людям с устойчивой нервной системой, так как для оптимизации запросов происходит дублирование значений ТВ в таблице ресурсов. В противном случае возможны побочные действия — обострение состояния до «аж кушать не могу» из-за дублей и добавленных полей, бессоница из-за нарушения гармонии в нормализации данных (для некоторых это большой грех), головокружение и тошнота от увеличившейся скорости работы сайта. Детям использовать это можно только под присмотром взрослых! :)
Вы должны авторизоваться, чтобы оставлять комментарии.
Комментарии ()