Добавление собственных полей для передачи в amoCRM

Обновлено 28.02.2025

Для добавления собственного поля необходимо создать класс, унаследованный от \Rover\AmoSale\Field\Bx\UserCustom. В классе должны быть реализованы методы getName и getValue и использован трейт Rover\AmoSale\Field\Traits\IsSourceTrait. После этого (чаще всего в файле init.php) необходимо создать обработчик события onGetUserCustomChildClasses, возвращающий ассоциативный массив, ключом которого является путь к файлу добавляемого класса от корня сайта, а значением — имя класса. Таким же образом можно добавить сразу несколько классов.

Пример

Создаём класс в файле /local/php_interface/discounttest.php

namespace Rover\Test;

use Bitrix\Main\ArgumentNullException;
use Bitrix\Main\ArgumentOutOfRangeException;
use Rover\AmoSale\Field\Bx\UserCustom;
use Rover\AmoSale\Field\Traits\IsSourceTrait;
use Rover\AmoSale\Task;
use Rover\AmoSale\Task\Order\OrderBase;

/**
 * Class DeliveryPriceRaw
 *
 * @package Rover\AmoSale\Field\Bx\OrderCustom
 * @author  Pavel Shulaev (https://rover-it.me)
 */
class DiscountTest extends UserCustom
{
    use IsSourceTrait;
    /**
     * @return string
     * @author Pavel Shulaev (https://rover-it.me)
     */
    public static function getName(): string
    {
        return 'Примененные скидочные купоны';
    }

    /**
     * @param Task $task
     * @return string
     * @throws ArgumentNullException
     * @throws ArgumentOutOfRangeException
     * @author Pavel Shulaev (https://rover-it.me)
     */
    public function getValue(Task $task): string
    {
        if (!$task instanceof OrderBase) {
            throw new ArgumentOutOfRangeException('task');
        }

        $couponList = $task->getOrder()
                          ->getDiscount()
                          ->getApplyResult()['COUPON_LIST'] ?? [];
        $result     = [];
        foreach ($couponList as $coupon) {
            if ($coupon['APPLY'] == 'Y') {
                $result[] = $coupon['COUPON'];
            }
        }

        return implode(', ', $result);
    }
}

Пишем обработчик события onGetUserCustomChildClasses

\Bitrix\Main\EventManager::getInstance()->addEventHandler('rover.amosale', 'onGetUserCustomChildClasses', function (Event $event)
{
    return new \Bitrix\Main\EventResult(\Bitrix\Main\ORM\EventResult::SUCCESS, [
        '/local/php_interface/discounttest.php' => '\Rover\Test\DiscountTest'
    ]);
});

Если всё сделано правильно, то у всех сущностей (сделок, контактов, компаний) в разделе "Пользовательские поля" появится поле с названием "Примененные скидочные купоны". Также это поле будет доступно в списке плейсхолдеров, а при добавлении в примечание, значение будет сформировано по шаблону #имя поля#: #значение поля#.