Доброго вечера, ночера, иль утречка, товарищи программисты. Незнаю сюда нет, но если нет меня добрые модераторы не побьют и перенесут в нужное место.
А теперь к сути. сделал свой провайдер наследовался от Dinamic. Что бы потом им подменить родной. Но он по какой-то причине прописывается в нем уже на начале подключения так должно быть или нет. Из-за этого при нажатии в смарт-просессе на кнопку "документ" выходит "Wrong provider". Если например наследника Dinamic заменить на Order или другой, то просто добавляется новый провайдер в список. Подмена идет у тех где в списке есть ключь 'ORIGINAL'
| Код |
|---|
[bitrix\crm\integration\documentgenerator\dataprovider\dynamic1300_99] => Array (
[NAME] => Мой провайдер (Общая)
[CLASS] => bitrix\crm\integration\documentgenerator\dataprovider\dynamic1300_99
[MODULE] => sporina.logistics
[ORIGINAL] => sporina\documentgenerator\dataprovider\logisticsprovider
[ORIGINAL_NAME] => Мой провайдер
)
[bitrix\crm\integration\documentgenerator\dataprovider\dynamic1304_100] => Array
(
[NAME] => Задания на доставку (Точка отгрузки)
[CLASS] => bitrix\crm\integration\documentgenerator\dataprovider\dynamic1304_100
[MODULE] => crm
[ORIGINAL] => bitrix\crm\integration\documentgenerator\dataprovider\dynamic1304
[ORIGINAL_NAME] => Задания на доставку
) |
первый с подменой, второй без.
Добавляется так
| Код |
|---|
public static function getDataProviders(): array
{
static $result;
if($result === null)
{
$result = [];
$providers = [
\Sporina\DocumentGenerator\DataProvider\LogisticsProvider::class,
];
foreach($providers as $provider)
{
/** @var Nameable $provider */
$className = mb_strtolower($provider);
$result[$className] = [
'NAME' => $provider::getLangName(),
'CLASS' => $className,
'MODULE' => 'sporina.logistics',
];
}
}
return $result;
} |
собственно сам провайдер
| Код |
|---|
<?php
namespace Sporina\DocumentGenerator\DataProvider;
use Bitrix\Crm\Integration\DocumentGenerator\DataProvider\Dynamic;
use \Bitrix\DocumentGenerator\DataProvider\ArrayDataProvider;
use Bitrix\Crm\Service\Container;
use Bitrix\Main\Data\Cache;
use Bitrix\Main\Loader;
use Bitrix\Iblock\ElementTable;
use Bitrix\DocumentGenerator\DataProviderManager;
use Bitrix\DocumentGenerator\Nameable;
class LogisticsProvider extends Dynamic
{
public static function getEntityTypeId(): int
{
return 1300;
}
public function getFields(): array
{
$fields = parent::getFields();
// Получаем все пользовательские поля для сущности 128
$ufManager = $GLOBALS['USER_FIELD_MANAGER'];
$languageId = DataProviderManager::getInstance()->getContext()->getRegionLanguageId();
$entityId = static::getEntityTypeId();
$userFields = $ufManager->GetUserFields('CRM_' . $entityId, $entityId, $languageId);
foreach ($userFields as $userField) {
$ufCode = $userField['FIELD_NAME'];
$uti = $userField['USER_TYPE_ID'];
// Проверяем, является ли поле связанным с инфоблоком
if (strpos($ufCode, 'UF_') === 0 && $uti ==='iblock_element') {
$entityId = $this->getSource();
// Получаем код элемента инфоблока из пользовательского поля
//$iblockElementCode = $this->getIblockElementCode($entityId, $ufCode);
$iblockElementCode = $userField['SETTINGS']['IBLOCK_ID'];
if ($iblockElementCode) {
// Получаем поля элемента инфоблока
$iblockFields = $this->getIblockFieldsByCode($iblockElementCode);
foreach ($iblockFields as $propertyCode => $propertyValue) {
$dynamicFieldCode = $ufCode . '.' . $propertyCode;
$fields[$dynamicFieldCode] = [
'TITLE' => $userField['EDIT_FORM_LABEL'] . ' (' . $propertyCode . ')',
'VALUE' => [$this, 'getIblockFieldValue'/*, $ufCode, $propertyCode*/],
];
$this->data[$dynamicFieldCode]='@@@@@';
}
}
}
}
// Список связанных элементов другого смарт-процесса через PARENT_ID_128
$fields['LIST_SELECTED'] = [
'TITLE' => 'Список точек',
'PROVIDER' => ArrayDataProvider::class,
'OPTIONS' => [
'ITEM_PROVIDER' => \Bitrix\Crm\Integration\DocumentGenerator\DataProvider\Dynamic1304::class,
'ITEM_NAME' => 'Item',
'ITEM_TITLE' => 'Точки',
'ITEM_OPTIONS' => [
'isLightMode' => true,
],
],
'VALUE' => [$this, 'loadSelected'],
];
return $fields;
}
public function getIblockFieldValue($ufCode, $propertyCode): ?string
{
$entityId = $this->getSource();
if (!$entityId || empty($ufCode) || empty($propertyCode)) {
return 'Нет значения';
}
$iblockElementCode = $this->getIblockElementCode($entityId, $ufCode);
if (!$iblockElementCode) {
return 'Нет значения';
}
$iblockFields = $this->getIblockFieldsByCode($iblockElementCode);
return $iblockFields[$propertyCode] ?? 'Нет значения';
}
protected function getIblockElementCode($entityId, $ufCode): ?string
{
$container = Container::getInstance();
//$entity = $container->getItem(static::getEntityTypeId(), $entityId);
//return $entity->getField($ufCode);
$entity = $container->getFactory(static::getEntityTypeId())->getItem($entityId);
$itemData = $entity->getData();
return $itemData[$ufCode];
}
protected function getIblockFieldsByCode($elementCode): array
{
$cache = Cache::createInstance();
$cacheId = 'iblock_element_' . $elementCode;
$cacheDir = '/iblock/element/';
if ($cache->initCache(3600, $cacheId, $cacheDir)) {
return $cache->getVars();
} elseif ($cache->startDataCache()) {
if (!Loader::includeModule('iblock')) {
$cache->endDataCache([]);
return [];
}
//$result = ElementTable::getList([
//$result = \Bitrix\Iblock\ElementPropertyTable::getList([
$result = \Bitrix\Iblock\PropertyTable::getList([
//'select' => ['ID', 'NAME', 'CODE', 'PROPERTY_*'],
'select' => ['*'],
'filter' => [
//'=CODE' => $elementCode,
//'=IBLOCK_ID' => 88,
//'IBLOCK_ELEMENT_ID' => $elementCode
'=IBLOCK_ID' => $elementCode,
],
//'limit' => 1,
//])->fetch();
])->fetchAll();
$properties = [];
if ($result) {
foreach ($result as $key => $value) {
//if (strpos($key, 'PROPERTY_') === 0) {
//$propertyCode = substr($key, 9);
//$propertyCode = $value['IBLOCK_PROPERTY_ID'];
$propertyCode = $value['CODE'];
$properties[$propertyCode] = $value;
//}
}
}
$cache->endDataCache($properties);
return $properties;
}
return [];
}
public function loadSelected(): array
{
$entityId = $this->getSource();
$linkedItems = [];
if ($entityId) {
$linkedItems = $this->getLinkedItems($entityId);
}
return $linkedItems;
}
protected function getLinkedItems($entityId): array
{
$entityTypeID = static::getEntityTypeId();
$factory = Container::getInstance()->getFactory($entityTypeID);
$items = $factory->getItems(['filter' => ['=PARENT_ID_128' => $entityId]]);
$result = [];
foreach ($items as $item) {
$result[] = [
'ID' => $item->getId(),
'TITLE' => $item->getField('TITLE'),
'NAME' => $item->getField('NAME'),
'DATE_CREATE' => $item->getField('DATE_CREATE'),
// Добавьте нужные поля
];
}
return $result;
}
protected function getHiddenFields(): array
{
return array_merge(parent::getHiddenFields(), [
'UF_HIDDEN_FIELD',
]);
}
public static function getLangName(): string
{
//return \Bitrix\Main\Localization\Loc::getMessage('CRM_DOCGEN_MY_PROVIDER_TITLE') ?: 'Мой провайдер';
return 'Мой провайдер';
}
} |
тут немного бардак, но не в этом проблема. Само наследование верно, кто может подсказать пробовал и Dynamic1300 который имеется, но результат тот же. И почему он подменяет его? ...Спасибо!