Для тестирование, можете скачать компонент «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 комментарий