Очистка справочника Незарегистрированный покупатель по cron — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
 
(не показаны 2 промежуточные версии 2 участников)
Строка 34: Строка 34:
 
</source>
 
</source>
  
Обратите внимание, что в функции необходимо указать идентификатор справочника "Незарегистрированный покупатель", а не какого-либо другого, иначе можно удалить другие, возможно, нужные Вам данные другого справочника. Идентификатор справочника Вы можете узнать, открыв справочник "Незарегистрированный покупатель" для просмотра и посмотрев последнее число в адресной строке. В нашем случае это число 88:
+
Обратите внимание, что в методе необходимо указать идентификатор справочника "Незарегистрированный покупатель", а не какого-либо другого, иначе можно удалить другие, возможно, нужные Вам данные другого справочника. Идентификатор справочника Вы можете узнать, открыв справочник "Незарегистрированный покупатель" для просмотра и посмотрев последнее число в адресной строке. В нашем случае это число 88:
  
 
[[Файл:Screenshot_10.png]]
 
[[Файл:Screenshot_10.png]]
  
 
После всех этих действий справочник "Незарегистрированный покупатель" будет очищаться каждый раз по запуску cron.  
 
После всех этих действий справочник "Незарегистрированный покупатель" будет очищаться каждый раз по запуску cron.  
 +
 +
== Исключение незарегистрированных пользователей, совершивших настоящие заказы ==
 +
 +
При очистке справочника будут удалены все данные о незарегистрированных покупателях, в том числе контактные данные из карточек заказов, оставленных неавторизованными пользователями.
 +
 +
Для того, чтобы удалить только тех незарегистрированных пользователей, которые не указали свои контактные данные, мы можем добавить после
 +
 +
<source lang="php">
 +
foreach($ids as $id)
 +
</source>
 +
 +
следующие исключающие переменные:
 +
 +
<source lang="php">
 +
$obj = $objectsCollection->getObject($id);
 +
        $fname = $obj->getPropByName('fname')->getValue();
 +
        $lname = $obj->getPropByName('lname')->getValue();
 +
        $email = $obj->getPropByName('email')->getValue();
 +
        $phone = $obj->getPropByName('phone')->getValue();
 +
        if (!isset($fname) && !isset($lname) && !isset($email) && !isset($phone)) {
 +
$objectsCollection->delObject($id);
 +
 +
        }
 +
    }
 +
}
 +
 +
</source>
 +
 +
Таким образом, будут удалены только те незарегистрированные покупатели, которые не указали контактные данные — имя, фамилию, электронную почту и телефон.
  
  
 
  [[category:Написание кастомных макросов]]
 
  [[category:Написание кастомных макросов]]

Текущая версия на 15:12, 27 декабря 2019

Актуально для версии 20

Задача

Проводить очистку справочника "Незарегистрированный покупатель" при запуске cron.
Задача очищения данного справочника актуальная для тех сайтов, количество посещений на которые достигает нескольких тысяч незарегистрированных пользователей в день, из-за чего данные в справочнике достигают больших объёмов, что сказывается на работе сайта.

Решение

В первую очередь, нам необходимо назначить обработчик события запуска cron в файле ~/classes/components/config/custom_events.php (если файла нет - необходимо создать его). Обработчик назначается таким образом:

<?php 
	new umiEventListener('cron', 'config', 'deleteUnregisteredCustomers');

Затем нам нужно описать функцию, которая будет очищать справочник. В файле ~/classes/components/config/customMacros.php создаём метод, который мы назначили на обработку события запуска cron. В нашем случае это метод deleteUnregisteredCustomers, выглядит он вот так:

public function deleteUnregisteredCustomers(iUmiEventPoint $e)
{
	if ($e->getMode() == 'process') {
		// Получить объекты справочника
		$unregisteredCustomersData = umiObjectsCollection::getInstance()->getGuidedItems(<здесь нужно указать идентификатор справочника>);
 
		// Массив содержит значения вида идентификатор => значение
		$ids = array_keys($unregisteredCustomersData);
		$objectsCollection = umiObjectsCollection::getInstance();
		// Проходимся по всем найденным объектам в справочнике "Незарегистрированный покупатель" и удаляем их
		// Тут можно настроить кол-во удаляемых за раз объектов, заменив foreach на for и указав ограничения
		foreach($ids as $id)
		{
			$objectsCollection->delObject($id);
		}
	}
}

Обратите внимание, что в методе необходимо указать идентификатор справочника "Незарегистрированный покупатель", а не какого-либо другого, иначе можно удалить другие, возможно, нужные Вам данные другого справочника. Идентификатор справочника Вы можете узнать, открыв справочник "Незарегистрированный покупатель" для просмотра и посмотрев последнее число в адресной строке. В нашем случае это число 88:

Screenshot 10.png

После всех этих действий справочник "Незарегистрированный покупатель" будет очищаться каждый раз по запуску cron.

Исключение незарегистрированных пользователей, совершивших настоящие заказы

При очистке справочника будут удалены все данные о незарегистрированных покупателях, в том числе контактные данные из карточек заказов, оставленных неавторизованными пользователями.

Для того, чтобы удалить только тех незарегистрированных пользователей, которые не указали свои контактные данные, мы можем добавить после

foreach($ids as $id)

следующие исключающие переменные:

$obj = $objectsCollection->getObject($id);
        $fname = $obj->getPropByName('fname')->getValue(); 
        $lname = $obj->getPropByName('lname')->getValue();
        $email = $obj->getPropByName('email')->getValue();
        $phone = $obj->getPropByName('phone')->getValue();
        if (!isset($fname) && !isset($lname) && !isset($email) && !isset($phone)) {
$objectsCollection->delObject($id);

        }
    }
}

Таким образом, будут удалены только те незарегистрированные покупатели, которые не указали контактные данные — имя, фамилию, электронную почту и телефон.