Наверх

Создание TV через XPDO в MODX Revolution

В разделе «Репосты» расположены чужие статьи, которые мне понравились или показались полезными.

Рассмотрим, как программно создавать дополнительные поля TV через XPDO MODX Revolution.

Для тестирование, можете скачать компонент «Console».

Наш Скрипт состоит из двух частей, в первой части мы создаём все наши создаваемые TV-поля, а во второй части мы назначаем их для нужных шаблонов

В первой части указываем TV поля.

Простое текстовое поле
$name = 'tvname'; // имя ТВ
$tempID = '1,2'; // ID шаблонов, для которых доступна,
if (!$tv = $modx->getObject('modTemplateVar', array('name' => $name))) {
    $tv = $modx->newObject('modTemplateVar');
}
$tv->fromArray(array(
    'name'         => $name,
    'type'         => 'text',
    'caption'      => 'Имя ТВ', // подпись
    'description'  => 'Описание ТВ', // описание
    'category'     => 0 // ID категории
));
$tv->save();
$tvs[] = $tv->get('id').'-'.$tempID; 

Обратите внимание, что ID шаблонов можно указывать несколько через запятую, а можно один.

Прогоняем создание по циклу для того, чтобы назначить им нужные шаблоны. Важно! Вставить данный кусок скрипта нужно после создания всех TV-полей.

Назначения шаблонов
foreach ($modx->getCollection('modTemplate') as $template) 
{
    $templateId = $template->id;
    foreach ($tvs as $k => $tv) {
        $tvOpt = explode("-", $tv);
        $tvid = $tvOpt[0];
        $tvTemps = explode(",",$tvOpt[1]);
        
        foreach ($tvTemps as $tvTemp){
            if($templateId == $tvTemp){
                if (!$tvt = $modx->getObject('modTemplateVarTemplate', array('tmplvarid' => $tvid, 'templateid' => $templateId))) {
                    $record = array('tmplvarid' => $tvid, 'templateid' => $templateId);
                    $keys = array_keys($record);
                    $fields = '`' . implode('`,`', $keys) . '`';
                    $placeholders = substr(str_repeat('?,', count($keys)), 0, -1);
                    $sql = "INSERT INTO {$modx->getTableName('modTemplateVarTemplate')} ({$fields}) VALUES ({$placeholders});";
                    $modx->prepare($sql)->execute(array_values($record));
                }
            }
        }
    }
}

Ественно мы можем создавать любое количество TV за раз. Главное придерживаться структуры: «Создание TV1 -> Создание TV2 -> Создание TVn -> Назначение шаблонов»

Примеры создания TV

Мы рассмотрели, как создавать текстовые поля, рассмотрим, как создавать другие.

TV с типом «Изображение»
$name = 'image';
$tempID = '1'; 
$source = 2; // Id источника файлов для TV
if (!$tv = $modx->getObject('modTemplateVar', array('name' => $name))) {
    $tv = $modx->newObject('modTemplateVar');
}
$tv->fromArray(array(
    'name'         => $name,
    'type'         => 'image',
    'caption'      => 'Изображение',
    'description'  => 'Описание ТВ',
    'category'     => 0
));
$tv->save();
$tvs[] = $tv->get('id').'-'.$tempID;

/* Источник файлов для TV */
$sourceElement = $modx->newObject('sources.modMediaSourceElement');
$sourceElement->fromArray(array(
    'object' => $tv->get('id'),
    'context_key' => 'web',
), '', true, true);
$sourceElement->set('source', $source);
$sourceElement->save();
/* end Источник файлов для TV */

Обратите внимание, что можно указывать источник файлов для этой TV

Список (Одиночный выбор)
$name = 'select';
$tempID = '2'; 
if (!$tv = $modx->getObject('modTemplateVar', array('name' => $name))) {
    $tv = $modx->newObject('modTemplateVar');
}
$tv->fromArray(array(
    'name'         => $name,
    'type'         => 'listbox',
    'caption'      => 'Рейтинг отзыва',
    'elements'     => '1==1||2==2||3==3||4==4||4.5==4_5||5==5',
    'category'     => 0,
));
$tv->save();
$tvs[] = $tv->get('id').'-'.$tempID;

