Кастомизация компонента карточки
Кастомизация интерфейса карточки - достаточно типовая задача. Обычно для этого приходилось выносить в local весь компонент (а то и несколько), полностью его копировать и поддерживать.
Для карточки смарт-процесса и новой карточки предложения это немного проще.
Для начала необходимо переопределить сервис роутинга, как в предыдущих примерах.
Код работает с версии CRM 25.500.0
use Bitrix\Crm\Service;
use Bitrix\Crm\Service\Router;
class MyContainer extends \Bitrix\Crm\Service\Container
{
public function getRouter(): \Bitrix\Crm\Service\Router {
return new class extends \Bitrix\Crm\Service\Router {
public function matchPage(\Bitrix\Main\HttpRequest $request): \Bitrix\Crm\Service\Router\Contract\Page
{
$page = parent::matchPage($request);
if (!defined('SUPER_ENTITY_TYPE_ID')) {
return $page;
}
if ($page instanceof \Bitrix\Crm\Service\Router\Contract\Page\HasComponent) {
$component = $page->component();
if ($component->name() === 'bitrix:crm.item.details') {
$entityTypeId = $component->parameter('ENTITY_TYPE_ID') ?? $component->parameter('entityTypeId');
if ((int)$entityTypeId === SUPER_ENTITY_TYPE_ID) {
$overriddenComponent = new \Bitrix\Crm\Service\Router\Component\Component(
name: 'dev:crm.item.details',
parameters: $component->parameters(),
template: $component->template(),
);
// Можно вернуть конкретную реализацию \Bitrix\Crm\Service\Router\Contract\Page
return new \Bitrix\Crm\Service\Router\Page\ComponentPage($overriddenComponent);
}
}
}
return $page;
}
};
}
}
Теперь для одного единственного смарт-процесса за отрисовку детальной карточки будет отвечать отдельный компонент.
Код класса компонента очень компактный, состоит из единственного метода. Большая часть логики сосредоточена в родительском классе.
Код шаблона тоже небольшой. Весь javascript-код вынесен в отдельный js-экстеншн crm.item-details-component..
Можно унаследовать этот экстеншн и подключить его в шаблоне вашего переопределенного компонента.