Skip to content

Instantly share code, notes, and snippets.

@Pum-purum
Created April 12, 2019 13:37
Show Gist options
  • Save Pum-purum/8554691bedf38b4ad7029ac5a80c241f to your computer and use it in GitHub Desktop.
Save Pum-purum/8554691bedf38b4ad7029ac5a80c241f to your computer and use it in GitHub Desktop.
update crm rights
<?
// Обновление списка компаний для актуализации настроек прав доступа
include_once(__DIR__ . "/../../.config.php");
define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS", true);
define('CHK_EVENT', true);
ini_set('memory_limit', '-1');
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
@set_time_limit(0);
@ignore_user_abort(true);
global $USER, $USER_FIELD_MANAGER;
$USER->Authorize(1);
CModule::IncludeModule("crm");
$CCrmCompany = new CCrmCompany();
$CCrmContact = new CCrmContact();
// Лимит кол-ва обрабатываемых записей (0 - без ограничения)
// Можно передать из терминала "php update_company_rights.php 1000"
$limit = 0;
if ($argc >= 2) {
$limit = $argv[1];
}
// Получаем список компаний
$companiesResult = $CCrmCompany->GetListEx(
array('ID' => 'ASC'),
array(),
false,
false
);
$eventManager = \Bitrix\Main\EventManager::getInstance();
$companyUpdatedHandlers = $eventManager->findEventHandlers("crm", "OnAfterCrmCompanyUpdate");
$contactUpdatedHandlers = $eventManager->findEventHandlers("crm", "OnAfterCrmContactUpdate");
$companyBeforeUpdateHandlers = $eventManager->findEventHandlers("crm", "OnBeforeCrmCompanyUpdate");
// Классы с обработчиками событий для удаления
$arCallbacksToDelete = ['myCrmCompanyContactHandler', "EventClass"];
foreach ($companyUpdatedHandlers as $iEventHandlerKey => $handler) {
if (in_array($handler["CALLBACK"][0], $arCallbacksToDelete)) {
//echo "\r\n REMOVING EVENT HANDLER (" . $iEventHandlerKey . "): \r\n ";
//var_dump($handler);
//echo " \r\n ";
$eventManager->removeEventHandler("crm", "OnAfterCrmCompanyUpdate", $iEventHandlerKey);
}
}
foreach ($contactUpdatedHandlers as $iEventHandlerKey => $handler) {
if (in_array($handler["CALLBACK"][0], $arCallbacksToDelete)) {
//echo "\r\n REMOVING EVENT HANDLER (" . $iEventHandlerKey . "): \r\n ";
//var_dump($handler);
//echo " \r\n ";
$eventManager->removeEventHandler("crm", "OnAfterCrmContactUpdate", $iEventHandlerKey);
}
}
foreach ($companyBeforeUpdateHandlers as $iEventHandlerKey => $handler) {
if (in_array($handler["CALLBACK"][0], $arCallbacksToDelete)) {
//echo "\r\n REMOVING EVENT HANDLER (" . $iEventHandlerKey . "): \r\n ";
//var_dump($handler);
//echo " \r\n ";
$eventManager->removeEventHandler("crm", "OnBeforeCrmCompanyUpdate", $iEventHandlerKey);
}
}
// Проходим по компаниям, чтобы обновились права
// обновим поле OPENED на противоположное текущему и вернем обратно
$counter = 0;
$companiesStartTime = microtime(true);
while ($arCompany = $companiesResult->GetNext()) {
if ($limit > 0 && $counter >= $limit) {
break;
}
//echo "\r\n COMPANY \r\n ";
//var_dump($arCompany["OPENED"]);
// Сохраняем оригинальное значение
$originalOpened = $arCompany["OPENED"];
$valueToChange = 0;
// Устанавливаем противоположное оригинальному значение
if ($originalOpened == "Y")
{
$valueToChange = "N";
}
elseif ($originalOpened == "N")
{
$valueToChange = "Y";
}
if ($valueToChange !== 0)
{
//echo "CHANGING: " . $originalOpened . " => " . $valueToChange . " for item ID = " . $arCompany["ID"] . "\r\n ";
$arFieldsToChange = ['ID' => $arCompany["ID"], "OPENED"=>$valueToChange, "NO_EVENT_ROUTE" => "Y"];
// Обновляем элемент на новое значение
if ($CCrmCompany->Update($arCompany["ID"], $arFieldsToChange))
{
//echo "OK \r\n ";
}
else
{
echo "ERROR \r\n ";
echo $CCrmCompany->LAST_ERROR;
echo " \r\n ";
}
// Возвращаем поле обратно
$arFieldsToChange["OPENED"] = $originalOpened;
if ($CCrmCompany->Update($arCompany["ID"], $arFieldsToChange))
{
//echo "OK \r\n ";
}
else
{
echo "ERROR \r\n ";
echo $CCrmCompany->LAST_ERROR;
echo " \r\n ";
}
}
$counter++;
}
$companiesEndTime = microtime(true);
// Получаем список контактов
$contactsResult = $CCrmContact->GetListEx(
array('ID' => 'ASC'),
array(),
false,
false
);
$counter = 0;
$contactsStartTime = microtime(true);
// Проходим по контактам, чтобы обновились права
// обновим поле OPENED на противоположное текущему и вернем обратно
while ($arContact = $contactsResult->GetNext()) {
if ($limit > 0 && $counter >= $limit) {
break;
}
//echo "\r\n CONTACT ";
//var_dump($arContact["OPENED"]);
// Сохраняем оригинальное значение
$originalOpened = $arContact["OPENED"];
$valueToChange = 0;
// Устанавливаем противоположное оригинальному значение
if ($originalOpened == "Y")
{
$valueToChange = "N";
}
elseif ($originalOpened == "N")
{
$valueToChange = "Y";
}
if ($valueToChange !== 0)
{
//echo "CHANGING: " . $originalOpened . " => " . $valueToChange . " for item ID = " . $arContact["ID"] . " \r\n ";
$arFieldsToChange = ['ID' => $arContact["ID"], "OPENED"=>$valueToChange, "NO_EVENT_ROUTE" => "Y"];
// Обновляем элемент на новое значение
if ($CCrmContact->Update($arContact["ID"], $arFieldsToChange))
{
//echo "OK \r\n ";
}
else
{
echo "ERROR \r\n ";
echo $CCrmContact->LAST_ERROR;
echo " \r\n ";
}
// Возвращаем поле обратно
$arFieldsToChange["OPENED"] = $originalOpened;
if ($CCrmContact->Update($arContact["ID"], $arFieldsToChange))
{
//echo "OK \r\n ";
}
else
{
echo "ERROR \r\n ";
echo $CCrmContact->LAST_ERROR;
echo " \r\n ";
}
}
$counter++;
}
$contactsEndTime = microtime(true);
$companiesExecTime = ($companiesEndTime-$companiesStartTime)/60;
$contactsExecTime = ($contactsEndTime-$contactsStartTime)/60;
echo "Время обновления " . $limit . " компаний = " . $companiesExecTime . " min \r\n";
echo "Время обновления " . $limit . " контактов = " . $contactsExecTime . " min \r\n";
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment