Создание 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-поля. Есть вопросы? Пишите в комментарии.
Оставить комментарий