Очень хитрые TV параметры
У любого ресурса MODX есть ограниченное число полей, таких как pagetitle, content, introtext. Чтобы расширить этот функционал, и добавить, например, картинку к заметке - нужны дополнительные поля.
В MODX они называются Template Variables, то есть, TV.
Это очень мощная система, и тэвэшки можно создавать бесконечно много, с разными свойствами и наворотами. Чем многие и злоупотребляют.
Объясняю почему. Один TV - это одна строка в таблице modTemplateVarResource. Если нужно получить 10 TV - это обычно 10 запросов в базу. Если нужно отсортировать по ним - еще сложнее и дольше.
Вот и выходит, что "MODX тормозит", когда на один ресурс навешано штук 20 ТВ и они выводятся на каждой странице с getResources.
Лично я стараюсь их вообще не использовать, но на ум пришла интересная идея. Нужно дублировать TV в поле properties ресурса, которое хранит json строку с любой информацией.
Вот плагин, для дублирования:
<?php
if ($modx->event->name == 'OnBeforeDocFormSave') {
$tvs = array();
foreach ($_POST as $k => $v) {
if (preg_match('/^tv[0-9]+$/', $k)) {
$tvs[$k] = $v;
}
}
$properties = $resource->get('properties');
ksort($tvs);
$properties['tvs'] = $tvs;
$resource->set('properties', $properties);
}Он смотрит в $_POST при сохранении ресурса, и копирует TV куда надо. Обратите внимание, что используются id параметров с префиксом tv. Можно, конечно, и получать имена TV, но это лишняя работа при сохранении ресурса. К тому же, если вы переименуете параметр - эта инфа не обновится самостоятельно. Поэтому, тэвэшки будут просто tv1, tv2, tv3 в массиве tvs.
Отдельный массив tvs нужен, чтобы не затереть что-то нужное, так как поле properties используют и компоненты, например Articles и Tickets. Ключи перед сохранением сортируются, так что TV в поле будут всегда по возрастанию id.
А дальше мы можем выводить их обычным getResources, используя плейсхолдеры. Парсер разбирает массивы в ресурсе и склеивает ключи через точку.
[[+properties.tvs.tv1]]
[[+properties.tvs.tv2]]
[[+properties.tvs.tv3]]
и т.д.То есть, значения TV параметров будут выводиться без лишних запросов в БД. Конечно, &processTVs работать не будет - ну и фиг с ним.
В любом случае, это легко можно использовать на загруженный сайтах, для ускорения вывода ресурсов. Теоретически, можно даже криво фильтровать по полю properties, но мне так и не удалось передать подходящий вызов в параметр &where.
Можно написать сниппет на pdoTools и он должен нормально выбирать, но я не проверял. В любом случае, эта фильтрация будет очень ограниченной, просто поиск по
`parameters` LIKE '%"tv1":"string"%'Обновлено 05.02.13
В комментариях был километровый срач, который пришлось почистить, но для любопытных остался скриншот.
0
👍
👎
❤️
🔥
😮
😢
😀
😡
5 520
04.02.2013 20:57:24