PageRenderTime 34ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/modules/sender/lib/connector/basefilter.php

https://gitlab.com/alexprowars/bitrix
PHP | 350 lines | 244 code | 38 blank | 68 comment | 31 complexity | c7e9ed866010138d7c4edb4e4d3f14a0 MD5 | raw file
  1. <?php
  2. /**
  3. * Bitrix Framework
  4. * @package bitrix
  5. * @subpackage sender
  6. * @copyright 2001-2012 Bitrix
  7. */
  8. namespace Bitrix\Sender\Connector;
  9. use Bitrix\Main\Localization\Loc;
  10. use Bitrix\Main\UI\Filter\Options as FilterOptions;
  11. Loc::loadMessages(__FILE__);
  12. /**
  13. * Class BaseFilter
  14. * @package Bitrix\Sender\Connector
  15. */
  16. abstract class BaseFilter extends Base
  17. {
  18. const FIELD_FOR_PRESET_ALL = 'SENDER_SELECT_ALL';
  19. const FIELD_PRESET_ID = 'BX_PRESET_ID';
  20. /** @var string $filterSettingsUri Filter settings uri. */
  21. protected $filterSettingsUri = '';
  22. /**
  23. * Get form html.
  24. *
  25. * @return string
  26. */
  27. final public function getForm()
  28. {
  29. $presets = $this->getUiFilterPresets();
  30. $currentPresetId = $this->getCurrentPresetId();
  31. if ($currentPresetId && isset($presets[$currentPresetId]))
  32. {
  33. $preset[$currentPresetId]['default'] = true;
  34. }
  35. $filterId = $this->getUiFilterId();
  36. $this->clearFilterState($filterId);
  37. $filter = static::getFilterFields();
  38. return $this->buildUi($filterId, $currentPresetId, $presets, $filter);
  39. }
  40. /**
  41. * Get form html.
  42. *
  43. * @param array $params
  44. *
  45. * @return string
  46. */
  47. final public function getCustomForm(array $params)
  48. {
  49. $presets = $params['presets']??$this->getUiFilterPresets();
  50. $currentPresetId = $params['current_preset_id']??$this->getCurrentPresetId();
  51. if ($currentPresetId && isset($presets[$currentPresetId]))
  52. {
  53. $preset[$currentPresetId]['default'] = true;
  54. }
  55. $filterId = $params['filter_id']??$this->getUiFilterId();
  56. $this->clearFilterState($filterId);
  57. $filter = static::getFilterFields($params['filter']);
  58. return $this->buildUi($filterId, $currentPresetId, $presets, $filter);
  59. }
  60. private function buildUi($filterId, $currentPresetId, $presets, $filter)
  61. {
  62. ob_start();
  63. /** @var \CAllMain $GLOBALS['APPLICATION'] Application. */
  64. $GLOBALS['APPLICATION']->includeComponent(
  65. "bitrix:main.ui.filter",
  66. "",
  67. array(
  68. "FILTER_ID" => $filterId,
  69. "CURRENT_PRESET" => $currentPresetId,
  70. "FILTER" => array_filter(
  71. $filter,
  72. function ($field)
  73. {
  74. return empty($field['sender_internal']);
  75. }
  76. ),
  77. "FILTER_PRESETS" => $presets,
  78. "DISABLE_SEARCH" => true,
  79. "ENABLE_LABEL" => true,
  80. )
  81. );
  82. foreach ($this->getUiFilterFields() as $field)
  83. {
  84. if (!isset($field['sender_segment_callback']))
  85. {
  86. continue;
  87. }
  88. if (!is_callable($field['sender_segment_callback']))
  89. {
  90. continue;
  91. }
  92. echo $field['sender_segment_callback']($field);
  93. }
  94. return ob_get_clean();
  95. }
  96. /**
  97. * Get date-from field value.
  98. *
  99. * @param string $name Field name.
  100. * @param string|null $defaultValue Default value.
  101. * @return null|string
  102. */
  103. protected function getFieldDateFrom($name, $defaultValue = null)
  104. {
  105. $field = static::getUiFilterField($name);
  106. if (!$field)
  107. {
  108. return null;
  109. }
  110. $field['value'] = $this->getFieldValue($name, $defaultValue);
  111. return Filter\DateField::create($field)->getFrom();
  112. }
  113. /**
  114. * Get date-to field value.
  115. *
  116. * @param string $name Field name.
  117. * @param string|null $defaultValue Default value.
  118. * @return null|string
  119. */
  120. protected function getFieldDateTo($name, $defaultValue = null)
  121. {
  122. $field = static::getUiFilterField($name);
  123. if (!$field)
  124. {
  125. return null;
  126. }
  127. $field['value'] = $this->getFieldValue($name, $defaultValue);
  128. return Filter\DateField::create($field)->getTo();
  129. }
  130. public function getUiFilterId()
  131. {
  132. return $this->getId() . '_%CONNECTOR_NUM%';
  133. }
  134. public function getCurrentPresetId()
  135. {
  136. return $this->getFieldValue(self::FIELD_PRESET_ID, null);
  137. }
  138. public function setFieldValues(array $fieldValues = null)
  139. {
  140. if (is_array($fieldValues) && count($fieldValues) > 0)
  141. {
  142. $values = array();
  143. $fields = $this->getFilterFields();
  144. $systemFields = array(self::FIELD_PRESET_ID, self::FIELD_FOR_PRESET_ALL);
  145. foreach ($systemFields as $fieldId)
  146. {
  147. if (!isset($fieldValues[$fieldId]) || !$fieldValues[$fieldId])
  148. {
  149. continue;
  150. }
  151. $values[$fieldId] = $fieldValues[$fieldId];
  152. }
  153. foreach ($fields as $field)
  154. {
  155. if (!isset($fieldValues[$field['id']]) && !in_array($field['id'], $systemFields))
  156. {
  157. continue;
  158. }
  159. if ($field['type'] === 'dest_selector')
  160. {
  161. if (array_key_exists($field['id'].'_label', $fieldValues))
  162. {
  163. $values[$field['id'].'_label'] = $fieldValues[$field['id'].'_label'];
  164. }
  165. elseif (array_key_exists('_label', $fieldValues[$field['id']]))
  166. {
  167. $values[$field['id'].'_label'] = $fieldValues[$field['id']]['_label'];
  168. $fieldValues[$field['id']] = $fieldValues[$field['id']]['_value'];
  169. }
  170. }
  171. $values[$field['id']] = $fieldValues[$field['id']];
  172. }
  173. $fieldValues = $values;
  174. }
  175. parent::setFieldValues($fieldValues);
  176. }
  177. /**
  178. * Get filters.
  179. * Return array of field filters \Bitrix\Main\UI\Filter\Field
  180. *
  181. * @return \Bitrix\Main\UI\Filter\Field[]
  182. */
  183. public static function getUiFilterFields()
  184. {
  185. return array();
  186. }
  187. /**
  188. * Get UI filter fields.
  189. *
  190. * @param string $id ID.
  191. * @return array|null
  192. */
  193. public static function getUiFilterField($id)
  194. {
  195. foreach (static::getFilterFields() as $field)
  196. {
  197. if ($field['id'] === $id)
  198. {
  199. return $field;
  200. }
  201. }
  202. return null;
  203. }
  204. /**
  205. * Get Ui filter data.
  206. *
  207. * @param string $filterId Filter ID.
  208. * @return array
  209. */
  210. public static function getUiFilterData($filterId)
  211. {
  212. $filterFields = static::getFilterFields();
  213. $filterOptions = new FilterOptions($filterId, static::getUiFilterPresets());
  214. $filterRequest = $filterOptions->getFilter($filterFields);
  215. $filterData = array();
  216. foreach ($filterFields as $field)
  217. {
  218. $fieldId = $field['id'];
  219. if ($field['type'] === 'dest_selector')
  220. {
  221. $destSelectorData = Filter\DestSelectorField::create($field)->fetchFieldValue($filterRequest);
  222. if ($destSelectorData)
  223. {
  224. $filterData[$fieldId] = $destSelectorData;
  225. }
  226. }
  227. elseif (isset($filterRequest[$fieldId]))
  228. {
  229. $filterData[$fieldId] = $filterRequest[$fieldId];
  230. }
  231. elseif ($field['type'] === 'date')
  232. {
  233. $dateData = Filter\DateField::create($field)->fetchFieldValue($filterRequest);
  234. if (is_array($dateData) && count($dateData))
  235. {
  236. $filterData[$fieldId] = $dateData;
  237. }
  238. }
  239. elseif ($field['type'] === 'number')
  240. {
  241. $numberData = FilterOptions::fetchNumberFieldValue(
  242. $fieldId . '_numsel',
  243. $filterRequest
  244. );
  245. if (is_array($numberData) && count($numberData))
  246. {
  247. if (count($numberData) > 1 || $numberData[$fieldId . '_numsel'] !== null)
  248. {
  249. $filterData[$fieldId] = $numberData;
  250. }
  251. }
  252. }
  253. }
  254. if (isset($filterRequest['PRESET_ID']) && array_key_exists($filterRequest['PRESET_ID'], static::getUiFilterPresets()))
  255. {
  256. $filterData[self::FIELD_PRESET_ID] = $filterRequest['PRESET_ID'];
  257. }
  258. return $filterData;
  259. }
  260. /**
  261. * Get Ui filter presets.
  262. *
  263. * @return array
  264. */
  265. protected static function getUiFilterPresets()
  266. {
  267. return array();
  268. }
  269. /**
  270. * Get Ui filter presets.
  271. *
  272. * @param null $filter
  273. *
  274. * @return array
  275. */
  276. private static function getFilterFields($filter = null)
  277. {
  278. $fields = $filter??static::getUiFilterFields();
  279. $fields = is_array($fields) ? $fields : array();
  280. $fields[] = array(
  281. "id" => self::FIELD_FOR_PRESET_ALL,
  282. "name" => Loc::getMessage('SENDER_CONNECTOR_BASE_FILTER'),
  283. 'type' => 'checkbox',
  284. "default" => false,
  285. "sender_segment_filter" => false,
  286. );
  287. return $fields;
  288. }
  289. protected function clearFilterState($filterId)
  290. {
  291. $filterOptions = new FilterOptions($filterId, static::getUiFilterPresets());
  292. $settings = $filterOptions->getOptions();
  293. $cleared = false;
  294. if ($settings && $settings['filter'])
  295. {
  296. $filterPresetIds = ['tmp_filter', $settings['filter']];
  297. foreach ($filterPresetIds as $filterPresetId)
  298. {
  299. $presetSettings = $filterOptions->getFilterSettings($filterPresetId);
  300. if ($presetSettings['fields'])
  301. {
  302. $filterOptions->setFilterSettings($filterPresetId, ['clear_filter' => 'Y']); // clear saved filter state
  303. $cleared = true;
  304. }
  305. }
  306. }
  307. if ($cleared)
  308. {
  309. $filterOptions->save();
  310. }
  311. }
  312. }