Yandex Metrika
sanches.free 17 просмотров

Битрикс: ConvertDateTime и ConvertTimeStamp, первая публикация и JSON карты (id и url)

Страница-шпаргалка «Различные полезности» на сводит к коротким примерам работы с датой через API главного модуля. Ниже — тот же смысл своими словами: когда хватает ConvertDateTime и ConvertTimeStamp, а когда удобнее DateTime; плюс практичная связка с инфоблоками: строки активности, ответ AJAX после первого сохранения и JSON для карты. Подробный разбор форматов полей и интервалов — в материале о работе с датой в Битрикс, фильтры по границам показа — в заметке про условия фильтрации по датам.

ConvertDateTime: из строки сайта в нужный формат

ConvertDateTime берёт дату-время в «формате сайта» (как его хранит платформа для полей вроде ACTIVE_FROM) и возвращает строку в шаблоне, который вы задаёте вторым аргументом; третий параметр — язык формата (ru и т.д.). Для выгрузки в SQL или API часто нужен YYYY-MM-DD:

ConvertDateTime($item['ACTIVE_FROM'], 'YYYY-MM-DD', 'ru');

Тот же результат можно получить через Unix-метку и date(), если явно согласовать разбор входной строки с тем, как она приходит из выборки:

date('d.m.y', strtotime($item['ACTIVE_FROM']));

Смысл один: не хранить вручную «угадай формат», а либо опираться на API конвертации, либо один раз зафиксировать шаблон разбора под ваш проект.

ConvertTimeStamp: из Unix в строку сайта

ConvertTimeStamp переводит Unix-время в строку в формате сайта. Полный вывод с датой и временем:

ConvertTimeStamp(time(), 'FULL');

Эквивалент на DateTime — задать тот же шаблон, что использует публичная часть (часто это форматы из языковых файлов; для иллюстрации фиксируют константу):

const BITRIX_DATETIME_FORMAT = 'd.m.Y H:i:s';
$date = new DateTime();
$date->format(self::BITRIX_DATETIME_FORMAT);

Первая публикация элемента: когда появляются id и url

Пока запись в b_iblock_element не создана успешным CIBlockElement::Add() (или эквивалентом через ORM), постоянного числового идентификатора нет — в интерфейсе и в JSON до ответа сервера не нужно «придумывать» id. После сохранения обработчик может сразу вернуть пару id и готовую детальную ссылку из выборки:

use Bitrix\Main\Web\Json;

$element = new CIBlockElement();
$newId = (int) $element->Add([
    'IBLOCK_ID' => $iblockId,
    'NAME' => $title,
    'ACTIVE' => 'Y',
]);

if ($newId <= 0) {
    echo Json::encode(['ok' => false, 'error' => $element->LAST_ERROR]);
    return;
}

$row = CIBlockElement::GetList(
    [],
    ['ID' => $newId, 'IBLOCK_ID' => $iblockId],
    false,
    ['nTopCount' => 1],
    ['ID', 'DETAIL_PAGE_URL']
)->Fetch();

echo Json::encode([
    'ok' => true,
    'id' => $newId,
    'url' => (string) ($row['DETAIL_PAGE_URL'] ?? ''),
]);

Фронт после первой успешной записи получает и стабильный id, и ЧПУ карточки, а не заглушку «до HTTP 200».

Карта: тот же контракт id + url

Для меток на карте обычно добавляют координаты; для ссылки «подробнее» из подписи достаточно тех же id и url. Пример выборки активных элементов с заполненными свойствами широты и долготы и отдачи JSON (имена свойств подставьте под свой инфоблок):

use Bitrix\Main\Web\Json;

$markers = [];
$res = CIBlockElement::GetList(
    ['SORT' => 'ASC'],
    [
        'IBLOCK_ID' => $mapIblockId,
        'ACTIVE' => 'Y',
        '!PROPERTY_MAP_LAT' => false,
        '!PROPERTY_MAP_LNG' => false,
    ],
    false,
    false,
    ['ID', 'DETAIL_PAGE_URL', 'PROPERTY_MAP_LAT', 'PROPERTY_MAP_LNG']
);
while ($row = $res->GetNext()) {
    $lat = trim((string) $row['PROPERTY_MAP_LAT_VALUE']);
    $lng = trim((string) $row['PROPERTY_MAP_LNG_VALUE']);
    if ($lat === '' || $lng === '') {
        continue;
    }
    $path = (string) $row['DETAIL_PAGE_URL'];
    $absolute = $path;
    if ($path !== '' && defined('SITE_SERVER_NAME') && SITE_SERVER_NAME && strpos($path, 'http') !== 0) {
        $absolute = 'https://' . SITE_SERVER_NAME . $path;
    }
    $markers[] = [
        'id' => (int) $row['ID'],
        'url' => $absolute,
        'lat' => (float) $lat,
        'lng' => (float) $lng,
    ];
}
header('Content-Type: application/json; charset=UTF-8');
echo Json::encode($markers);

Если в виджете нужны только пары id и url без координат, уберите свойства и соответствующие поля массива.

Краткий чеклист

  • ConvertDateTime — строка в формате сайта → ваша строка по шаблону; ConvertTimeStamp — Unix → строка сайта.
  • До успешного создания элемента постоянного id в базе нет.
  • После Add в типовом AJAX отдайте минимум id и DETAIL_PAGE_URL; для карты добавьте координаты в тот же JSON, который читает сценарий карты.

Не хотите копаться сами?

Починю за 1-3 дня. Без предоплаты — оплата по результату.

15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии