Документация для разработчиков

Кастомизация

Добавление своего провайдера в список

Про создание своего провайдера можно почитать тут.

Регистрируем обработчик получения списка провайдеров:

//Для модуля
\Bitrix\Main\EventManager::getInstance(
)->registerEventHandler('documentgenerator', 'onGetDataProviderList', 'crm', '\Bitrix\Crm\Integration\DocumentGeneratorManager', 'getDataProviders');
//рантайм
\Bitrix\Main\EventManager::getInstance(
)->addEventHandler('documentgenerator', 'onGetDataProviderList', ['myClass', 'addDocumentProviders']);

Обработчик должен возвращать массив вида:

$result[$className] = [
    'NAME' => 'Языковое название',
    'CLASS' => $className,
    'MODULE' => 'myModule',
];

где $className - полное название класса с неймспейсом.

Это должен быть наследник класса \Bitrix\DocumentGenerator\DataProvider.

Добавление дополнительных данных в результат \Bitrix\DocumentGenerator\Document::getFile()

В своём наследнике класса \Bitrix\DocumentGenerator\DataProvider определяем метод getAdditionalDocumentInfo().

Этот метод должен вернуть массив, который будет подмешан в результат \Bitrix\DocumentGenerator\Document::getFile().

Изменение значений полей документа перед генерацией (с documentgenerator 18.0.6)

Подписываемся на событие:

\Bitrix\Main\EventManager::getInstance()->addEventHandler('documentgenerator', 'onBeforeProcessDocument', 'onBeforeProcessDocument');

function onBeforeProcessDocument($event)
{
	$document = $event->getParameter('document');
	/** @var \Bitrix\DocumentGenerator\Document $document */
	// добавить дополнительные описания полей
	// $document->setFields($newFields);
	// добавить значения полей
	//$document->setValues(['someField' => 'myCustomValue']);
	// получить список полей и их текущих значений
    //$fields = $document->getFields();
}

Обработчик события может ничего не возвращать, все действия производятся над объектом документа.

С объектом следует быть осторожнее. Если в обработчике вызвать $document->getFile() может возникнуть бесконечная рекурсия.

Отслеживание изменений документов

Подписываемся на события

// создание документа (уже после сохранения записи в БД)
\Bitrix\Main\EventManager::getInstance()->addEventHandler('documentgenerator', 'onCreateDocument', ['myClass', 'onCreateDocument']);
// изменение документа
\Bitrix\Main\EventManager::getInstance()->addEventHandler('documentgenerator', 'onUpdateDocument', ['myClass', 'onUpdateDocument']);

В обоих случаях, аналогично onBeforeProcessDocument, в событие придёт параметр $document с объектом документа.

// окончание конвертации документа
\Bitrix\Main\EventManager::getInstance()->addEventHandler('documentgenerator', 'onDocumentTransformationComplete', ['myClass', 'onDocumentTransformationComplete']);

В обработчик этого события придут два параметра - $documentId и $data.

$documentId - ID документа, по нему документ можно поднять через \Bitrix\DocumentGenerator\Document::loadById($documentId)

$data - результат \Bitrix\DocumentGenerator\Document::getFile().

Реализация своих модификаторов для шаблона

Чтобы сделать обработку своих провайдеров необходимо написать наследника \Bitrix\DocumentGenerator\Value.

Поле провайдера должно вернуть сформированный объект, либо в описании поля должен быть указан тип и формат по умолчанию.

Лучше всего делать по образцу (например \Bitrix\DocumentGenerator\Value\DateTime).

Использование своего хранилища документов

Сначала необходимо реализовать класс, который будет воспроизводить интерфейс \Bitrix\DocumentGenerator\Storage. Дальше можно либо через событие onBeforeProcessDocument менять хранилище документа перед его обработкой:

$storage = new MyStorage();
$document->setStorage($storage);

либо сохранить значение хранилища по умолчанию через опцию

\Bitrix\Main\Config\Option::set('documentgenerator', 'default_storage_type', MyStorage::class);

Перед реализацией рекомендется посмотреть существующие классы \Bitrix\DocumentGenerator\Storage\File, \Bitrix\DocumentGenerator\Storage\BFile, \Bitrix\DocumentGenerator\Storage\Disk.

Отслеживание просмотра публичной ссылки на документ (с documentgenerator 18.6.0)

При просмотре публичной ссылки отправляется php-событие

\Bitrix\Main\EventManager::getInstance()->send(new \Bitrix\Main\Event('documentgenerator', 'onPublicView', ['document' => $document]));

где $document - объект

Чтобы узнать, документ какого модуля был использован, над дернуть шаблон документа

$template = $document->getTemplate();
if($template && $template->MODULE_ID == 'crm')
{
    // your code for crm here
}

Если надо отследить документа для CRM и получить данные об источнике документа, можно воспользоваться следующим кодом:

$provider = $document->getProvider();
if($provider && $provider instanceof \Bitrix\Crm\Integration\DocumentGenerator\DataProvider\CrmEntityDataProvider)
{
    $ownerId = $provider->getSource();
    $ownerType = $provider->getCrmOwnerType();
}


Пользовательские комментарии

Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
© «Битрикс», 2001-2019, «1С-Битрикс», 2019
Наверх