Антон Горбылев,
Код провайдера сделки.
Унаследовался от коробочного и подменил.
Вопрос задавал по полю "WEB_SITES"
Из метода getWebSites возвращается массив, но в поля редактирования документа это значение не попадает. Ну это я описывал в сообщении выше
Код провайдера сделки.
Код |
---|
<?php namespace Company\Crm\Integration\DocumentGenerator\DataProvider; use Bitrix\Crm\Integration\DocumentGenerator\DataProvider\Company; use Bitrix\Crm\Requisite\EntityLink; use Bitrix\DocumentGenerator\DataProvider; use Bitrix\Main\Localization\Loc; class Deal extends \Bitrix\Crm\Integration\DocumentGenerator\DataProvider\Deal { public function getFields() { if ($this->fields === null) { parent::getFields(); $this->fields['UF_SELLER'] = [ 'TITLE' => Loc::getMessage('CRM_DOCGEN_DATAPROVIDER_DEAL_UF_SELLER_TITLE'), 'VALUE' => [$this, 'getUfSeller'], 'TYPE' => DataProvider::FIELD_TYPE_NAME ]; $this->fields['CUSTOMER_NAME'] = [ 'VALUE' => [$this, 'getCompanyName'], 'TITLE' => Loc::getMessage('CRM_DOCGEN_DATAPROVIDER_DEAL_CUSTOMER_NAME_TITLE'), ]; $this->fields['WEB_SITES'] = [ //'PROVIDER' => \Company\Crm\Integration\DocumentGenerator\DataProvider\Deal::class, 'VALUE' => [$this, 'getWebSites'], 'TITLE' => 'WEB', ]; if (!$this->isLightMode() && isset($this->fields['MY_COMPANY'])) { $this->fields['MY_COMPANY']['VALUE'] = [$this, 'getMyCompanyIdFilteredByProducts']; } } return $this->fields; } public function getUfSeller(): array { $sellerData = []; $sellerId = intval($this->getUserFieldValue('UF_SELLER')); if ($sellerId > 0) { $data = \CUser::GetByID($sellerId)->Fetch(); if ($data) { $sellerData = $data; } } return $sellerData; } public function getCompanyName(): string { $companyName = ''; $company = $this->getValue('COMPANY'); if ($company) { $companyName = $company->getValue('TITLE'); } return $companyName; } public function getWebSites() { $webSites = []; $multiFieldDbResult = \CCrmFieldMulti::GetList( ['ID' => 'asc'], [ 'ENTITY_ID' => \CCrmOwnerType::DealName, 'ELEMENT_ID' => $this->source, ] ); while ($multiField = $multiFieldDbResult->Fetch()) { $webSites[] = [ 'VALUE' => $multiField['VALUE'] . ' [' . $multiField['COMPLEX_ID'] . ']', 'TITLE' => $multiField['VALUE'] . ' [' . $multiField['COMPLEX_ID'] . ']', 'SELECTED' => false, ]; } return $webSites; } public function getMyCompanyIdFilteredByProducts($defaultMyCompanyId = null) { $ufKitProductsField = $this->getUserFieldDescription('UF_KIT_PRODUCTS'); $kitProductsId = $this->getRawUserFieldValue('UF_KIT_PRODUCTS'); $iblockId = $ufKitProductsField['SETTINGS']['IBLOCK_ID']; $availableCompanies = []; if ($iblockId && $kitProductsId) { $iterator = \CIBlockElement::GetList( [], ['IBLOCK_ID' => $iblockId, 'ID' => $kitProductsId], false, false, ['ID', 'IBLOCK_ID', 'PROPERTY_CONTRACTOR'] ); while ($obj = $iterator->GetNextElement()) { $fields = $obj->GetFields(); if ($companyId = $fields['PROPERTY_CONTRACTOR_VALUE']) { $availableCompanies[$companyId] = $companyId; } } } $defaultMyCompanyId = intval($defaultMyCompanyId); if (!$defaultMyCompanyId) { $defaultMyCompanyId = $this->getLinkData()['MYCOMPANY_ID']; } if (!$defaultMyCompanyId) { $defaultMyCompanyId = EntityLink::getDefaultMyCompanyId(); } $companies = []; $companyFilter = ['IS_MY_COMPANY' => 'Y', 'CHECK_PERMISSIONS' => 'N']; if ($availableCompanies) { $companyFilter['ID'] = $availableCompanies; } $res = \CCrmCompany::GetListEx( ['ID' => 'ASC'], $companyFilter, false, false, ['ID', 'TITLE'] ); while ($company = $res->Fetch()) { $selected = false; if ($defaultMyCompanyId > 0 && $defaultMyCompanyId == $company['ID']) { $selected = true; } $companies[] = [ 'VALUE' => $company['ID'], 'TITLE' => $company['TITLE'], 'SELECTED' => $selected, ]; } if (count($companies) === 0) { return null; } elseif (count($companies) === 1) { return $companies[0]['VALUE']; } return $companies; } public function getRawUserFieldValue($placeholder = null) { if (!$placeholder || !isset($this->fields[$placeholder])) { return null; } $field = $this->userFieldDescriptions[$placeholder]; return $field['VALUE']; } public function getUserFieldDescription($placeholder) { return $this->userFieldDescriptions[$placeholder]; } } |
Код |
---|
# Подменяем провайдер сделки своим провайдером $EM->addEventHandler('documentgenerator', 'onDataProviderManagerFillSubstitutionProviders', static function(\Bitrix\Main\Event $event) { $result = []; if(\Bitrix\Main\Loader::includeModule('crm')) { $result = [ \Bitrix\Crm\Integration\DocumentGenerator\DataProvider\Deal::class => \Company\Crm\Integration\DocumentGenerator\DataProvider\Deal::class } return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $result); } ); |
Вопрос задавал по полю "WEB_SITES"
Из метода getWebSites возвращается массив, но в поля редактирования документа это значение не попадает. Ну это я описывал в сообщении выше