1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$dealId = 123; \Bitrix\Main\Loader::includeModule('crm'); $result = \Bitrix\Crm\ActivityTable::query() ->where('OWNER_ID', $dealId) ->where('OWNER_TYPE_ID', \CCrmOwnerType::Deal) ->where('IS_EMAIL_IN', 1) ->setSelect(['SUBJECT']) ->setOrder(['ID' => 'ASC']) ->setLimit(1) ->exec() ->fetch(); var_dump($result); /* array(1) { ["SUBJECT"]=> string(12) "Заказ 1" } */ |
Рубрика: Битрикс
Восстановление urlrewrite.php в Битриксе
Жизнь непредсказуема порой. Файл urlrewrite.php рекомендуют исключать из версионного контроля. Но его можно легко потерять. Например, попытаться установить какой-нибудь «мегамодуль».
Поэтому нужно знать как восстанавливать urlrewrite.php. В административной панели Настройки продукта — Обработка адресов — Правила обработки — Пересоздание.
Похоже, что эта команда проходит по всем компонентам в публичке, у которых установлен параметр SEF_FOLDER, и добавляет соответствующие записи в urlrewrite.php.
Добавление плашки с выбранным значением нестандартной сущности в фильтре компаний CRM
Для того, чтобы заработал фильтр в сущностях CRM для нестандартных пользовательских типов необходимо создать соответствующий шаблон для компонента crm.field.filter. Лучше всего его создать в каталоге /local/templates/.default/components/bitrix/crm.field.filter.
К сожалению, разработчики Битрикс24 пока не предусмотрели возможность вывода в фильтре нестандартных сущностей (/bitrix/components/bitrix/main.ui.filter/templates/.default/js/search.js)
1 2 3 4 |
case this.parent.types.CUSTOM : { value = '_VALUE' in current && BX.type.isNotEmptyString(current._VALUE) ? current.LABEL : null; break; } |
Выводится только название пользовательского поля (current.LABEL). Доработаем это, добавив обработчик js-события BX.Filter.Search:beforeSquaresUpdate в шаблоне компонента:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
BX.addCustomEvent('BX.Filter.Search:beforeSquaresUpdate', function (data, filterObj) { data.FIELDS.forEach(function(field) { if (field.NAME === "<?= $arParams['arUserField']['FIELD_NAME'] ?>") { var select = BX('<?= $selectId ?>'); if (select) { var name = select.options[select.selectedIndex].text; if (name) { field.LABEL = field.LABEL + ": " + name; } } } }); }); |
К сожалению, этот костыль будет работать только при изменении фильтра. А при начальной загрузке нужно придумывать другой ))
Как подключить специальный шаблон компонента, если заданный не найден
Иногда шаблон компонента может отсутствовать. Эта ситуация может возникнуть, когда компонент используется для отрисовки пользовательских типов. Например, компоненты system.field.edit, system.field.view, crm.field.filter. Все возможные пользовательские типы предусмотреть невозможно. Поэтому можно сделать один шаблон по умолчанию (special), который подключать в случае отсутствия нужного.
Подключаем компонент с несуществующим шаблоном ‘unknown’:
1 2 3 4 5 |
$APPLICATION->IncludeComponent( 'bitrix:crm.field.filter', 'unknown', array() ); |
А внутри компонента проверяем наличие шаблона, имя которого было передано в параметрах компонента(‘unknown’). Если такой шаблон не найден, то подключаем шаблон ‘special’:
1 2 3 4 5 |
if(!$this->initComponentTemplate()) { $this->SetTemplateName('special'); } $this->IncludeComponentTemplate(); |
Как кастомизировать Битрикс24
В видео с партнерской конференции есть пункт о том, как добавить новый пункт во всплывающее меню:
Там же Антон предложил способ поиска нужных событий:
Т.е. ВРЕМЕННО добавить в скрипт /bitrix/js/main/core/core.js вывод в консоль названия события и его параметров:
1 2 3 4 |
BX.onCustomEvent = function(eventObject, eventName, arEventParams, secureParams) { console.log('eventName:', eventName, '-> arEventParams:', arEventParams); ... |
Отследить вызовы в бекэнде можно, если в файле /bitrix/php_interface/init.php ВРЕМЕННО добавить код:
1 2 3 4 |
<?php $log = new \Monolog\Logger('debug'); $log->pushHandler(new \Monolog\Handler\StreamHandler($_SERVER['DOCUMENT_ROOT'] . '/debug.log'), \Monolog\Logger::DEBUG); $log->addInfo($request->getRequestedPage()); |
А у себя в блоге Антон описал как добавить вкладку в сущность CRM.
В продолжении темы кастомизации опубликована статья Изменяем пользовательский интерфейс коробочного Битрикс24 и соответствующее видео:
- Как подключить свой JS
- Пример 1. Кнопка «Поблагодарить сотрудника» на странице профиля пользователя
- В какой момент вставлять верстку
- Пример 2. Добавление кнопки в popup-окно «Создать документ» модуля Диск
- Сниппет для логгирования js-событий битрикса в консоли
- Пример 3. Добавление дополнительной информации в карточки Канбан (setInterval)
- Переопределение метода объекта JS
Пользовательские поля в Битрикс
Получение значения пользовательского поля:
1 2 3 4 5 6 7 |
<?php $entityId = 'CRM_COMPANY'; // Объект (CRM-компания) $valueId = 1; // ID экземпляра (ID CRM-компании) $fieldId = 'UF_CRM_TEST'; // Код поля $result = $GLOBALS["USER_FIELD_MANAGER"]->GetUserFields($entityId, $valueId); echo "Значение поля $fieldId = " . $result[$fieldId]['VALUE']; |
Установка значения пользовательского поля:
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php $entityId = 'CRM_COMPANY'; // Объект (CRM-компания) $valueId = 1; // ID экземпляра (ID CRM-компании) $fieldId = 'UF_CRM_TEST'; // Код поля $value = 100500; function setUserFieldValue($entityId, $valueId, $fieldId, $value) { $result = $GLOBALS["USER_FIELD_MANAGER"]->Update($entityId, $valueId, array($fieldId => $value)); return $result; } setUserFieldValue($entityId, $valueId, $fieldId, $value); |
Отключить защиту административного раздела Битрикс
1. Закомментировать в файле bitrix/modules/security/classes/general/iprule.php строки (в районе 1238):
1 2 |
if($bMatch) include($_SERVER["DOCUMENT_ROOT"]."/bitrix/admin/security_403.php"); |
2. А потом в административном разделе Проактивная защита / Защита административного раздела = Выключить защиту.
3. Раскомментировать строки из п.1
Распаковка многотомной резервной копии 1С-Битрикс
Если частей архива меньше 10, то можно распаковать сразу командой
1 |
$ cat /mnt/backup/site.ru_20170905_083901_full_991920ba.tar.gz* | tar -xzvf - -i |
А если больше 10, то файлы нужно переименовать, добавив 0:
site.ru_20170905_083901_full_991920ba.tar.gz.1 в site.ru_20170905_083901_full_991920ba.tar.gz.01
Производительность VDS от Timeweb для Битрикс24
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
[root@server ~]# lshw -short -C processor -C memory -C disk H/W path Device Class Description =================================================== /0/0 memory 96KiB BIOS /0/400 processor QEMU Virtual CPU version 2.4.0 /0/401 processor QEMU Virtual CPU version 2.4.0 /0/1000 memory 2GiB System Memory /0/1000/0 memory 2GiB DIMM RAM /0/100/6/0 /dev/vda disk 42GB Virtual I/O device [root@server ~]# lshw -C processor -C memory -C disk *-firmware description: BIOS vendor: SeaBIOS physical id: 0 version: Ubuntu-1.8.2-1ubuntu1 date: 04/01/2014 size: 96KiB *-cpu:0 description: CPU product: QEMU Virtual CPU version 2.4.0 vendor: Intel Corp. vendor_id: GenuineIntel physical id: 400 bus info: cpu@0 version: pc-i440fx-wily slot: CPU 0 size: 2GHz capacity: 2GHz width: 64 bits capabilities: fpu fpu_exception wp de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pse36 clflush mmx fxsr sse sse2 syscall nx x86-64 rep_good nopl pni vmx cx16 x2apic popcnt hypervisor lahf_lm abm tpr_shadow vnmi flexpriority ept vpid configuration: cores=1 enabledcores=1 threads=1 *-cpu:1 description: CPU product: QEMU Virtual CPU version 2.4.0 vendor: Intel Corp. vendor_id: GenuineIntel physical id: 401 bus info: cpu@1 version: pc-i440fx-wily slot: CPU 1 size: 2GHz capacity: 2GHz width: 64 bits capabilities: fpu fpu_exception wp de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pse36 clflush mmx fxsr sse sse2 syscall nx x86-64 rep_good nopl pni vmx cx16 x2apic popcnt hypervisor lahf_lm abm tpr_shadow vnmi flexpriority ept vpid configuration: cores=1 enabledcores=1 threads=1 *-memory description: System Memory physical id: 1000 size: 2GiB capacity: 2GiB *-bank description: DIMM RAM vendor: QEMU physical id: 0 slot: DIMM 0 size: 2GiB *-virtio3 description: Virtual I/O device physical id: 0 bus info: virtio@3 logical name: /dev/vda size: 40GiB (42GB) capabilities: partitioned partitioned:dos configuration: driver=virtio_blk logicalsectorsize=512 sectorsize=512 signature=7cd88b13 |
Сортировать каталог товаров по наличию при отключенном количественном учете в 1С-Битрикс
Как сделать сортировку при отключенном количественном учете описано здесь.
1. Добавить числовое свойство IS_AVAILABLE в инфоблок товаров.
2. Добавить в init.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
AddEventHandler("catalog", "OnBeforeProductUpdate", array("MyCatalogEventHandler", "OnBeforeProductUpdate")); AddEventHandler("catalog", "OnBeforeProductAdd", array("MyCatalogEventHandler", "OnBeforeProductAdd")); class MyCatalogEventHandler { public static function OnBeforeProductUpdate($id, &$arFields) { $isAvailable = $arFields["QUANTITY"] > 0 ? 1 : 0; CIBlockElement::SetPropertyValuesEx($id, false, array("IS_AVAILABLE" => $isAvailable)); } public static function OnBeforeProductAdd(&$arFields) { $isAvailable = $arFields["QUANTITY"] > 0 ? 1 : 0; CIBlockElement::SetPropertyValuesEx($arFields["ID"], false, array("IS_AVAILABLE" => $isAvailable)); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");?> <? set_time_limit(0); CModule::IncludeModule("iblock"); $arSelect = Array("ID", "NAME", "DATE_ACTIVE_FROM", "CATALOG_QUANTITY"); $arFilter = Array("IBLOCK_ID"=>4); $res = CIBlockElement::GetList(Array(), $arFilter, false, Array("nPageSize"=>10000000), $arSelect); while ($ob = $res->GetNext()) { $IS_AVAILABLE = $ob["CATALOG_QUANTITY"] > 0? 1: 0; $ELEMENT_ID = $ob["ID"]; CIBlockElement::SetPropertyValuesEx($ELEMENT_ID, false, array("IS_AVAILABLE" => $IS_AVAILABLE)); } ?> <?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?> |
Но по-хорошему еще нужно добавить индекс по добавленному свойству PROPERTY