Антон Горбылев,
Код провайдера сделки.
Унаследовался от коробочного и подменил.
Вопрос задавал по полю "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 возвращается массив, но в поля редактирования документа это значение не попадает. Ну это я описывал в сообщении выше