%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/report/lib/visualconstructor/handler/ |
| Current File : /home/bitrix/www/bitrix/modules/report/lib/visualconstructor/handler/basereport.php |
<?php
namespace Bitrix\Report\VisualConstructor\Handler;
use Bitrix\Main\Localization\Loc;
use Bitrix\Report\VisualConstructor\Config\Common;
use Bitrix\Report\VisualConstructor\Entity\Report;
use Bitrix\Report\VisualConstructor\Fields\Base as BaseFormField;
use Bitrix\Report\VisualConstructor\Fields\Div;
use Bitrix\Report\VisualConstructor\Fields\Valuable\CustomDropDown;
use Bitrix\Report\VisualConstructor\Fields\Valuable\BaseValuable;
use Bitrix\Report\VisualConstructor\Fields\Valuable\DropDown;
use Bitrix\Report\VisualConstructor\Fields\Valuable\IValuable;
use Bitrix\Report\VisualConstructor\Helper\Category;
use Bitrix\Report\VisualConstructor\IReportData;
use Bitrix\Report\VisualConstructor\RuntimeProvider\CategoryProvider;
use Bitrix\Report\VisualConstructor\RuntimeProvider\ReportProvider;
use Bitrix\Report\VisualConstructor\RuntimeProvider\ViewProvider;
use Bitrix\Report\VisualConstructor\Handler\Base as BaseHandler;
/**
* Class BaseReport
* @property mixed category
* @property void unit
* @package Bitrix\Report\VisualConstructor
*/
abstract class BaseReport extends BaseHandler implements IReportData
{
private $title;
private $categoryKey;
private $unitKey;
private $weight = 0;
private $report;
private $calculatedData;
private $widgetHandler;
/**
* BaseReport constructor.
*/
public function __construct()
{
$report = new Report();
$report->setReportHandler($this);
$this->setReport($report);
$this->setTitle(Loc::getMessage('WITHOUT_DATA'));
}
/**
* @return \Bitrix\Report\VisualConstructor\Fields\Base[]
*/
public function getCollectedFormElements()
{
parent::getCollectedFormElements();
$this->getView()->collectReportHandlerFormElements($this);
return $this->getFormElements();
}
/**
* Collecting form elements for configuration form.
*
* @return void
*/
protected function collectFormElements()
{
$mainContainer = new Div();
$mainContainer->setKey('main_container');
if ($this->getConfiguration('color'))
{
$mainContainer->addInlineStyle('background-color', $this->getConfiguration('color')->getValue() . '5f');
}
else
{
$reportHandlersCount = count($this->getWidgetHandler()->getReportHandlers());
$mainContainer->addInlineStyle('background-color', $this->getView()->getReportDefaultColor($reportHandlersCount) . '5f');
}
$mainContainer->addClass('report-configuration-main');
$mainContainer->addAssets(array(
'css' => array('/bitrix/js/report/css/visualconstructor/configmain.css')
));
$this->addFormElement($mainContainer->start());
$fieldListContainer = new Div();
$fieldListContainer->setKey('field_list_container');
$fieldListContainer->addClass('report-configuration-field-list');
$this->addFormElement($fieldListContainer->start());
$reportHandlerSelectContainer = new Div();
$reportHandlerSelectContainer->setKey('report_handler_select_container');
$reportHandlerSelectContainer->addClass('report-configuration-row');
$reportHandlerSelectContainer->addClass('report-configuration-no-padding-bottom');
$categorySelectField = $this->getReportHandlerCategoryField();
$reportHandlerSelectField = $this->getReportHandlerSelectField($categorySelectField->getValue());
$reportHandlerSelectField->addJsEventListener($categorySelectField, $categorySelectField::JS_EVENT_ON_CHANGE, array(
'class' => 'BX.Report.VisualConstructor.FieldEventHandlers.ReportHandlerSelect',
'action' => 'categorySelected'
));
$reportHandlerSelectField->addAssets(array(
'js' => array('/bitrix/js/report/js/visualconstructor/fields/reporthandlerselect.js')
));
$this->addFormElement($reportHandlerSelectContainer->start());
$this->addFormElement($categorySelectField);
$this->addFormElement($reportHandlerSelectField);
$whatWillCalculateField = $this->getCalculateField();
$viewCompatibleDataType = $this->getView()->getCompatibleDataType();
if (in_array($viewCompatibleDataType, array(
Common::MULTIPLE_REPORT_TYPE,
Common::MULTIPLE_GROUPED_REPORT_TYPE,
Common::MULTIPLE_BI_GROUPED_REPORT_TYPE,
)))
{
$groupingField = $this->getGroupingField($whatWillCalculateField);
$this->addFormElement($groupingField);
$widgetHandler = $this->getWidgetHandler();
$previewBlock = $widgetHandler->getFormElement('view_type');
$previewBlock->addJsEventListener($groupingField, $groupingField::JS_EVENT_ON_CHANGE, array(
'class' => 'BX.Report.VisualConstructor.FieldEventHandlers.PreviewBlock',
'action' => 'reloadWidgetPreview'
));
}
$this->addFormElement($reportHandlerSelectContainer->end());
$selectListContainer = new Div();
$selectListContainer->setKey('report_configuration_select_list');
$selectListContainer->addClass('report-configuration-row');
$selectListContainer->addClass('report-configuration-row-list');
$this->addFormElement($selectListContainer->start());
$this->addFormElement($whatWillCalculateField);
$this->addFormElement($selectListContainer->end());
$this->addFormElement($fieldListContainer->end());
$this->addFormElement($mainContainer->end());
}
/**
* @return DropDown
*/
public function getCalculateField()
{
$whatWillCalculate = new DropDown('calculate');
$whatWillCalculate->setLabel(Loc::getMessage('BASE_REPORT_HANDLER_WHAT_WILL_CALCULATE'));
$whatWillCalculate->addOptions($this->getWhatWillCalculateOptions());
return $whatWillCalculate;
}
/**
* @param DropDown $whatWillCalculateField What will calculate field.
* @return DropDown
*/
public function getGroupingField(DropDown $whatWillCalculateField)
{
$groupingField = new CustomDropDown('groupingBy');
$groupingField->setLabel(Loc::getMessage('BASE_REPORT_HANDLER_GROUPING'));
$groupingField->addOptions($this->getGroupByOptions());
$whatWillCalculateField->addJsEventListener($groupingField, $groupingField::JS_EVENT_ON_CHANGE, array(
'class' => 'BX.Report.VisualConstructor.FieldEventHandlers.WhatWillCalculate',
'action' => 'reloadCompatibleCalculatedTypes',
));
$whatWillCalculateField->addAssets(array(
'js' => array('/bitrix/js/report/js/visualconstructor/fields/whatwillcalculate.js')
));
return $groupingField;
}
/**
* @return array
*/
protected function getGroupByOptions()
{
return array();
}
/**
* @return BaseFormField[]
*/
public function getFormElements()
{
$pseudoReportId = '_pseudo' . randString(4);
$result = array();
foreach ($this->formElementsList as $key => $element)
{
$viewModesWhereFieldAvailable = $element->getCompatibleViewTypes();
if ($viewModesWhereFieldAvailable != null)
{
$viewKey = $this->getView()->getKey();
$viewProvider = new ViewProvider();
$viewProvider->addFilter('primary', $viewKey);
$viewProvider->addFilter('dataType', $viewModesWhereFieldAvailable);
$views = $viewProvider->execute()->getResults();
if (!empty($views))
{
$result[$key] = $element;
}
}
else
{
$result[$key] = $element;
}
if ($element instanceof BaseValuable)
{
$element->setName($this->getNameForFormElement($element, $pseudoReportId));
}
}
return $result;
}
/**
* @param BaseValuable $element Element for which construct name.
* @param string $pseudoReportId pseudo report id is report not exist.
* @return string
*/
protected function getNameForFormElement(BaseValuable $element, $pseudoReportId = '')
{
$name = '';
if ($this->getWidgetHandler() && $this->getReport())
{
$name = 'widget[' .
$this->getWidgetHandler()->getWidget()->getGId() .
'][reports][' .
$this->getReport()->getGId() .
']';
}
elseif(!$this->getReport())
{
$name = 'widget[' .
$this->getWidgetHandler()->getWidget()->getGId() .
'][reports][' .
$pseudoReportId .
']';
}
$name .= parent::getNameForFormElement($element);
return $name;
}
/**
* @return string
*/
public function getTitle()
{
return $this->title;
}
/**
* @param string $title Title of report handler.
* @return void
*/
public function setTitle($title)
{
$this->title = $title;
}
/**
* @return mixed
*/
public function getWeight()
{
return $this->weight;
}
/**
* @param mixed $weight Weight value for sorting.
* @return void
*/
public function setWeight($weight)
{
$this->weight = $weight;
}
/**
* @return Report
*/
public function getReport()
{
return $this->report;
}
/**
* @param Report $report Report entity.
* @return void
*/
public function setReport($report)
{
$this->report = $report;
}
/**
* @return mixed
*/
public function getCalculatedData()
{
return $this->calculatedData;
}
/**
* @param mixed $calculatedData Report handler calculated data.
* @return void
*/
public function setCalculatedData($calculatedData)
{
$this->calculatedData = $calculatedData;
}
/**
* Fill report handler properties from Report entity.
*
* @param Report $report Report entity.
* @return void
*/
public function fillReport(Report $report)
{
$viewHandler = $this->getView();
if ($viewHandler)
{
$this->setView($viewHandler);
}
$this->setReport($report);
$this->setConfigurations($report->getConfigurations());
$this->getCollectedFormElements();
$this->fillFormElementsValues();
}
private function fillFormElementsValues()
{
$formElements = $this->getFormElements();
$configurations = $this->getConfigurations();
if (!empty($configurations))
{
foreach ($configurations as $configuration)
{
if (isset($formElements[$configuration->getKey()]) && ($formElements[$configuration->getKey()] instanceof BaseValuable))
{
/** @var BaseValuable[] $formElements */
$formElements[$configuration->getKey()]->setValue($configuration->getValue());
}
}
}
}
/**
* @return string
*/
public function getCategoryKey()
{
return $this->categoryKey;
}
/**
* Attach report handler to category.
*
* @param string $categoryKey Category key.
* @return void
*/
protected function setCategoryKey($categoryKey)
{
$this->categoryKey = $categoryKey;
}
/**
* @return string
*/
public function getUnitKey()
{
return $this->unitKey;
}
/**
* @param string $unitKey Unit measurement key.
* @return void
*/
protected function setUnitKey($unitKey)
{
$this->unitKey = $unitKey;
}
/**
* Field for selecting category.
*
* @return DropDown
*/
private function getReportHandlerCategoryField()
{
$selectField = new CustomDropDown('reportCategory');
$selectField->setLabel(Loc::getMessage('SELECT_REPORT_HANDLER_CATEGORY'));
$categories = new CategoryProvider();
$categories->addFilter('parent_keys', 'main');
$categories->addRelation('children');
$categories->addRelation('parent');
$categories = $categories->execute()->getResults();
$options = Category::getOptionsTree($categories);
$selectField->addOptions($options);
$selectField->setValue($this->getCategoryKey());
return $selectField;
}
/**
* Build report handler select drop down.
* Collect all report handler sin selected category.
*
* @param string $categoryKey Category key.
* @return CustomDropDown
*/
private function getReportHandlerSelectField($categoryKey = '__')
{
$selectField = new CustomDropDown('reportHandler');
$selectField->addDataAttribute('field-type', 'report-handler-class');
$selectField->setLabel(Loc::getMessage('SELECT_DATA_PROVIDER'));
$selectField->addJsEventListener($selectField, $selectField::JS_EVENT_ON_CHANGE, array(
'class' => 'BX.Report.VisualConstructor.FieldEventHandlers.ReportHandlerSelect',
'action' => 'reportHandlerSelected',
));
$selectField->addAssets(array(
'js' => array('/bitrix/js/report/js/visualconstructor/fields/reporthandlerselect.js')
));
$reports = new ReportProvider();
$reports->addFilter('dataType', $this->getView()->getCompatibleDataType());
if (!empty($categoryKey) && $categoryKey !== '__')
{
$reports->addFilter('categories', array($categoryKey));
}
$reports->execute();
/** @var BaseReport[] $reportHandlers */
$reportHandlers = $reports->getResults();
foreach ($reportHandlers as $report)
{
$selectField->addOption($report::getClassName(), $report->getTitle());
}
$selectField->setDefaultValue($this::getClassName());
return $selectField;
}
/**
* @return array
*/
public function getReportImplementedDataTypes()
{
$dataTypeMap = Common::$reportImplementationTypesMap;
$class = get_class($this);
$implementedInterfaceList = class_implements($class);
$implementedInterfaceList = array_values($implementedInterfaceList);
$result = array();
foreach ($dataTypeMap as $reportTypeKey => $settings)
{
if (in_array($settings['interface'], $implementedInterfaceList))
{
$result[] = $reportTypeKey;
}
}
return $result;
}
/**
* @return BaseWidget|null
*/
public function getWidgetHandler()
{
if ($this->getReport()->getWidget())
{
return $this->getReport()->getWidget()->getWidgetHandler();
}
elseif ($this->widgetHandler)
{
return $this->widgetHandler;
}
else
{
return null;
}
}
/**
* Attach report handler to widget handler.
*
* @param BaseWidget $widgetHandler Widget handler.
* @return void
*/
public function setWidgetHandler(BaseWidget $widgetHandler)
{
$this->widgetHandler = $widgetHandler;
}
/**
* In cloning of entity clone nested entities too.(configurations, form elements list).
* @return void
*/
public function __clone()
{
foreach ($this->configurations as $key => $configuration)
{
$this->configurations[$key] = clone $configuration;
}
foreach ($this->formElementsList as $key => $formElement)
{
$this->formElementsList[$key] = clone $formElement;
}
}
/**
*
* @param null $groupingValue Grouping field value.
* @return array
*/
public function getWhatWillCalculateOptions($groupingValue = null)
{
return array();
}
}