разбор функции и формата setup-файла конфигурации Cotonti
cot_config_parse(): разбор функции и формата setup-файла конфигурации Cotonti
Разбор исходного кода файлов system/configuration.php, system/extensions.php, plugins/i18n/i18n.setup.php и других расширений Cotonti.
Содержание
- Введение
- Место функции в системе
- Формат setup-файла: секция COT_EXT_CONFIG
- Что поступает на вход функции
- Алгоритм разбора построчно
- Таблица соответствия типов
- Тип string
- Тип select
- Тип radio
- Тип callback
- Тип hidden
- Тип separator
- Тип range
- Тип custom
- Типы text и прочие (default)
- Структура выходного массива
- Секция COT_EXT_CONFIG_STRUCTURE
- Использование результата в cot_extension_install()
- Краевые случаи и примечания
- Полные примеры для каждого типа
1. Введение
Функция cot_config_parse() объявлена в файле system/configuration.php и предназначена для преобразования массива строк, полученных из setup-файла расширения, в структурированный массив опций конфигурации.
PHPDoc функции:
/**
* Parses array of setup file configuration entries into array representation
*
* @param array $info_cfg Setup file config entries
* @return array Config options
*/
function cot_config_parse($info_cfg)
Сигнатура:
cot_config_parse(array $info_cfg): array
Из сигнатуры видно:
- функция принимает единственный аргумент — массив
$info_cfg; - возвращает массив опций конфигурации.
Функция не имеет модификатора доступа, не объявлена статической, не использует global, не обращается к базе данных. Единственная зависимость — константы COT_CONFIG_TYPE_*, объявленные выше в том же файле.
2. Место функции в системе
Функция вызывается из cot_extension_install() — это единственное место, где она используется в предоставленных файлах. Вызов встречается дважды:
Первый вызов — для основной секции конфигурации:
// Install config
$info_cfg = cot_infoget($setup_file, 'COT_EXT_CONFIG');
if (!$info_cfg && cot_plugin_active('genoa')) {
// Try to load old format config
$info_cfg = cot_infoget($setup_file, 'SED_EXTPLUGIN_CONFIG');
}
$options = cot_config_parse($info_cfg, $isModule);
Второй вызов — для секции конфигурации структуры:
// Install structure config if present
$info_cfg = cot_infoget($setup_file, 'COT_EXT_CONFIG_STRUCTURE');
if ($info_cfg) {
$options = cot_config_parse($info_cfg, $isModule);
...
}
В обоих случаях функция получает на вход результат cot_infoget() — массив строк, извлечённых из соответствующей секции setup-файла. Результат cot_config_parse() далее передаётся в cot_config_add() или cot_config_update().
Отдельно стоит отметить: хотя cot_config_parse() вызывается с двумя аргументами ($info_cfg и $isModule), сама функция объявлена с одним параметром. Это означает, что второй аргумент фактически игнорируется. На логику работы функции это не влияет, но фиксируется как факт из предоставленного кода.
3. Формат setup-файла: секция COT_EXT_CONFIG
Setup-файл расширения (например, i18n.setup.php) содержит несколько секций, ограниченных маркерами [BEGIN_...] и [END_...]. Секция COT_EXT_CONFIG выглядит так:
/* ====================
[BEGIN_COT_EXT]
Code=i18n
Name=i18n modified
Category=i18n
...
[END_COT_EXT]
[BEGIN_COT_EXT_CONFIG]
cats=01:string:::Category codes
locales=02:text::en|English:Site locales
omitmain=03:radio::1:Omit language parameter in the URL if pointing to main language
rewrite=04:radio::0:Enable URL overwrite for language parameter
cookie=05:radio::0:Remember language selection in cookie
[END_COT_EXT_CONFIG]
==================== */
Каждая строка внутри секции имеет вид:
имя_параметра=порядок:тип:варианты:по_умолчанию:текст
Из примера выше:
| Полная строка | Ключ (имя параметра) | Значение (конфигурационная строка) |
|---|---|---|
cats=01:string:::Category codes | cats | 01:string:::Category codes |
locales=02:text::en|English:Site locales | locales | 02:text::en|English:Site locales |
omitmain=03:radio::1:Omit language parameter... | omitmain | 03:radio::1:Omit language parameter... |
rewrite=04:radio::0:Enable URL overwrite... | rewrite | 04:radio::0:Enable URL overwrite... |
cookie=05:radio::0:Remember language selection... | cookie | 05:radio::0:Remember language selection... |
Разбором строки на ключ и значение занимается функция cot_infoget(). Она использует регулярное выражение /\s*\=\s*/ для разделения строки на две части по знаку равенства (с возможными пробелами вокруг). Максимум две части: preg_split('/\s*\=\s*/', trim($line), 2). Значит, если в правой части значения встречается ещё один знак равенства, он остаётся частью значения.
После cot_infoget() результат представляет собой ассоциативный массив вида:
[
'cats' => '01:string:::Category codes',
'locales' => '02:text::en|English:Site locales',
'omitmain' => '03:radio::1:Omit language parameter in the URL if pointing to main language',
'rewrite' => '04:radio::0:Enable URL overwrite for language parameter',
'cookie' => '05:radio::0:Remember language selection in cookie',
]
Именно такой массив поступает на вход cot_config_parse() в качестве $info_cfg.
Важное замечание о формате секции: строки внутри [BEGIN_...]...[END_...] не должны содержать лишних знаков = или : в неожидаемых местах. cot_infoget() разбивает по первому =, а cot_config_parse() — по каждому :. Это означает, что символ : не может использоваться внутри полей «варианты», «по умолчанию» или «текст», потому что он будет распознан как разделитель.
4. Что поступает на вход функции
Согласно PHPDoc, на вход подаётся $info_cfg — «Setup file config entries» — массив строк конфигурации из setup-файла.
Внутренняя проверка функции:
if (is_array($info_cfg))
Если $info_cfg не является массивом, функция возвращает пустой массив [] (переменная $options инициализируется пустым массивом в начале).
Из этого следует:
- если
cot_infoget()вернулаfalse(не найдена секция или файл не читается),cot_config_parse()вернёт пустой массив; - если секция найдена, но пуста,
cot_infoget()вернёт массив с ключами по умолчанию (см. ниже) или пустой массив — в зависимости от содержимого секции; - вызов
cot_config_parse()с не-массивом не вызовет ошибок, просто вернёт пустой результат.
Структура по умолчанию для COT_EXT/SED_EXTPLUGIN определяется в cot_infoget(), но для COT_EXT_CONFIG никакой структуры по умолчанию не задано. Значит, если секция COT_EXT_CONFIG отсутствует, cot_infoget() вернёт false, и cot_config_parse() вернёт пустой массив.
5. Алгоритм разбора построчно
Функция проходит по каждому элементу входного массива в цикле foreach ($info_cfg as $i => $x):
$i— ключ элемента, то есть имя параметра (например,cats,locales);$x— значение, то есть конфигурационная строка (например,01:string:::Category codes).
Для каждой строки выполняются следующие шаги.
Шаг 1. Разбиение по символу «:»
$line = explode(':', $x);
Функция explode() разбивает строку по всем вхождениям символа :. Результат — массив сегментов. Для строки 01:string:::Category codes получится:
[
0 => '01',
1 => 'string',
2 => '',
3 => '',
4 => 'Category codes'
]
Для строки 02:text::en|English:Site locales:
[
0 => '02',
1 => 'text',
2 => '',
3 => 'en|English',
4 => 'Site locales'
]
Для строки 03:radio::1:Omit language parameter in the URL if pointing to main language:
[
0 => '03',
1 => 'radio',
2 => '',
3 => '1',
4 => 'Omit language parameter in the URL if pointing to main language'
]
Обратите внимание: explode() не ограничивает количество сегментов. Если в строке есть лишние :, они создадут дополнительные элементы массива. Например, строка 01:string:::text:with:colons даст семь сегментов, и поле $line[4] будет содержать только text, а остальные сегменты окажутся вне результирующей структуры.
Шаг 2. Обрезка пробелов в поле типа
$line[1] = trim($line[1]);
Обрезаются пробелы в начале и в конце второго сегмента (типа). Это позволяет использовать в setup-файле запись вида 01: string ::: с пробелами вокруг типа — тип всё равно распознается.
Про остальные сегменты такой операции не производится. Поля $line[0], $line[2], $line[3] остаются в исходном виде. Поле $line[4] обрезается отдельно, уже при формировании результата.
Шаг 3. Проверка корректности
if (is_array($line) && !empty($line[1]) && !empty($i))
Три условия соединены логическим И:
is_array($line)—$lineвсегда массив, потому чтоexplode()возвращает массив. Это условие фактически всегда истинно.!empty($line[1])— тип не должен быть пустым. Если строка начинается с:, тип пуст, и такая запись пропускается.!empty($i)— имя параметра не должно быть пустым. В PHPempty('0')тоже возвращаетtrue, но имя параметра обычно не может быть'0', поэтому на практике это означает просто «непустое имя».
Если хотя бы одно из условий не выполнено, текущая итерация пропускается, запись не добавляется в результат.
Шаг 4. Определение типа через switch
switch ($line[1])
{
case 'string': $line['Type'] = COT_CONFIG_TYPE_STRING; break;
case 'select': $line['Type'] = COT_CONFIG_TYPE_SELECT; break;
case 'radio': $line['Type'] = COT_CONFIG_TYPE_RADIO; break;
case 'callback': $line['Type'] = COT_CONFIG_TYPE_CALLBACK; break;
case 'hidden': $line['Type'] = COT_CONFIG_TYPE_HIDDEN; break;
case 'separator': $line['Type'] = COT_CONFIG_TYPE_SEPARATOR; break;
case 'range': $line['Type'] = COT_CONFIG_TYPE_RANGE; break;
case 'custom': $line['Type'] = COT_CONFIG_TYPE_CUSTOM; break;
default: $line['Type'] = COT_CONFIG_TYPE_TEXT; break;
}
Строковое значение из setup-файла сопоставляется с одной из восьми констант. Всё, что не попало ни в один из case, получает COT_CONFIG_TYPE_TEXT.
Отдельно следует отметить: тип text явно не указан в списке case. Это означает, что строка с типом text попадёт в ветку default и получит COT_CONFIG_TYPE_TEXT. Результат совпадает с ожидаемым, но фактически через явное сопоставление этот тип не проходит.
Аналогично, любой другой неизвестный тип (например, int, bool, float) также попадёт в default и станет COT_CONFIG_TYPE_TEXT.
Шаг 5. Формирование результирующей записи
$options[] = [
'name' => $i,
'order' => trim($line[0]),
'type' => $line['Type'],
'variants' => $line[2],
'default' => $line[3],
'text' => trim($line[4])
];
В результирующий массив добавляется запись с ключами:
name— имя параметра, берётся из ключа входного массива ($i);order— порядок, берётся из$line[0]и обрезается черезtrim();type— константа типа, определённая на шаге 4;variants— третий сегмент, без обрезки пробелов;default— четвёртый сегмент, без обрезки пробелов;text— пятый сегмент, обрезается черезtrim().
Обратите внимание на асимметрию: поля order и text обрезаются, а variants и default — нет. Это означает, что в setup-файле пробелы вокруг значений variants и default попадут в результат как есть. Например, строка 01:select: 5, 10, 15 : 10 : Text даст variants = ' 5, 10, 15 ' и default = ' 10 '. Однако при обработке SELECT через preg_split('#\s*,\s*#', ...) пробелы вокруг запятых будут удалены, но крайние пробелы останутся. Это может повлиять на итоговое значение по умолчанию.
Шаг 6. Возврат результата
return $options;
Возвращается массив $options. Если вход был не массивом, массив остаётся пустым. Если вход был массивом, но ни одна строка не прошла проверку, результат также пустой.
6. Таблица соответствия типов
Соответствие строкового значения из setup-файла и константы Cotonti:
| Строка в setup | Константа | Числовое значение | Ветка switch |
|---|---|---|---|
string | COT_CONFIG_TYPE_STRING | 1 | явная |
select | COT_CONFIG_TYPE_SELECT | 2 | явная |
radio | COT_CONFIG_TYPE_RADIO | 3 | явная |
callback | COT_CONFIG_TYPE_CALLBACK | 4 | явная |
hidden | COT_CONFIG_TYPE_HIDDEN | 5 | явная |
separator | COT_CONFIG_TYPE_SEPARATOR | 6 | явная |
range | COT_CONFIG_TYPE_RANGE | 7 | явная |
custom | COT_CONFIG_TYPE_CUSTOM | 8 | явная |
text | COT_CONFIG_TYPE_TEXT | 0 | default |
| любая другая строка | COT_CONFIG_TYPE_TEXT | 0 | default |
Важно: строки string, select, radio, callback, hidden, separator, range, custom сравниваются в switch с учётом регистра. Строка String или STRING не совпадёт ни с одним case и попадёт в default → COT_CONFIG_TYPE_TEXT.
7. Тип string
Строка в setup-файле:
имя=порядок:string:варианты:default:текст
Согласно комментарию к константе COT_CONFIG_TYPE_STRING в самом файле configuration.php:
A string, max length is 255 chars. Is displayed as a single line of input. The list of variants is ignored for this type.
Это означает:
- в UI отображается однострочное поле ввода;
- максимальная длина значения — 255 символов;
- поле
variantsдля этого типа игнорируется.
Пример из файла i18n.setup.php:
cats=01:string:::Category codes
Разбор:
- порядок:
01; - тип:
string; - варианты: пусто;
- default: пусто;
- текст:
Category codes.
Так как variants для типа STRING не обрабатывается в cot_config_input() (там сразу вызывается cot_inputbox('text', ...)), его содержимое не повлияет на отображение, но попадёт в поле config_variants базы данных.
8. Тип select
Строка в setup-файле:
имя=порядок:select:список_вариантов:default:текст
Комментарий к константе:
Selection from the list of possible variants. Is displayed as a dropdown.
Пример (из PHPDoc функции cot_config_add(), демонстрирующий формат опций, но не setup-строку):
'variants' => '5,10,15,20,25,30,35,40,50'
В setup-файле это выглядело бы так:
my_select=01:select:5,10,15,20,25,30,35,40,50:20:My select field
Разбор:
- порядок:
01; - тип:
select; - варианты:
5,10,15,20,25,30,35,40,50; - default:
20; - текст:
My select field.
При обработке в cot_config_input() строка вариантов разбивается регулярным выражением #\s*,\s*#, то есть разделителем является запятая с возможными пробелами вокруг. Результат: массив значений. Далее вызывается cot_config_selecttitles(), которая может заменить значения на подписи из языкового массива.
9. Тип radio
Строка в setup-файле:
имя=порядок:radio:варианты:default:текст
Комментарий к константе:
Radio yes/no selection.
Если поле variants не задано, отображается переключатель «да/нет» — значения [1, 0] с подписями Yes и No.
Если variants задано, оно используется как список значений (аналогично SELECT), но подписи всё равно формируются через cot_config_selecttitles(). В этом случае пустое значение заменяется на config_default.
Примеры из файла i18n.setup.php:
omitmain=03:radio::1:Omit language parameter in the URL if pointing to main language
rewrite=04:radio::0:Enable URL overwrite for language parameter
cookie=05:radio::0:Remember language selection in cookie
Разбор первой строки:
- порядок:
03; - тип:
radio; - варианты: пусто → переключатель Yes/No;
- default:
1; - текст:
Omit language parameter in the URL if pointing to main language.
10. Тип callback
Строка в setup-файле:
имя=порядок:callback:выражение:default:текст
Комментарий к константе:
Callback function type
Поле variants должно содержать выражение вида function_name(params). Регулярное выражение для его разбора (по коду cot_config_input()):
#^(\w+)\((.*?)\)$#
Если выражение совпадает с шаблоном и указанная функция существует, она вызывается для получения списка значений. Результат передаётся в cot_config_selecttitles() и затем в cot_selectbox().
Если функция возвращает ассоциативный массив, ключи становятся значениями, а значения — подписями. Ассоциативность определяется через сравнение range(0, count($params) - 1) и array_keys($params). Если массивы не совпадают — массив считается ассоциативным.
Пример setup-строки:
my_callback=01:callback:my_callback_func():default_value:Callback field
11. Тип hidden
Строка в setup-файле:
имя=порядок:hidden:варианты:default:текст
Комментарий к константе:
Hidden config. It is actually a text string, but it is not displayed anywhere
Такая конфигурация хранится в базе данных, но не отображается в интерфейсе администратора.
Ключевые моменты:
- в
cot_config_load()иcot_config_list()записи с этим типом исключаются из выборки; - в
cot_config_update()такие записи не удаляются, даже если их нет в новом списке опций; - в
cot_config_input()для этого типа возвращается пустая строка.
Пример setup-строки:
secret_key=01:hidden:::Hidden secret value
12. Тип separator
Строка в setup-файле:
имя=порядок:separator:варианты:default:текст
Комментарий к константе:
Visual separator/fieldset
Разделитель используется для визуального разделения групп настроек. Значения не имеет. В cot_config_update_options() такие записи пропускаются явной проверкой. В cot_config_input() для них возвращается пустая строка.
Пример setup-строки, разделяющей две группы настроек:
group_sep=05:separator:::Advanced options
Обратите внимание: поле text для разделителя обычно содержит заголовок группы.
13. Тип range
Строка в setup-файле:
имя=порядок:range:min,max,step:default:текст
Комментарий к константе:
Integer range
В cot_config_input() строка вариантов разбивается на массив через preg_split('#\s*,\s*#', $options), затем формируется диапазон через range($range[0], $range[1], empty($range[2]) ? 1 : $range[2]).
Это означает:
- первый элемент — минимум;
- второй элемент — максимум;
- третий элемент — шаг; если не задан, используется 1.
Пример setup-строки:
per_page=06:range:10,50,10:20:Items per page
Разбор:
- минимум:
10; - максимум:
50; - шаг:
10; - default:
20.
В выпадающем списке будут значения: 10, 20, 30, 40, 50.
14. Тип custom
Строка в setup-файле:
имя=порядок:custom:выражение:default:текст
Комментарий к константе:
Custom type.
Поле variants должно содержать выражение вида function_name(params). Регулярное выражение для разбора: #^(\w+)\((.*?)\)$#.
Логика отличается от CALLBACK: при импорте значения ищется функция function_name_filter. Если она существует, вызывается через call_user_func_array() с параметрами [&$raw_input, $cfg_var, ...callback_params].
Если функция function_name_filter не найдена, имя функции разбивается по символу _, последний сегмент переводится в верхний регистр и проверяется как встроенный фильтр: INT, BOL, PSW, ALP, TXT, NUM. Также проверяется наличие этого ключа в глобальном массиве $cot_import_filters.
Пример setup-строки, использующей готовый фильтр cot_config_type_int_filter:
custom_int=07:custom:cot_config_type_int(1, 100):50:Custom integer field
Здесь:
- вызывается функция
cot_config_type_intдля отображения поля; - при импорте вызывается
cot_config_type_int_filterс параметрами1и100.
15. Типы text и прочие (default)
Строка в setup-файле:
имя=порядок:text:варианты:default:текст
Комментарий к константе:
Generic text configuration. Is displayed as textarea. Contains text. Is used by default.
Любая строка, у которой тип не совпадает ни с одним из восьми явных case, получит COT_CONFIG_TYPE_TEXT. Это включает и явное указание text, и любые другие значения.
Пример из файла i18n.setup.php:
locales=02:text::en|English:Site locales
Разбор:
- порядок:
02; - тип:
text→COT_CONFIG_TYPE_TEXT(через default); - варианты: пусто;
- default:
en|English; - текст:
Site locales.
В UI такое поле отображается как textarea с 8 строками и шириной 56 символов (согласно cot_config_input(): cot_textarea($name, $value, 8, 56)).
16. Структура выходного массива
Результат функции — массив, каждый элемент которого имеет следующую структуру:
[
'name' => string, // имя параметра (из ключа setup-файла)
'order' => string, // порядок (после trim)
'type' => int, // константа COT_CONFIG_TYPE_*
'variants' => string, // варианты (без trim)
'default' => string, // значение по умолчанию (без trim)
'text' => string, // текст описания (после trim)
]
Порядок ключей в каждом элементе — именно такой, как показано. Индексы массива — числовые, от 0 до count($options) - 1. Ключи исходного массива $info_cfg в результат не переносятся.
Если входной массив пуст или не является массивом — результат тоже пустой массив.
Полученный массив затем передаётся в cot_config_add() или cot_config_update() — там он используется для формирования записей в таблице конфигурации.
17. Секция COT_EXT_CONFIG_STRUCTURE
Помимо секции COT_EXT_CONFIG, в setup-файле может присутствовать секция COT_EXT_CONFIG_STRUCTURE. Она предназначена для конфигурации, которая будет применяться на уровне категорий структуры (модуль, у которого есть категории).
Из cot_extension_install():
// Install structure config if present
$info_cfg = cot_infoget($setup_file, 'COT_EXT_CONFIG_STRUCTURE');
if ($info_cfg) {
$options = cot_config_parse($info_cfg, $isModule);
if ($update) {
if (cot_config_update($extensionCode, $options, $isModule, '__default') > 0) {
// Update all nested categories
$type = $isModule ? 'module' : 'plug';
$res = $db->query("SELECT DISTINCT config_subcat FROM $db_config
WHERE config_owner = '$type' AND config_cat = '$extensionCode'
AND config_subcat != '' AND config_subcat != '__default'");
$cat_list = $res->fetchAll(PDO::FETCH_COLUMN, 0);
foreach ($cat_list as $cat) {
cot_config_update($extensionCode, $options, $isModule, $cat);
}
cot_message('ext_config_struct_updated');
}
} elseif (count($options) > 0) {
if (cot_config_add($extensionCode, $options, $isModule, '__default')) {
cot_message('ext_config_struct_installed');
} else {
cot_error('ext_config_struct_error');
return false;
}
}
}
Формат секции COT_EXT_CONFIG_STRUCTURE идентичен формату COT_EXT_CONFIG. Функция cot_config_parse() обрабатывает её точно так же. Отличие только в том, что при установке опции добавляются с категорией __default, а при обновлении распространяются на все существующие категории модуля.
18. Использование результата в cot_extension_install()
После разбора setup-конфигурации cot_extension_install() вызывает одну из двух функций:
cot_config_add($extensionCode, $options, $isModule)— при установке;cot_config_update($extensionCode, $options, $isModule)— при обновлении.
Обе функции принимают результат cot_config_parse() напрямую, без дополнительной обработки. Это означает, что структура массива, которую возвращает cot_config_parse(), полностью соответствует ожиданиям cot_config_add() и cot_config_update().
Напомним поля, ожидаемые cot_config_add():
name;type;default;variants;order;text.
Это те же самые поля, которые формирует cot_config_parse(). Совпадение полное.
19. Краевые случаи и примечания
Ниже перечислены замечания, прямо следующие из анализа кода. Они не являются предположениями о замысле авторов.
- Не-массив на входе. Если
$info_cfgне является массивом, функция возвращает пустой массив. Условиеis_array($info_cfg)явно проверяется. - Пустой тип. Если после
trim()поле типа пусто, запись пропускается. Условие!empty($line[1])это гарантирует. - Пустое имя. Если имя параметра пусто (
empty($i)), запись пропускается. В реальных setup-файлах имя не может быть пустым из-за того, какcot_infoget()разбирает строки: пустые ключи не добавляются. - Недостаток сегментов. Если строка содержит меньше пяти сегментов (например,
01:string:::), обращение к$line[4]вызовет предупреждение PHP о неопределённом индексе. Функция не проверяет длину массива перед доступом к$line[4]. В результирующей записи полеtextстанет пустой строкой (если предупреждения подавлены) илиnull. - Избыток сегментов. Если строка содержит больше пяти сегментов (например, из-за знака
:в тексте), лишние сегменты игнорируются — они не попадают в результирующую запись. - Пробелы в
variantsиdefault. Эти поля не обрезаются. Пробелы вокруг значений останутся в результирующем массиве и в базе данных. Для типа SELECT это не критично, так какpreg_split('#\s*,\s*#', ...)удаляет пробелы вокруг запятых. Но для типа STRING или TEXT значение по умолчанию с пробелами сохранится как есть. - Регистр типа. Сравнение в switch чувствительно к регистру. Строка
Stringне совпадёт сstringи попадёт вdefault. - Тип text явно не обработан. В switch нет
case 'text'. Значениеtextпопадает вdefaultи получаетCOT_CONFIG_TYPE_TEXT. Результат совпадает с ожидаемым, но обработка неявная. - Второй аргумент функции игнорируется.
cot_extension_install()вызываетcot_config_parse($info_cfg, $isModule), но сама функция объявлена только с одним параметром. Второй аргумент не используется. - Возврат при отсутствии записи. Если входной массив пуст, возвращается пустой массив. Если ни одна строка не прошла проверку, результат также пуст.
- Обработка спецсимволов. Функция не производит никакого экранирования или преобразования значений. Все строки сохраняются в том виде, в каком они были в setup-файле (с учётом описанных выше особенностей обрезки пробелов).
- Использование
$line['Type']. В switch используется строковый ключ'Type', а не числовой. Это значит, что в промежуточном массиве$lineключTypeне пересекается с числовыми ключами 0–4. При формировании результирующей записи используется$line['Type'].
20. Полные примеры для каждого типа
Ниже приведены примеры setup-строк и результат их разбора функцией cot_config_parse(). Предполагается, что входной массив содержит одну строку.
Пример 1. Тип string
Setup-строка:
my_string=01:string:::My string field
Результат:
[
[
'name' => 'my_string',
'order' => '01',
'type' => 1, // COT_CONFIG_TYPE_STRING
'variants' => '',
'default' => '',
'text' => 'My string field',
]
]
Пример 2. Тип select
Setup-строка:
my_select=02:select:red,green,blue:red:Choose color
Результат:
[
[
'name' => 'my_select',
'order' => '02',
'type' => 2, // COT_CONFIG_TYPE_SELECT
'variants' => 'red,green,blue',
'default' => 'red',
'text' => 'Choose color',
]
]
Пример 3. Тип radio с явными вариантами
Setup-строка:
my_radio=03:radio:on,off:on:Toggle option
Результат:
[
[
'name' => 'my_radio',
'order' => '03',
'type' => 3, // COT_CONFIG_TYPE_RADIO
'variants' => 'on,off',
'default' => 'on',
'text' => 'Toggle option',
]
]
Пример 4. Тип radio без вариантов (Yes/No)
Setup-строка:
enable_cache=04:radio::1:Enable cache
Результат:
[
[
'name' => 'enable_cache',
'order' => '04',
'type' => 3, // COT_CONFIG_TYPE_RADIO
'variants' => '',
'default' => '1',
'text' => 'Enable cache',
]
]
Пример 5. Тип callback
Setup-строка:
sort_field=05:callback:my_sort_options():date:Sort field
Результат:
[
[
'name' => 'sort_field',
'order' => '05',
'type' => 4, // COT_CONFIG_TYPE_CALLBACK
'variants' => 'my_sort_options()',
'default' => 'date',
'text' => 'Sort field',
]
]
Пример 6. Тип hidden
Setup-строка:
secret_token=06:hidden:::Internal token
Результат:
[
[
'name' => 'secret_token',
'order' => '06',
'type' => 5, // COT_CONFIG_TYPE_HIDDEN
'variants' => '',
'default' => '',
'text' => 'Internal token',
]
]
Пример 7. Тип separator
Setup-строка:
advanced_sep=07:separator:::Advanced settings
Результат:
[
[
'name' => 'advanced_sep',
'order' => '07',
'type' => 6, // COT_CONFIG_TYPE_SEPARATOR
'variants' => '',
'default' => '',
'text' => 'Advanced settings',
]
]
Пример 8. Тип range
Setup-строка:
per_page=08:range:10,50,10:20:Items per page
Результат:
[
[
'name' => 'per_page',
'order' => '08',
'type' => 7, // COT_CONFIG_TYPE_RANGE
'variants' => '10,50,10',
'default' => '20',
'text' => 'Items per page',
]
]
Пример 9. Тип custom
Setup-строка:
custom_number=09:custom:cot_config_type_int(1, 100):50:Custom number
Результат:
[
[
'name' => 'custom_number',
'order' => '09',
'type' => 8, // COT_CONFIG_TYPE_CUSTOM
'variants' => 'cot_config_type_int(1, 100)',
'default' => '50',
'text' => 'Custom number',
]
]
Пример 10. Тип text (через default)
Setup-строка:
description=10:text::Default description:Long description
Результат:
[
[
'name' => 'description',
'order' => '10',
'type' => 0, // COT_CONFIG_TYPE_TEXT
'variants' => '',
'default' => 'Default description',
'text' => 'Long description',
]
]
Пример 11. Неизвестный тип
Setup-строка:
unknown_type=11:int:::Some field
Результат:
[
[
'name' => 'unknown_type',
'order' => '11',
'type' => 0, // COT_CONFIG_TYPE_TEXT (default)
'variants' => '',
'default' => '',
'text' => 'Some field',
]
]
Пример 12. Множество строк из реального setup-файла
Входной массив:
[
'cats' => '01:string:::Category codes',
'locales' => '02:text::en|English:Site locales',
'omitmain' => '03:radio::1:Omit language parameter in the URL if pointing to main language',
'rewrite' => '04:radio::0:Enable URL overwrite for language parameter',
'cookie' => '05:radio::0:Remember language selection in cookie',
]
Результат:
[
[
'name' => 'cats',
'order' => '01',
'type' => 1, // COT_CONFIG_TYPE_STRING
'variants' => '',
'default' => '',
'text' => 'Category codes',
],
[
'name' => 'locales',
'order' => '02',
'type' => 0, // COT_CONFIG_TYPE_TEXT (default)
'variants' => '',
'default' => 'en|English',
'text' => 'Site locales',
],
[
'name' => 'omitmain',
'order' => '03',
'type' => 3, // COT_CONFIG_TYPE_RADIO
'variants' => '',
'default' => '1',
'text' => 'Omit language parameter in the URL if pointing to main language',
],
[
'name' => 'rewrite',
'order' => '04',
'type' => 3, // COT_CONFIG_TYPE_RADIO
'variants' => '',
'default' => '0',
'text' => 'Enable URL overwrite for language parameter',
],
[
'name' => 'cookie',
'order' => '05',
'type' => 3, // COT_CONFIG_TYPE_RADIO
'variants' => '',
'default' => '0',
'text' => 'Remember language selection in cookie',
],
]
Комментарии (0)
Мультикатегории статьи
Дополнительные категории, в которых эта статья показывается как похожая.Автор контента
Оффлайн
Sodium Carbonate
Последняя авторизация: 20.09.2026 04:00
- Страница размещена: 20.09.2026 03:57
- Последнее обновление: 20.09.2026 03:58