/modules/sender/lib/connector/basefilter.php
PHP | 350 lines | 244 code | 38 blank | 68 comment | 31 complexity | c7e9ed866010138d7c4edb4e4d3f14a0 MD5 | raw file
- <?php
- /**
- * Bitrix Framework
- * @package bitrix
- * @subpackage sender
- * @copyright 2001-2012 Bitrix
- */
- namespace Bitrix\Sender\Connector;
- use Bitrix\Main\Localization\Loc;
- use Bitrix\Main\UI\Filter\Options as FilterOptions;
- Loc::loadMessages(__FILE__);
- /**
- * Class BaseFilter
- * @package Bitrix\Sender\Connector
- */
- abstract class BaseFilter extends Base
- {
- const FIELD_FOR_PRESET_ALL = 'SENDER_SELECT_ALL';
- const FIELD_PRESET_ID = 'BX_PRESET_ID';
- /** @var string $filterSettingsUri Filter settings uri. */
- protected $filterSettingsUri = '';
- /**
- * Get form html.
- *
- * @return string
- */
- final public function getForm()
- {
- $presets = $this->getUiFilterPresets();
- $currentPresetId = $this->getCurrentPresetId();
- if ($currentPresetId && isset($presets[$currentPresetId]))
- {
- $preset[$currentPresetId]['default'] = true;
- }
- $filterId = $this->getUiFilterId();
- $this->clearFilterState($filterId);
- $filter = static::getFilterFields();
- return $this->buildUi($filterId, $currentPresetId, $presets, $filter);
- }
- /**
- * Get form html.
- *
- * @param array $params
- *
- * @return string
- */
- final public function getCustomForm(array $params)
- {
- $presets = $params['presets']??$this->getUiFilterPresets();
- $currentPresetId = $params['current_preset_id']??$this->getCurrentPresetId();
- if ($currentPresetId && isset($presets[$currentPresetId]))
- {
- $preset[$currentPresetId]['default'] = true;
- }
- $filterId = $params['filter_id']??$this->getUiFilterId();
- $this->clearFilterState($filterId);
- $filter = static::getFilterFields($params['filter']);
- return $this->buildUi($filterId, $currentPresetId, $presets, $filter);
- }
- private function buildUi($filterId, $currentPresetId, $presets, $filter)
- {
- ob_start();
- /** @var \CAllMain $GLOBALS['APPLICATION'] Application. */
- $GLOBALS['APPLICATION']->includeComponent(
- "bitrix:main.ui.filter",
- "",
- array(
- "FILTER_ID" => $filterId,
- "CURRENT_PRESET" => $currentPresetId,
- "FILTER" => array_filter(
- $filter,
- function ($field)
- {
- return empty($field['sender_internal']);
- }
- ),
- "FILTER_PRESETS" => $presets,
- "DISABLE_SEARCH" => true,
- "ENABLE_LABEL" => true,
- )
- );
- foreach ($this->getUiFilterFields() as $field)
- {
- if (!isset($field['sender_segment_callback']))
- {
- continue;
- }
- if (!is_callable($field['sender_segment_callback']))
- {
- continue;
- }
- echo $field['sender_segment_callback']($field);
- }
- return ob_get_clean();
- }
- /**
- * Get date-from field value.
- *
- * @param string $name Field name.
- * @param string|null $defaultValue Default value.
- * @return null|string
- */
- protected function getFieldDateFrom($name, $defaultValue = null)
- {
- $field = static::getUiFilterField($name);
- if (!$field)
- {
- return null;
- }
- $field['value'] = $this->getFieldValue($name, $defaultValue);
- return Filter\DateField::create($field)->getFrom();
- }
- /**
- * Get date-to field value.
- *
- * @param string $name Field name.
- * @param string|null $defaultValue Default value.
- * @return null|string
- */
- protected function getFieldDateTo($name, $defaultValue = null)
- {
- $field = static::getUiFilterField($name);
- if (!$field)
- {
- return null;
- }
- $field['value'] = $this->getFieldValue($name, $defaultValue);
- return Filter\DateField::create($field)->getTo();
- }
- public function getUiFilterId()
- {
- return $this->getId() . '_%CONNECTOR_NUM%';
- }
- public function getCurrentPresetId()
- {
- return $this->getFieldValue(self::FIELD_PRESET_ID, null);
- }
- public function setFieldValues(array $fieldValues = null)
- {
- if (is_array($fieldValues) && count($fieldValues) > 0)
- {
- $values = array();
- $fields = $this->getFilterFields();
- $systemFields = array(self::FIELD_PRESET_ID, self::FIELD_FOR_PRESET_ALL);
- foreach ($systemFields as $fieldId)
- {
- if (!isset($fieldValues[$fieldId]) || !$fieldValues[$fieldId])
- {
- continue;
- }
- $values[$fieldId] = $fieldValues[$fieldId];
- }
- foreach ($fields as $field)
- {
- if (!isset($fieldValues[$field['id']]) && !in_array($field['id'], $systemFields))
- {
- continue;
- }
- if ($field['type'] === 'dest_selector')
- {
- if (array_key_exists($field['id'].'_label', $fieldValues))
- {
- $values[$field['id'].'_label'] = $fieldValues[$field['id'].'_label'];
- }
- elseif (array_key_exists('_label', $fieldValues[$field['id']]))
- {
- $values[$field['id'].'_label'] = $fieldValues[$field['id']]['_label'];
- $fieldValues[$field['id']] = $fieldValues[$field['id']]['_value'];
- }
- }
- $values[$field['id']] = $fieldValues[$field['id']];
- }
- $fieldValues = $values;
- }
- parent::setFieldValues($fieldValues);
- }
- /**
- * Get filters.
- * Return array of field filters \Bitrix\Main\UI\Filter\Field
- *
- * @return \Bitrix\Main\UI\Filter\Field[]
- */
- public static function getUiFilterFields()
- {
- return array();
- }
- /**
- * Get UI filter fields.
- *
- * @param string $id ID.
- * @return array|null
- */
- public static function getUiFilterField($id)
- {
- foreach (static::getFilterFields() as $field)
- {
- if ($field['id'] === $id)
- {
- return $field;
- }
- }
- return null;
- }
- /**
- * Get Ui filter data.
- *
- * @param string $filterId Filter ID.
- * @return array
- */
- public static function getUiFilterData($filterId)
- {
- $filterFields = static::getFilterFields();
- $filterOptions = new FilterOptions($filterId, static::getUiFilterPresets());
- $filterRequest = $filterOptions->getFilter($filterFields);
- $filterData = array();
- foreach ($filterFields as $field)
- {
- $fieldId = $field['id'];
- if ($field['type'] === 'dest_selector')
- {
- $destSelectorData = Filter\DestSelectorField::create($field)->fetchFieldValue($filterRequest);
- if ($destSelectorData)
- {
- $filterData[$fieldId] = $destSelectorData;
- }
- }
- elseif (isset($filterRequest[$fieldId]))
- {
- $filterData[$fieldId] = $filterRequest[$fieldId];
- }
- elseif ($field['type'] === 'date')
- {
- $dateData = Filter\DateField::create($field)->fetchFieldValue($filterRequest);
- if (is_array($dateData) && count($dateData))
- {
- $filterData[$fieldId] = $dateData;
- }
- }
- elseif ($field['type'] === 'number')
- {
- $numberData = FilterOptions::fetchNumberFieldValue(
- $fieldId . '_numsel',
- $filterRequest
- );
- if (is_array($numberData) && count($numberData))
- {
- if (count($numberData) > 1 || $numberData[$fieldId . '_numsel'] !== null)
- {
- $filterData[$fieldId] = $numberData;
- }
- }
- }
- }
- if (isset($filterRequest['PRESET_ID']) && array_key_exists($filterRequest['PRESET_ID'], static::getUiFilterPresets()))
- {
- $filterData[self::FIELD_PRESET_ID] = $filterRequest['PRESET_ID'];
- }
- return $filterData;
- }
- /**
- * Get Ui filter presets.
- *
- * @return array
- */
- protected static function getUiFilterPresets()
- {
- return array();
- }
- /**
- * Get Ui filter presets.
- *
- * @param null $filter
- *
- * @return array
- */
- private static function getFilterFields($filter = null)
- {
- $fields = $filter??static::getUiFilterFields();
- $fields = is_array($fields) ? $fields : array();
- $fields[] = array(
- "id" => self::FIELD_FOR_PRESET_ALL,
- "name" => Loc::getMessage('SENDER_CONNECTOR_BASE_FILTER'),
- 'type' => 'checkbox',
- "default" => false,
- "sender_segment_filter" => false,
- );
- return $fields;
- }
- protected function clearFilterState($filterId)
- {
- $filterOptions = new FilterOptions($filterId, static::getUiFilterPresets());
- $settings = $filterOptions->getOptions();
- $cleared = false;
- if ($settings && $settings['filter'])
- {
- $filterPresetIds = ['tmp_filter', $settings['filter']];
- foreach ($filterPresetIds as $filterPresetId)
- {
- $presetSettings = $filterOptions->getFilterSettings($filterPresetId);
- if ($presetSettings['fields'])
- {
- $filterOptions->setFilterSettings($filterPresetId, ['clear_filter' => 'Y']); // clear saved filter state
- $cleared = true;
- }
- }
- }
- if ($cleared)
- {
- $filterOptions->save();
- }
- }
- }