• Блог
  • Упрощаем работу с TV

Продолжая тему, начатую Василием, предлагаю решение для упрощения работы с TV. Оно поможет тем, у кого логика сайта завязана на TV — запросы, фильтры и т.п. Решается эта задача созданием полей в таблице ресурсов и копированием в них значений TV.

Покажу на своем примере.

  1. Создаем TV «tv.action», которая будет признаком, что ресурс акционный. Это нужно для выборки только тех ресурсов, которые участвуют в акции. 1 — участвует, 0 — нет. Обратите внимание на префикс.
  2. В таблице modx_site_content создаем поле «action». Удобнее всего через phpMyAdmin.
  3. Тип: tinyint
    Длина: 1
    Значение по-умолчанию: 0
    Атрибуты: UNSIGNED
    
  4. Создадим вот такой небольшой плагин для нашего поля
  5. <?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;
    }
    

    Не забываем отметить нужные события.

  6. Теперь на странице ресурса пишем, например, такой запрос с обычным where и без подключения TV-шек
  7. [[!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'));

Рекомендация!

Данный прием нужно использовать осторожно и только людям с устойчивой нервной системой, так как для оптимизации запросов происходит дублирование значений ТВ в таблице ресурсов. В противном случае возможны побочные действия — обострение состояния до «аж кушать не могу» из-за дублей и добавленных полей, бессоница из-за нарушения гармонии в нормализации данных (для некоторых это большой грех), головокружение и тошнота от увеличившейся скорости работы сайта. Детям использовать это можно только под присмотром взрослых! :)

0   335

Комментарии ()

    Вы должны авторизоваться, чтобы оставлять комментарии.

    Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.