Чекбокс (Множественный выбор)
$name = 'category_main';
$tempID = $tempIDCategoryDop; 
if (!$tv = $modx->getObject('modTemplateVar', array('name' => $name))) {
    $tv = $modx->newObject('modTemplateVar');
}
$tv->fromArray(array(
    'name'         => $name,
    'type'         => 'checkbox',
    'caption'      => 'Показывать',
    'elements'     => 'Да==Да||Нет==Нет',
    'category'     => 0,
));
$tv->save();
$tvs[] = $tv->get('id').'-'.$tempID;

TV с типом «Простая загрузка файорв» (FastUploadTV). Для этого потребуется компонент FastUploadTv
$name = 'fastImage';
$tempID = '17,6,9,14,12'; 
$source = 2; // Id источника файлов для TV
if (!$tv = $modx->getObject('modTemplateVar', array('name' => $name))) {
    $tv = $modx->newObject('modTemplateVar');
}
$tv->fromArray(array(
    'name'         => $name,
    'type'         => 'fastuploadtv',
    'caption'      => 'Изображение',
    'category'     => 0,
    'source'       => $source,
    'input_properties' => array(
                            "path" => "id/{id}/",
                            "prefix" => "",
                            "MIME" => "",
                            "showValue" => true,
                            "showPreview" => true
                        ),
));
$tv->save();
$tvs[] = $tv->get('id').'-'.$tempID;

/* Источник файлов для TV */
$sourceElement = $modx->newObject('sources.modMediaSourceElement');
$sourceElement->fromArray(array(
    'object' => $tv->get('id'),
    'context_key' => 'web',
), '', true, true);
$sourceElement->set('source', $source);
$sourceElement->save();
/* end Источник файлов для TV */

TV с типом «MIGX» (На примере слайдера). Для этого потребуется компонент MIGX, он есть в стандартном репозитории.
$name = 'slider';
$tempID = '2'; 
if (!$tv = $modx->getObject('modTemplateVar', array('name' => $name))) {
    $tv = $modx->newObject('modTemplateVar');
}
$tv->fromArray(array(
    'name'         => $name,
    'type'         => 'migx',
    'caption'      => 'Слайдер',
    'category'     => 0,
    'input_properties' => array(
                            "formtabs" => '[{"caption":"Gallery","fields": [{"field":"img","caption":"Картинка","inputTV":"image"},{"field":"link","caption":"Ссылка"]]}}',
                            "columns" => '[{"header": "Картинка","dataIndex": "img","renderer":"this.renderImage","width":"100"},{"header": "Ссылка","dataIndex": "link","width":"400"]}'
                        ),
));
$tv->save();
$tvs[] = $tv->get('id').'-'.$tempID;

Яндекс-карта. Для этого потребуется компонент YandexMaps
$name = 'mapyandex';
$tempID = '2'; 
if (!$tv = $modx->getObject('modTemplateVar', array('name' => $name))) {
    $tv = $modx->newObject('modTemplateVar');
}
$tv->fromArray(array(
    'name'         => $name,
    'type'         => 'yandexMaps',
    'caption'      => 'Метка компании на карте',
    'category'     => 0,
));
$tv->save();
$tvs[] = $tv->get('id').'-'.$tempID;

По аналогии можно создавать другие любые TV-поля. Есть вопросы? Пишите в комментарии.

Источник: daruse.ru/sozdanie-dopolnitelnyix-polej-tv-cherez-xpdo-v-modx-revolution


1 комментарий

  1. Александр 29 мая 2019, 21:26(Комментарий был изменён) # 0
    Может вы знаете как изменить уже у созданного tv источник файлов? Когда делаю так:
    $tv = $modx->getObject('modTemplateVar', ['id' => 14]);
    $tv->set('source', 2);
    $tv->save();
    print_r($tv->toArray());
    вижу что источник изменился, но захожу в настройки tv и там по прежнему стоит старый источник файлов, хотя значение в БД изменилось. Попробывал удалить папку cache так как кеширование у админки и фронта разные, но тоже не помогло.

    Авторизация

    через сервис Loginza:


    Шаблоны MODX

    1 2 Дальше »

    Объектная
    модель
    MODX