%PDF- %PDF-
Direktori : /proc/self/root/home/bitrix/www/bitrix/modules/bizproc/classes/general/ |
Current File : //proc/self/root/home/bitrix/www/bitrix/modules/bizproc/classes/general/taskservice.php |
<? IncludeModuleLangFile(__FILE__); include_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/bizproc/classes/general/runtimeservice.php"); class CBPAllTaskService extends CBPRuntimeService { const COUNTERS_CACHE_TAG_PREFIX = 'b_bp_tasks_cnt_'; public function DeleteTask($id) { self::Delete($id); } public function DeleteAllWorkflowTasks($workflowId) { self::DeleteByWorkflow($workflowId); } public function MarkCompleted($taskId, $userId, $status = CBPTaskUserStatus::Ok) { global $DB; $taskId = (int)$taskId; if ($taskId <= 0) throw new Exception("id"); $userId = (int)$userId; if ($userId <= 0) throw new Exception("userId"); $status = (int)$status; $DB->Query("UPDATE b_bp_task_user SET STATUS = ".$status.", DATE_UPDATE = ".$DB->CurrentTimeFunction()." WHERE TASK_ID = ".$taskId." AND USER_ID = ".$userId, true); CUserCounter::Decrement($userId, 'bp_tasks', '**'); self::onTaskChange($taskId, array( 'USERS_STATUSES' => array($userId => $status) ), CBPTaskChangedStatus::Update); foreach (GetModuleEvents("bizproc", "OnTaskMarkCompleted", true) as $arEvent) ExecuteModuleEventEx($arEvent, array($taskId, $userId, $status)); } public static function getTaskUsers($taskId) { global $DB; $taskId = (array)$taskId; $taskId = array_map('intval', $taskId); $taskId = array_filter($taskId); if (sizeof($taskId) < 1) throw new Exception("taskId"); $where = ''; foreach ($taskId as $id) { if ($where) $where .= ' OR '; $where .= ' TASK_ID = '.$id; } $users = array(); $iterator = $DB->Query('SELECT TU.*, U.PERSONAL_PHOTO, U.NAME, U.LAST_NAME, U.SECOND_NAME, U.LOGIN, U.TITLE' .' FROM b_bp_task_user TU' .' INNER JOIN b_user U ON (U.ID = TU.USER_ID)' .' WHERE '.$where .' ORDER BY TU.DATE_UPDATE DESC' ); while ($user = $iterator->fetch()) { $users[$user['TASK_ID']][] = $user; } return $users; } /** * @param string $workflowId - Internal workflow id. * @param null|int $userStatus - Filter participants by status. * @return array - User ids array (ex. array(1, 2, 3)). * @throws Exception */ public static function getWorkflowParticipants($workflowId, $userStatus = null) { global $DB; if (strlen($workflowId) <= 0) throw new Exception('workflowId'); $users = array(); $iterator = $DB->Query('SELECT DISTINCT TU.USER_ID' .' FROM b_bp_task_user TU' .' INNER JOIN b_bp_task T ON (T.ID = TU.TASK_ID)' .' WHERE T.WORKFLOW_ID = \''.$DB->ForSql($workflowId).'\'' .($userStatus !== null ? ' AND TU.STATUS = '.(int)$userStatus : '') ); while ($user = $iterator->fetch()) { $users[] = (int)$user['USER_ID']; } return $users; } public static function delegateTask($taskId, $fromUserId, $toUserId) { global $DB; $taskId = (int)$taskId; $fromUserId = (int)$fromUserId; $toUserId = (int)$toUserId; if (!$taskId || !$fromUserId || !$toUserId) return false; $originalUserId = 0; //check ORIGINAL_USER_ID $iterator = $DB->Query('SELECT ORIGINAL_USER_ID' .' FROM b_bp_task_user' .' WHERE TASK_ID = '.$taskId.' AND USER_ID = '.$fromUserId ); $row = $iterator->fetch(); if (!empty($row['ORIGINAL_USER_ID'])) $originalUserId = $row['ORIGINAL_USER_ID']; // check USER_ID (USER_ID must be unique for task) $iterator = $DB->Query('SELECT USER_ID' .' FROM b_bp_task_user' .' WHERE TASK_ID = '.$taskId.' AND USER_ID = '.$toUserId ); $row = $iterator->fetch(); if (!empty($row['USER_ID'])) return false; $DB->Query("UPDATE b_bp_task_user SET USER_ID = " .$toUserId .(!$originalUserId? ', ORIGINAL_USER_ID = '.$fromUserId : '') ." WHERE TASK_ID = ".$taskId." AND USER_ID = ".$fromUserId, true); CUserCounter::Decrement($fromUserId, 'bp_tasks', '**'); CUserCounter::Increment($toUserId, 'bp_tasks', '**'); self::onTaskChange($taskId, array( 'USERS' => array($toUserId), 'USERS_REMOVED' => array($fromUserId) ), CBPTaskChangedStatus::Delegate); foreach (GetModuleEvents("bizproc", "OnTaskDelegate", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array($taskId, $fromUserId, $toUserId)); } return true; } public static function getOriginalTaskUserId($taskId, $realUserId) { global $DB; $taskId = (int)$taskId; $realUserId = (int)$realUserId; $iterator = $DB->Query('SELECT ORIGINAL_USER_ID' .' FROM b_bp_task_user' .' WHERE TASK_ID = '.$taskId.' AND USER_ID = '.$realUserId ); if ($row = $iterator->fetch()) { return $row['ORIGINAL_USER_ID'] > 0 ? $row['ORIGINAL_USER_ID'] : $realUserId; } return false; } public static function Delete($id) { global $DB; $id = intval($id); if ($id <= 0) throw new Exception("id"); $removedUsers = array(); $dbRes = $DB->Query("SELECT USER_ID, STATUS FROM b_bp_task_user WHERE TASK_ID = ".intval($id)." "); while ($arRes = $dbRes->Fetch()) { if ($arRes['STATUS'] == CBPTaskUserStatus::Waiting) CUserCounter::Decrement($arRes["USER_ID"], 'bp_tasks', '**'); $removedUsers[] = $arRes["USER_ID"]; } $DB->Query("DELETE FROM b_bp_task_user WHERE TASK_ID = ".intval($id)." ", true); $DB->Query("DELETE FROM b_bp_task WHERE ID = ".intval($id)." ", true); self::onTaskChange($id, array('USERS_REMOVED' => $removedUsers), CBPTaskChangedStatus::Delete); foreach (GetModuleEvents("bizproc", "OnTaskDelete", true) as $arEvent) ExecuteModuleEventEx($arEvent, array($id)); } public static function DeleteByWorkflow($workflowId) { global $DB; $workflowId = trim($workflowId); if (strlen($workflowId) <= 0) throw new Exception("workflowId"); $dbRes = $DB->Query( "SELECT ID ". "FROM b_bp_task ". "WHERE WORKFLOW_ID = '".$DB->ForSql($workflowId)."' " ); while ($arRes = $dbRes->Fetch()) { $taskId = intval($arRes["ID"]); $removedUsers = array(); $dbResUser = $DB->Query("SELECT USER_ID, STATUS FROM b_bp_task_user WHERE TASK_ID = ".$taskId." "); while ($arResUser = $dbResUser->Fetch()) { if ($arResUser['STATUS'] == CBPTaskUserStatus::Waiting) CUserCounter::Decrement($arResUser["USER_ID"], 'bp_tasks', '**'); $removedUsers[] = $arResUser['USER_ID']; } $DB->Query("DELETE FROM b_bp_task_user WHERE TASK_ID = ".$taskId." ", true); self::onTaskChange($taskId, array('USERS_REMOVED' => $removedUsers), CBPTaskChangedStatus::Delete); foreach (GetModuleEvents("bizproc", "OnTaskDelete", true) as $arEvent) ExecuteModuleEventEx($arEvent, array($taskId)); } $DB->Query( "DELETE FROM b_bp_task ". "WHERE WORKFLOW_ID = '".$DB->ForSql($workflowId)."' ", true ); } public static function getCounters($userId) { global $DB; $counters = array('*' => 0); $cache = \Bitrix\Main\Application::getInstance()->getManagedCache(); $cacheTag = self::COUNTERS_CACHE_TAG_PREFIX.$userId; if ($cache->read(3600*24*7, $cacheTag)) { $counters = (array) $cache->get($cacheTag); } else { $query = "SELECT WI.MODULE_ID AS MODULE_ID, WI.ENTITY AS ENTITY, COUNT('x') AS CNT ". 'FROM b_bp_task T '. ' INNER JOIN b_bp_task_user TU ON (T.ID = TU.TASK_ID) '. ' INNER JOIN b_bp_workflow_instance WI ON (T.WORKFLOW_ID = WI.ID) '. 'WHERE TU.STATUS = '.(int)CBPTaskUserStatus::Waiting.' '. ' AND TU.USER_ID = '.(int)$userId.' '. 'GROUP BY MODULE_ID, ENTITY'; $iterator = $DB->Query($query, true); if ($iterator) { while ($row = $iterator->fetch()) { $cnt = (int)$row['CNT']; $counters[$row['MODULE_ID']][$row['ENTITY']] = $cnt; if (!isset($counters[$row['MODULE_ID']]['*'])) $counters[$row['MODULE_ID']]['*'] = 0; $counters[$row['MODULE_ID']]['*'] += $cnt; $counters['*'] += $cnt; } $cache->set($cacheTag, $counters); } } return $counters; } protected static function onTaskChange($taskId, $taskData, $status) { $workflowId = isset($taskData['WORKFLOW_ID']) ? $taskData['WORKFLOW_ID'] : null; if (!$workflowId) { $iterator = CBPTaskService::GetList(array('ID'=>'DESC'), array('ID' => $taskId), false, false, array('WORKFLOW_ID')); $row = $iterator->fetch(); if (!$row) return false; $workflowId = $row['WORKFLOW_ID']; $taskData['WORKFLOW_ID'] = $workflowId; } //clean counters cache $users = array(); if (!empty($taskData['USERS'])) $users = $taskData['USERS']; if (!empty($taskData['USERS_REMOVED'])) $users = array_merge($users, $taskData['USERS_REMOVED']); if (!empty($taskData['USERS_STATUSES'])) $users = array_merge($users, array_keys($taskData['USERS_STATUSES'])); self::cleanCountersCache($users); //ping document $runtime = CBPRuntime::GetRuntime(); $runtime->StartRuntime(); $documentId = CBPStateService::GetStateDocumentId($workflowId); if ($documentId) { $documentService = $runtime->GetService('DocumentService'); try { $documentService->onTaskChange($documentId, $taskId, $taskData, $status); } catch (Exception $e) { } } return true; } protected static function cleanCountersCache($users) { $users = (array) $users; $users = array_unique($users); $cache = \Bitrix\Main\Application::getInstance()->getManagedCache(); foreach ($users as $userId) { $cache->clean(self::COUNTERS_CACHE_TAG_PREFIX.$userId); } } protected static function ParseFields(&$arFields, $id = 0) { global $DB; $id = intval($id); $updateMode = ($id > 0 ? true : false); $addMode = !$updateMode; if ($addMode && !is_set($arFields, "USERS")) throw new Exception("USERS"); if (is_set($arFields, "USERS")) { $arUsers = $arFields["USERS"]; if (!is_array($arUsers)) $arUsers = array($arUsers); $arFields["USERS"] = array(); foreach ($arUsers as $userId) { $userId = intval($userId); if ($userId > 0 && !in_array($userId, $arFields["USERS"])) $arFields["USERS"][] = $userId; } if (count($arFields["USERS"]) <= 0) throw new Exception(GetMessage("BPTS_AI_AR_USERS")); } if (is_set($arFields, "WORKFLOW_ID") || $addMode) { $arFields["WORKFLOW_ID"] = trim($arFields["WORKFLOW_ID"]); if (strlen($arFields["WORKFLOW_ID"]) <= 0) throw new Exception("WORKFLOW_ID"); } if (is_set($arFields, "ACTIVITY") || $addMode) { $arFields["ACTIVITY"] = trim($arFields["ACTIVITY"]); if (strlen($arFields["ACTIVITY"]) <= 0) throw new Exception("ACTIVITY"); } if (is_set($arFields, "ACTIVITY_NAME") || $addMode) { $arFields["ACTIVITY_NAME"] = trim($arFields["ACTIVITY_NAME"]); if (strlen($arFields["ACTIVITY_NAME"]) <= 0) throw new Exception("ACTIVITY_NAME"); } if (is_set($arFields, "NAME") || $addMode) { $arFields["NAME"] = trim($arFields["NAME"]); if (strlen($arFields["NAME"]) <= 0) throw new Exception("NAME"); $arFields["NAME"] = htmlspecialcharsback($arFields["NAME"]); } if (is_set($arFields, "DESCRIPTION")) $arFields["DESCRIPTION"] = htmlspecialcharsback($arFields["DESCRIPTION"]); if (is_set($arFields, "PARAMETERS")) { if ($arFields["PARAMETERS"] == null) { $arFields["PARAMETERS"] = false; } else { $arParameters = $arFields["PARAMETERS"]; if (!is_array($arParameters)) $arParameters = array($arParameters); if (count($arParameters) > 0) $arFields["PARAMETERS"] = serialize($arParameters); } } if (is_set($arFields, "OVERDUE_DATE")) { if ($arFields["OVERDUE_DATE"] == null) $arFields["OVERDUE_DATE"] = false; elseif (!$DB->IsDate($arFields["OVERDUE_DATE"], false, LANG, "FULL")) throw new Exception("OVERDUE_DATE"); } } public static function OnAdminInformerInsertItems() { global $USER; if(!defined("BX_AUTH_FORM")) { $tasksCount = CUserCounter::GetValue($USER->GetID(), 'bp_tasks'); if($tasksCount > 0) { $bpAIParams = array( "TITLE" => GetMessage("BPTS_AI_BIZ_PROC"), "HTML" => '<span class="adm-informer-strong-text">'.GetMessage("BPTS_AI_EX_TASKS").'</span><br>'.GetMessage("BPTS_AI_TASKS_NUM").' '.$tasksCount, "FOOTER" => '<a href="/bitrix/admin/bizproc_task_list.php?lang='.LANGUAGE_ID.'">'.GetMessage("BPTS_AI_TASKS_PERF").'</a>', "COLOR" => "red", "ALERT" => true ); CAdminInformer::AddItem($bpAIParams); } } } public function CreateTask($arFields) { return self::Add($arFields); } public static function Add($arFields) { global $DB; self::ParseFields($arFields, 0); $arInsert = $DB->PrepareInsert("b_bp_task", $arFields); $strSql = "INSERT INTO b_bp_task (".$arInsert[0].", MODIFIED) ". "VALUES(".$arInsert[1].", ".$DB->CurrentTimeFunction().")"; $DB->Query($strSql, False, "File: ".__FILE__."<br>Line: ".__LINE__); $taskId = intval($DB->LastID()); if ($taskId > 0) { $ar = array(); foreach ($arFields["USERS"] as $userId) { $userId = intval($userId); if (in_array($userId, $ar)) continue; $DB->Query( "INSERT INTO b_bp_task_user (USER_ID, TASK_ID, ORIGINAL_USER_ID) ". "VALUES (".intval($userId).", ".intval($taskId).", ".intval($userId).") " ); CUserCounter::Increment($userId, 'bp_tasks', '**'); $ar[] = $userId; } self::onTaskChange($taskId, $arFields, CBPTaskChangedStatus::Add); foreach (GetModuleEvents("bizproc", "OnTaskAdd", true) as $arEvent) ExecuteModuleEventEx($arEvent, array($taskId, $arFields)); } return $taskId; } public static function Update($id, $arFields) { global $DB; $id = intval($id); if ($id <= 0) throw new Exception("id"); self::ParseFields($arFields, $id); $strUpdate = $DB->PrepareUpdate("b_bp_task", $arFields); if ($strUpdate) { $strSql = "UPDATE b_bp_task SET ". " ".$strUpdate.", ". " MODIFIED = ".$DB->CurrentTimeFunction()." ". "WHERE ID = ".intval($id)." "; $DB->Query($strSql, False, "File: ".__FILE__."<br>Line: ".__LINE__); } $removedUsers = []; if (is_set($arFields, "USERS")) { $dbResUser = $DB->Query("SELECT USER_ID FROM b_bp_task_user WHERE TASK_ID = ".intval($id)." "); while ($arResUser = $dbResUser->Fetch()) { CUserCounter::Decrement($arResUser["USER_ID"], 'bp_tasks', '**'); $removedUsers[] = $arResUser["USER_ID"]; } $DB->Query("DELETE FROM b_bp_task_user WHERE TASK_ID = ".intval($id)." "); $ar = array(); foreach ($arFields["USERS"] as $userId) { $userId = intval($userId); if (in_array($userId, $ar)) continue; $DB->Query( "INSERT INTO b_bp_task_user (USER_ID, TASK_ID, ORIGINAL_USER_ID) ". "VALUES (".intval($userId).", ".intval($id).", ".intval($userId).") " ); CUserCounter::Increment($userId, 'bp_tasks', '**'); $ar[] = $userId; } } $userStatuses = array(); if (isset($arFields['STATUS']) && $arFields['STATUS'] > CBPTaskStatus::Running) { $dbResUser = $DB->Query("SELECT USER_ID FROM b_bp_task_user WHERE TASK_ID = ".$id." AND STATUS = ".CBPTaskUserStatus::Waiting); while ($arResUser = $dbResUser->Fetch()) { CUserCounter::Decrement($arResUser["USER_ID"], 'bp_tasks', '**'); if ($arFields['STATUS'] == CBPTaskStatus::Timeout) $userStatuses[$arResUser["USER_ID"]] = CBPTaskUserStatus::No; else $removedUsers[] = $arResUser["USER_ID"]; } if ($arFields['STATUS'] == CBPTaskStatus::Timeout) { $DB->Query("UPDATE b_bp_task_user SET STATUS = ".CBPTaskUserStatus::No.", DATE_UPDATE = ".$DB->CurrentTimeFunction() ." WHERE TASK_ID = ".$id." AND STATUS = ".CBPTaskUserStatus::Waiting); } else $DB->Query("DELETE FROM b_bp_task_user WHERE TASK_ID = ".$id." AND STATUS = ".CBPTaskUserStatus::Waiting); } foreach (GetModuleEvents("bizproc", "OnTaskUpdate", true) as $arEvent) ExecuteModuleEventEx($arEvent, array($id, $arFields)); if ($removedUsers) $arFields['USERS_REMOVED'] = $removedUsers; if ($userStatuses) $arFields['USERS_STATUSES'] = $userStatuses; self::onTaskChange($id, $arFields, CBPTaskChangedStatus::Update); return $id; } public static function GetList($arOrder = array("ID" => "DESC"), $arFilter = array(), $arGroupBy = false, $arNavStartParams = false, $arSelectFields = array()) { global $DB; if (count($arSelectFields) <= 0) $arSelectFields = array("ID", "WORKFLOW_ID", "ACTIVITY", "ACTIVITY_NAME", "MODIFIED", "OVERDUE_DATE", "NAME", "DESCRIPTION", "PARAMETERS"); static $arFields = array( "ID" => array("FIELD" => "T.ID", "TYPE" => "int"), "WORKFLOW_ID" => array("FIELD" => "T.WORKFLOW_ID", "TYPE" => "string"), "ACTIVITY" => array("FIELD" => "T.ACTIVITY", "TYPE" => "string"), "ACTIVITY_NAME" => array("FIELD" => "T.ACTIVITY_NAME", "TYPE" => "string"), "MODIFIED" => array("FIELD" => "T.MODIFIED", "TYPE" => "datetime"), "OVERDUE_DATE" => array("FIELD" => "T.OVERDUE_DATE", "TYPE" => "datetime"), "NAME" => array("FIELD" => "T.NAME", "TYPE" => "string"), "DESCRIPTION" => array("FIELD" => "T.DESCRIPTION", "TYPE" => "string"), "PARAMETERS" => array("FIELD" => "T.PARAMETERS", "TYPE" => "string"), "IS_INLINE" => array("FIELD" => "T.IS_INLINE", "TYPE" => "string"), "DELEGATION_TYPE" => array("FIELD" => "T.DELEGATION_TYPE", "TYPE" => "int"), "STATUS" => array("FIELD" => "T.STATUS", "TYPE" => "int"), 'DOCUMENT_NAME' => array("FIELD" => "T.DOCUMENT_NAME", "TYPE" => "string"), "USER_ID" => array("FIELD" => "TU.USER_ID", "TYPE" => "int", "FROM" => "INNER JOIN b_bp_task_user TU ON (T.ID = TU.TASK_ID)"), "USER_STATUS" => array("FIELD" => "TU.STATUS", "TYPE" => "int", "FROM" => "INNER JOIN b_bp_task_user TU ON (T.ID = TU.TASK_ID)"), "WORKFLOW_TEMPLATE_ID" => array("FIELD" => "WS.WORKFLOW_TEMPLATE_ID", "TYPE" => "int", "FROM" => "INNER JOIN b_bp_workflow_state WS ON (T.WORKFLOW_ID = WS.ID)"), "MODULE_ID" => array("FIELD" => "WS.MODULE_ID", "TYPE" => "string", "FROM" => "INNER JOIN b_bp_workflow_state WS ON (T.WORKFLOW_ID = WS.ID)"), "ENTITY" => array("FIELD" => "WS.ENTITY", "TYPE" => "string", "FROM" => "INNER JOIN b_bp_workflow_state WS ON (T.WORKFLOW_ID = WS.ID)"), "DOCUMENT_ID" => array("FIELD" => "WS.DOCUMENT_ID", "TYPE" => "string", "FROM" => "INNER JOIN b_bp_workflow_state WS ON (T.WORKFLOW_ID = WS.ID)"), "WORKFLOW_TEMPLATE_NAME" => array("FIELD" => "WT.NAME", "TYPE" => "string", "FROM" => array("INNER JOIN b_bp_workflow_state WS ON (T.WORKFLOW_ID = WS.ID)", "INNER JOIN b_bp_workflow_template WT ON (WS.WORKFLOW_TEMPLATE_ID = WT.ID)")), "WORKFLOW_TEMPLATE_TEMPLATE_ID" => array("FIELD" => "WS.WORKFLOW_TEMPLATE_ID", "TYPE" => "int", "FROM" => array("INNER JOIN b_bp_workflow_state WS ON (T.WORKFLOW_ID = WS.ID)")), 'WORKFLOW_STATE' => array("FIELD" => "WS.STATE_TITLE", "TYPE" => "string", "FROM" => "INNER JOIN b_bp_workflow_state WS ON (T.WORKFLOW_ID = WS.ID)"), 'WORKFLOW_STARTED' => array("FIELD" => "WS.STARTED", "TYPE" => "datetime", "FROM" => "INNER JOIN b_bp_workflow_state WS ON (T.WORKFLOW_ID = WS.ID)"), 'WORKFLOW_STARTED_BY' => array("FIELD" => "WS.STARTED_BY", "TYPE" => "int", "FROM" => "INNER JOIN b_bp_workflow_state WS ON (T.WORKFLOW_ID = WS.ID)"), ); $arSqls = CBPHelper::PrepareSql($arFields, $arOrder, $arFilter, $arGroupBy, $arSelectFields); $arSqls["SELECT"] = str_replace("%%_DISTINCT_%%", "", $arSqls["SELECT"]); if (is_array($arGroupBy) && count($arGroupBy)==0) { $strSql = "SELECT ".$arSqls["SELECT"]." ". "FROM b_bp_task T ". " ".$arSqls["FROM"]." "; if (strlen($arSqls["WHERE"]) > 0) $strSql .= "WHERE ".$arSqls["WHERE"]." "; if (strlen($arSqls["GROUPBY"]) > 0) $strSql .= "GROUP BY ".$arSqls["GROUPBY"]." "; $dbRes = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__); if ($arRes = $dbRes->Fetch()) return $arRes["CNT"]; else return False; } $strSql = "SELECT ".$arSqls["SELECT"]." ". "FROM b_bp_task T ". " ".$arSqls["FROM"]." "; if (strlen($arSqls["WHERE"]) > 0) $strSql .= "WHERE ".$arSqls["WHERE"]." "; if (strlen($arSqls["GROUPBY"]) > 0) $strSql .= "GROUP BY ".$arSqls["GROUPBY"]." "; if (strlen($arSqls["ORDERBY"]) > 0) $strSql .= "ORDER BY ".$arSqls["ORDERBY"]." "; if (is_array($arNavStartParams) && IntVal($arNavStartParams["nTopCount"]) <= 0) { $strSql_tmp = "SELECT COUNT('x') as CNT ". "FROM b_bp_task T ". " ".$arSqls["FROM"]." "; if (strlen($arSqls["WHERE"]) > 0) $strSql_tmp .= "WHERE ".$arSqls["WHERE"]." "; if (strlen($arSqls["GROUPBY"]) > 0) $strSql_tmp .= "GROUP BY ".$arSqls["GROUPBY"]." "; $dbRes = $DB->Query($strSql_tmp, false, "File: ".__FILE__."<br>Line: ".__LINE__); $cnt = 0; if (strlen($arSqls["GROUPBY"]) <= 0) { if ($arRes = $dbRes->Fetch()) $cnt = $arRes["CNT"]; } else { $cnt = $dbRes->SelectedRowsCount(); } $dbRes = new CDBResult(); $dbRes->NavQuery($strSql, $cnt, $arNavStartParams); } else { if (is_array($arNavStartParams) && IntVal($arNavStartParams["nTopCount"]) > 0) $strSql .= "LIMIT ".intval($arNavStartParams["nTopCount"]); $dbRes = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__); } $dbRes = new CBPTaskResult($dbRes); return $dbRes; } } class CBPTaskResult extends CDBResult { public function __construct($res) { parent::CDBResult($res); } function Fetch() { $res = parent::Fetch(); if ($res) { if (strlen($res["PARAMETERS"]) > 0) $res["PARAMETERS"] = unserialize($res["PARAMETERS"]); } return $res; } function GetNext($bTextHtmlAuto=true, $use_tilda=true) { $res = parent::GetNext($bTextHtmlAuto, $use_tilda); if ($res) { if (strlen($res["DESCRIPTION"]) > 0) $res["DESCRIPTION"] = $this->ConvertBBCode($res["DESCRIPTION"]); } return $res; } function ConvertBBCode($text) { $text = preg_replace( "'(?<=^|[\s.,;:!?\#\-\*\|\[\(\)\{\}]|\s)((http|https|news|ftp|aim|mailto)://[\.\-\_\:a-z0-9\@]([^\"\s\'\[\]\{\}])*)'is", "[url]\\1[/url]", $text ); $text = preg_replace_callback("#\[img\](.+?)\[/img\]#i", array($this, "ConvertBCodeImageTag"), $text); $text = preg_replace_callback( "/\[url\]([^\]]+?)\[\/url\]/i".BX_UTF_PCRE_MODIFIER, array($this, "ConvertBCodeAnchorTag"), $text ); $text = preg_replace_callback( "/\[url\s*=\s*([^\]]+?)\s*\](.*?)\[\/url\]/i".BX_UTF_PCRE_MODIFIER, array($this, "ConvertBCodeAnchorTag"), $text ); $text = preg_replace( array( "/\[b\](.+?)\[\/b\]/is".BX_UTF_PCRE_MODIFIER, "/\[i\](.+?)\[\/i\]/is".BX_UTF_PCRE_MODIFIER, "/\[s\](.+?)\[\/s\]/is".BX_UTF_PCRE_MODIFIER, "/\[u\](.+?)\[\/u\]/is".BX_UTF_PCRE_MODIFIER ), array( "<b>\\1</b>", "<i>\\1</i>", "<s>\\1</s>", "<u>\\1</u>" ), $text ); return $text; } function ConvertBCodeImageTag($url = "") { if (is_array($url)) $url = $url[1]; $url = trim($url); if (strlen($url) <= 0) return ""; $extension = preg_replace("/^.*\.(\S+)$/".BX_UTF_PCRE_MODIFIER, "\\1", $url); $extension = strtolower($extension); $extension = preg_quote($extension, "/"); $bErrorIMG = False; if (preg_match("/[?&;]/".BX_UTF_PCRE_MODIFIER, $url)) $bErrorIMG = True; if (!$bErrorIMG && !preg_match("/$extension(\||\$)/".BX_UTF_PCRE_MODIFIER, "gif|jpg|jpeg|png")) $bErrorIMG = True; if (!$bErrorIMG && !preg_match("/^((http|https|ftp)\:\/\/[-_:.a-z0-9@]+)*(\/[-_+\/=:.a-z0-9@%]+)$/i".BX_UTF_PCRE_MODIFIER, $url)) $bErrorIMG = True; if ($bErrorIMG) return "[img]".$url."[/img]"; return '<img src="'.$url.'" border="0" />'; } function ConvertBCodeAnchorTag($url, $text = '') { if (is_array($url)) { $text = isset($url[2]) ? $url[2] : $url[1]; $url = $url[1]; } $result = ""; if ($url === $text) { $arUrl = explode(", ", $url); $arText = $arUrl; } else { $arUrl = array($url); $arText = array($text); } for ($i = 0, $n = count($arUrl); $i < $n; $i++) { $url = $arUrl[$i]; $text = $arText[$i]; $text = str_replace("\\\"", "\"", $text); $end = ""; if (preg_match("/([\.,\?]|!)$/".BX_UTF_PCRE_MODIFIER, $url, $match)) { $end = $match[1]; $url = preg_replace("/([\.,\?]|!)$/".BX_UTF_PCRE_MODIFIER, "", $url); $text = preg_replace("/([\.,\?]|!)$/".BX_UTF_PCRE_MODIFIER, "", $text); } $url = preg_replace( array("/&/".BX_UTF_PCRE_MODIFIER, "/javascript:/i".BX_UTF_PCRE_MODIFIER), array("&", "java script: "), $url ); if (substr($url, 0, 1) != "/" && !preg_match("/^(http|news|https|ftp|aim|mailto)\:\/\//i".BX_UTF_PCRE_MODIFIER, $url)) $url = 'http://'.$url; if (!preg_match("/^((http|https|news|ftp|aim):\/\/[-_:.a-z0-9@]+)*([^\"\'])+$/i".BX_UTF_PCRE_MODIFIER, $url)) return $text." (".$url.")".$end; $text = preg_replace( array("/&/i".BX_UTF_PCRE_MODIFIER, "/javascript:/i".BX_UTF_PCRE_MODIFIER), array("&", "javascript: "), $text ); if ($result !== "") $result .= ", "; $result .= "<a href=\"".$url."\" target='_blank'>".$text."</a>".$end; } return $result; } } //Compatibility class CBPTaskService extends CBPAllTaskService {}