Все для создания и продвижения сайтов

Верстка, программирование, SEO

Создание 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;

Если вам нужно указать для внутренного поля MIGX «Картинка» нужный источник файлов, читайте об этом тут (в конце статьи).

Яндекс-карта

Для этого потребуется компонент 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-поля. Есть вопросы? Пишите в комментарии.

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