• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/lib/provider/taskprovider.php
  • Класс: BitrixTasksProviderTaskProvider
  • Вызов: TaskProvider::makeArSqlOrder
private function makeArSqlOrder(): self
{
	foreach ($this->arOrder as $by => $order)
	{
		$needle = null;
		$by = strtolower($by);
		$order = strtolower($order);

		if ($by === 'deadline')
		{
			if ( ! in_array($order, array('asc', 'desc', 'asc,nulls', 'desc,nulls'), true) )
				$order = 'asc,nulls';
		}
		else
		{
			if ($order !== 'asc')
				$order = 'desc';
		}

		switch ($by)
		{
			case 'id':
				$this->arSqlOrder[] = " ID ".$order." ";
				break;

			case 'title':
				$this->arSqlOrder[] = " TITLE ".$order." ";
				$needle = 'TITLE';
				break;

			case 'time_spent_in_logs':
				$this->arSqlOrder[] = " TIME_SPENT_IN_LOGS ".$order." ";
				$needle = 'TIME_SPENT_IN_LOGS';
				break;

			case 'date_start':
				$this->arSqlOrder[] = " T.DATE_START ".$order." ";
				$needle = 'DATE_START';
				break;

			case 'created_date':
				$this->arSqlOrder[] = " T.CREATED_DATE ".$order." ";
				$needle = 'CREATED_DATE';
				break;

			case 'changed_date':
				$this->arSqlOrder[] = " T.CHANGED_DATE ".$order." ";
				$needle = 'CHANGED_DATE';
				break;

			case 'closed_date':
				$this->arSqlOrder[] = " T.CLOSED_DATE ".$order." ";
				$needle = 'CLOSED_DATE';
				break;

			case 'activity_date':
				$this->arSqlOrder[] = " T.ACTIVITY_DATE ".$order." ";
				$needle = 'ACTIVITY_DATE';
				break;

			case 'start_date_plan':
				$this->arSqlOrder[] = " T.START_DATE_PLAN ".$order." ";
				$needle = 'START_DATE_PLAN';
				break;

			case 'end_date_plan':
				$this->arSqlOrder[] = " T.END_DATE_PLAN ".$order." ";
				$needle = 'END_DATE_PLAN';
				break;

			case 'deadline':
				$orderClause = $this->getOrderSql(
					'T.DEADLINE',
					$order,
					$default_order = 'asc,nulls',
					$nullable = true
				);
				$needle = 'DEADLINE_ORIG';

				if ( !is_array($orderClause) )
					$this->arSqlOrder[] = $orderClause;
				else   // we have to add select field in order to correctly sort
				{
					//         COLUMN ALIAS      COLUMN EXPRESSION
					$this->arFields[$orderClause[1]] = $orderClause[0];

					if ( ! in_array($orderClause[1], $this->arSelect) )
						$this->arSelect[] = $orderClause[1];

					$this->arSqlOrder[] = $orderClause[2];	// order expression
				}
				break;

			case 'status':
//					$arSqlOrder[] = " STATUS ".$order." ";
//					$needle = 'STATUS';
				break;
			case 'real_status':
				$this->arSqlOrder[] = " REAL_STATUS ".$order." ";
				$needle = 'REAL_STATUS';
				break;

			case 'status_complete':
				$this->arSqlOrder[] = " STATUS_COMPLETE ".$order." ";
				$needle = 'STATUS_COMPLETE';
				break;

			case 'priority':
				$this->arSqlOrder[] = " PRIORITY ".$order." ";
				$needle = 'PRIORITY';
				break;

			case 'mark':
				$this->arSqlOrder[] = " MARK ".$order." ";
				$needle = 'MARK';
				break;

			case 'originator_name':
			case 'created_by':
			case 'created_by_last_name':
				$this->arSqlOrder[] = " CREATED_BY_LAST_NAME ".$order." ";
				$needle = 'CREATED_BY_LAST_NAME';
				break;

			case 'responsible_name':
			case 'responsible_id':
			case 'responsible_last_name':
				$this->arSqlOrder[] = " RESPONSIBLE_LAST_NAME ".$order." ";
				$needle = 'RESPONSIBLE_LAST_NAME';
				break;

			case 'group_id':
				$this->arSqlOrder[] = " GROUP_ID ".$order." ";
				$needle = 'GROUP_ID';
				break;

			case 'time_estimate':
				$this->arSqlOrder[] = " TIME_ESTIMATE ".$order." ";
				$needle = 'TIME_ESTIMATE';
				break;

			case 'allow_change_deadline':
				$this->arSqlOrder[] = " ALLOW_CHANGE_DEADLINE ".$order." ";
				$needle = 'ALLOW_CHANGE_DEADLINE';
				break;

			case 'allow_time_tracking':
				$this->arSqlOrder[] = " ALLOW_TIME_TRACKING ".$order." ";
				$needle = 'ALLOW_TIME_TRACKING';
				break;

			case 'match_work_time':
				$this->arSqlOrder[] = " MATCH_WORK_TIME ".$order." ";
				$needle = 'MATCH_WORK_TIME';
				break;

			case 'favorite':
				$this->arSqlOrder[] = " FAVORITE ".$order." ";
				$needle = 'FAVORITE';
				break;

			case 'sorting':
				$asc = stripos($order, "desc") === false;
				$this->arSqlOrder = array_merge($this->arSqlOrder, $this->getSortingOrderBy($asc));
				$needle = "SORTING";
				break;

			case 'message_id':
				$this->arSqlOrder[] = " MESSAGE_ID " . $order . " ";
				$needle = 'MESSAGE_ID';
				break;

			case 'is_pinned':
				$this->arSqlOrder[] = " IS_PINNED " . $order . " ";
				$needle = 'IS_PINNED';
				break;

			case 'is_pinned_in_group':
				$this->arSqlOrder[] = " IS_PINNED_IN_GROUP " . $order . " ";
				$needle = 'IS_PINNED_IN_GROUP';
				break;

			case 'scrum_items_sort':
				$this->arSqlOrder[] = " BTSI.SORT " . $order . " ";
				break;

			default:
				if (substr($by, 0, 3) === 'uf_')
				{
					if ($s = $this->obUserFieldsSql->GetOrder($by))
						$this->arSqlOrder[$by] = " ".$s." ".$order." ";
				}
				else
					CTaskAssert::logWarning('[0x9a92cf7d] invalid sort by field requested: ' . $by);
				break;
		}

		if (
			($needle !== null)
			&& ( ! in_array($needle, $this->arSelect) )
		)
		{
			$this->arSelect[] = $needle;
		}
	}

	return $this;
}