Н9
Я работаю над классом обслуживания CommissionService, который создает элемент iblock и устанавливает значения свойств. Одним из свойств является тип списка, множественный, и в функции я принимаю массив имен. Меня немного беспокоит проверка имен.
Как лучше это сделать, есть ли у кого-нибудь подобный опыт?
Я знаю, что есть события onbeforeadd и onbeforeupdate, но думаю, что это не сработает. Существует проблема с установкой нескольких значений свойств, если вы используете расширенный класс из ElementApiCodeTable.
Извините за язык, я использую Google Translate.
<?php
namespace Local\Services;
use Bitrix\Iblock\PropertyEnumerationTable;
use RuntimeException;
use Local\Models\DealTable;
use Local\Models\ContractTable;
use UnexpectedValueException;
use Local\Models\CommissionTable;
use \Bitrix\Main;
use \Bitrix\Iblock;
class CommissionService
{
/**
* Create commission
*
* @param int $dealId
* @param float $amount
* @param array $sources
* @return int
* @throws RuntimeException
* @throws UnexpectedValueException
*/
public function createCommission(int $deal, array $sources, float $amount)
{
if (!DealTable::has($deal)) {
throw new UnexpectedValueException("Deal with id: {$deal} doesn't exist");
}
$contract = ContractTable::getByDeal($deal, ["ID", "NAME"]);
if ($contract == null) {
throw new UnexpectedValueException("Contract for deal: {$deal} not found");
}
$commission = CommissionTable::createObject()
->setName($contract["NAME"])
->setDeal($deal)
->setCommission($amount);
$commission->addToSource(new Iblock\ORM\PropertyValue(1111));
$result = $commission->save();
if (!$result->isSuccess()) {
throw new RuntimeException("Failed to create commission: " . implode(". ", $result->getErrorMessages()));
}
$commission->setXmlId($commission->getId());
$commission->save();
return $commission->getId();
}
}