Просмотров: 26963 (Статистика ведётся с 06.02.2017)
Сложность урока:
4 уровень - сложно, требуется сосредоточится, внимание деталям и точному следованию инструкции.
5
Недоступно в редакциях:
Ограничений нет
Если необходимо динамически добавлять агентов, то используйте API агентов. Если вам просто нужно прикрутить один или два агента, то это проще сделать вручную.
Агента создаем на странице Настройки > Настройки продукта > Агенты по команде Добавить агента на контекстной панели:

О параметрах, значение которых может быть неясно из названия:
- дата последнего запуска - выводится время последнего запуска (при редактировании агента);
- дата и время следующего запуска – время старта работы агента, если он не периодический то выполнится 1 раз в это время;
- модуль - этот модуль будет автоматически подключаться, а именно будет подключаться файл
/bitrix/modules/ID модуля/include.php
, в этом случае необходимо убедиться, что функция-агент будет доступна после подключения этого файла;
- функция агента - это основное поле, у нас функция называется testAgent();
- ID пользователя – это фильтр выполнения на хите для определенного пользователя;
Сама функция будет выглядеть так:
function testAgent()
{
mail('mail@gmail.com', 'Агент', 'Агент');
return "testAgent();";
}
Функцию добавить в файл /bitrix/php_interface/init.php
.
Если письмо пришло, то агент работает и можно писать свой функционал.
<?
// добавим агент модуля "Статистика"
CAgent::AddAgent(
"CStatistic::CleanUpStatistics_2();", // имя функции
"statistic", // идентификатор модуля
"N", // агент не критичен к кол-ву запусков
86400, // интервал запуска - 1 сутки
"07.04.2005 20:03:26", // дата первой проверки на запуск
"Y", // агент активен
"07.04.2005 20:03:26", // дата первого запуска
30);
?>
<?
// добавим агент модуля "Техподдержка"
CAgent::AddAgent(
"CTicket::AutoClose();", // имя функции
"support", // идентификатор модуля
"N", // агент не критичен к кол-ву запусков
86400, // интервал запуска - 1 сутки
"", // дата первой проверки - текущее
"Y", // агент активен
"", // дата первого запуска - текущее
30);
?>
<?
// добавим произвольный агент не принадлежащий ни одному модулю
CAgent::AddAgent("My_Agent_Function();");
?>
<?
// файл /bitrix/php_interface/init.php
function My_Agent_Function()
{
// выполняем какие-либо действия
return "My_Agent_Function();";
}
?>
<?
// добавим произвольный агент принадлежащий модулю
// с идентификатором my_module
CAgent::AddAgent(
"CMyModule::Agent007(1)",
"my_module",
"Y",
86400);
?>
<?
// данный агент будет запущен ровно 7 раз с периодичностью раз в сутки,
// после чего будет удален из таблицы агентов.
Class CMyModule
{
function Agent007($cnt=1)
{
echo "Hello!";
if($cnt>=7)
return "";
return "CMyModule::Agent007(".($cnt+1).")";
}
}
?>
|
Практичный пример: Обновление курса валют на сайте |
Запуск данного агента рекомендуется повесить на cron.
<?// Обновление курса валют
function AgentGetCurrencyRate()
{
global $DB;
// подключаем модуль "валют"
if(!CModule::IncludeModule('currency'))
return "AgentGetCurrencyRate();";
$arCurList = array('USD', 'EUR');
$bWarning = False;
$rateDay = GetTime(time(), "SHORT", LANGUAGE_ID);
$QUERY_STR = "date_req=".$DB->FormatDate($rateDay, CLang::GetDateFormat("SHORT", SITE_ID), "D.M.Y");
$strQueryText = QueryGetData("www.cbr.ru", 80, "/scripts/XML_daily.asp", $QUERY_STR, $errno, $errstr);
// данная строка нужна только для сайтов в кодировке utf8
$strQueryText = iconv('windows-1251', 'utf-8', $strQueryText);
if (strlen($strQueryText) <= 0)
$bWarning = True;
if (!$bWarning)
{
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/xml.php");
$objXML = new CDataXML();
$objXML->LoadString($strQueryText);
$arData = $objXML->GetArray();
$arFields = array();
$arCurRate["CURRENCY_CBRF"] = array();
if (is_array($arData) && count($arData["ValCurs"]["#"]["Valute"])>0)
{
for ($j1 = 0; $j1<count($arData["ValCurs"]["#"]["Valute"]); $j1++)
{
$arFields = array(
"CURRENCY" => $arData["ValCurs"]["#"]["Valute"][$j1]["#"]["CharCode"][0]["#"],
'DATE_RATE' => $rateDay,
'RATE' => DoubleVal(str_replace(",", ".", $arData["ValCurs"]["#"]["Valute"][$j1]["#"]["Value"][0]["#"])),
'RATE_CNT' => IntVal($arData["ValCurs"]["#"]["Valute"][$j1]["#"]["Nominal"][0]["#"]),
);
CCurrencyRates::Add($arFields);
}
}
}
return "AgentGetCurrencyRate();";
}?>
Указанный код добавляется в файл /bitrix/php_interface/init.php
. Не забудьте добавить агента AgentGetCurrencyRate(); на странице Настройки > Настройки продукта > Агенты.
|
Агент, проверяющий наличие элементов инфоблока без заполненных цен |
Разработаем функцию, которая проверяет элементы инфоблока на заполнение цены. При
наличии таких элементов необходимо отсылать письмо администратору об их количестве и делать
соответствующую запись в журнал событий.
- Создадим:
- Почтовое событие и шаблон.
- «Агента», который будет запускать функцию 1 раз в день.
- Убедимся, что агент запускается, производится запись в журнал и приходят письма на почту.
- Размещение функции должно быть в отдельном файле, который подключается в
init.php
.
function AgentChekPrice()
{
if(CModule::IncludeModule("iblock"))
{
$arSelect = Array("ID", "NAME", "PROPERTY_PRICE");
$arFilter = Array("IBLOCK_ID"=> 2, "PROPERTY_PRICE" => false);
$rsResCat = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);
$arItems = array();
while($arItemCat = $rsResCat->GetNext())
{
$arItems[] = $arItemCat;
}
CEventLog::Add(array(
"SEVERITY" => "SECURITY",
"AUDIT_TYPE_ID" => "CHECK_PRICE",
"MODULE_ID" => "iblock",
"ITEM_ID" => "",
"DESCRIPTION" => "Проверка цен, нет цен для ".count($arItems)." элементов",
));
if(count($arItems) > 0)
{
$arFilter = Array(
"GROUPS_ID" => Array(2)
);
$rsUsers = CUser::GetList(($by="personal_country"), ($order="desc"), $arFilter);
$arEmail = array();
while($arResUser = $rsUsers->GetNext())
{
$arEmail[] = $arResUser["EMAIL"];
}
if(count($arEmail) > 0)
{
$arEventFields = array(
"TEXT" => "Проверка цен, нет цен для ".count($arItems)." элементов",
"EMAIL" => implode(", ", $arEmail),
);
CEvent::Send("INFO_PRICE", "s1", $arEventFields);
}
}
}
return "AgentChekPrice();";
}
25
Развернуть комментарии