%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/bitrix/www/bitrix/modules/report/lib/visualconstructor/controller/
Upload File :
Create Path :
Current File : /home/bitrix/www/bitrix/modules/report/lib/visualconstructor/controller/widget.php

<?php

namespace Bitrix\Report\VisualConstructor\Controller;

use Bitrix\Main\ArgumentException;
use Bitrix\Main\Entity\Query;
use Bitrix\Report\VisualConstructor\Internal\Engine\Response\Component;
use Bitrix\Main\Localization\Loc;
use Bitrix\Report\VisualConstructor\Entity\ConfigurableModel;
use Bitrix\Report\VisualConstructor\Entity\DashboardRow;
use Bitrix\Report\VisualConstructor\Fields\Valuable\BaseValuable;
use Bitrix\Report\VisualConstructor\Handler\Base;
use Bitrix\Report\VisualConstructor\Handler\BaseReport;
use Bitrix\Report\VisualConstructor\Helper\Dashboard as DashboardHelper;
use Bitrix\Report\VisualConstructor\Helper\Dashboard;
use Bitrix\Report\VisualConstructor\Helper\Report;
use Bitrix\Report\VisualConstructor\Helper\Util;
use Bitrix\Report\VisualConstructor\Internal\Error\Error;
use Bitrix\Report\VisualConstructor\RuntimeProvider\ViewProvider;

/**
 * Class Widget
 * @package Bitrix\Report\VisualConstructor\Controller
 */
class Widget extends \Bitrix\Report\VisualConstructor\Controller\Base
{
	/**
	 * Action return configuration form by widget gid, and board gid.
	 *
	 * @param sting $widgetId Widget gId.
	 * @param string $boardId Board key.
	 * @return Component|bool
	 */
	public function showConfigurationFormAction($widgetId, $boardId)
	{
		$componentName = 'bitrix:report.visualconstructor.widget.form';
		$widget = \Bitrix\Report\VisualConstructor\Entity\Widget::getCurrentUserWidgetByGId($widgetId);
		if ($widget)
		{
			$templateName = '';
			$params = array(
				'MODE' => 'update',
				'ORIGINAL_WIDGET_GID' => $widgetId,
				'WIDGET' => $widget,
				'BOARD_ID' => $boardId,
				'PAGE_TITLE' => Loc::getMessage('REPORT_WIDGET_SETTINGS_CONTENT_TITLE'),
				'SAVE_BUTTON_TITLE' => Loc::getMessage('REPORT_WIDGET_SETTINGS_SAVE_BUTTON_TITLE'),
			);
			return new Component($componentName, $templateName, $params);
		}
		else
		{
			$this->addError(new Error('No widget with this id'));
			return false;
		}
	}

	/**
	 * Configuration form save handler.
	 *
	 * @param array $formParams Parameters form form to save widget configurations.
	 * @return array|bool
	 */
	public function saveConfigurationFormAction($formParams)
	{
		if (!empty($formParams['boardId']))
		{
			$boardKey = $formParams['boardId'];
		}
		else
		{
			$this->addError(new Error('Argument boardId not exist'));
			return false;
		}


		$dashboardForUser = DashboardHelper::getDashboardByKeyForCurrentUser($boardKey);

		if (!$dashboardForUser)
		{
			$this->addError(new Error('Can\'t save configuration because current user has not dashboard to edit'));
			return false;
		}

		$isPattern = false;
		if (!empty($formParams['isPattern']))
		{
			$isPattern = $formParams['isPattern'] === 'on' ? true : false;
		}

		$categoryKey = !empty($formParams['categoryKey']) ? $formParams['categoryKey']: '';

		$widgetGId = $formParams['widgetId'];
		$originalWidgetGId = $formParams['originalWidgetGId'];
		$widgetConfigurations = $formParams['widget'][$widgetGId]['configurations'];
		$reportsConfigurationsFromForm = $formParams['widget'][$widgetGId]['reports'];
		$deletedReportIds = !empty($formParams['deletedReports']) ? $formParams['deletedReports'] : array();


		if ($widgetGId !== $originalWidgetGId)
		{
			$widget = \Bitrix\Report\VisualConstructor\Entity\Widget::getCurrentUserWidgetByGId($originalWidgetGId);
		}
		else
		{
			$widget = \Bitrix\Report\VisualConstructor\Entity\Widget::getCurrentUserWidgetByGId($widgetGId);
		}

		if (!$widget)
		{
			$this->addError(new Error('Can\'t save configuration because widget with this id not exist'));
			return false;
		}
		else
		{
			if ($widgetGId !== $originalWidgetGId)
			{
				$newWidget = $this->createWidgetByParams($formParams);
				$newWidget->setWeight($widget->getWeight());
				$newWidget->setGId($widget->getGId());
				$newWidget->setRowId((int)$widget->getRowId());
				$newWidget->setCategoryKey($widget->getCategoryKey());
				$newWidget->save();

				$widget->delete();
				return array('widgetId' => $newWidget->getGId());
			}
			else
			{
				$widget->loadAttribute('reports');
				$widgetHandler = $widget->getWidgetHandler();
				$this->setConfigurableEntityConfiguration($widget, $widgetHandler, $widgetConfigurations);
				$widget->setViewKey($widget->getWidgetHandler()->getConfiguration('view_type')->getValue());
				$widget->setBoardId($boardKey);
				$widget->setCategoryKey($categoryKey);
				$widget->save();
			}
		}


		$widgetReports = $widget->getReportsGidKeyed();


		//delete reports, which mark as deleted in form
		foreach ($deletedReportIds as $deletedReportId)
		{
			if (!empty($widgetReports[$deletedReportId]))
			{
				$widgetReports[$deletedReportId]->delete();
			}
			unset($reportsConfigurationsFromForm[$deletedReportId]);
		}

		//save report configurations
		foreach ($reportsConfigurationsFromForm as $reportId => $configurationFromForm)
		{
			$configuration = $configurationFromForm['configurations'];

			if ($this->isReportPseudo($reportId))
			{
				$this->addReportToWidget($widget, $configuration);
			}
			else
			{
				$report = $widgetReports[$reportId];
				$reportHandler = $report->getReportHandler();
				$this->setConfigurableEntityConfiguration($report, $reportHandler, $configuration);
			}
		}

		$widget->save();

		if ($isPattern)
		{
			\Bitrix\Report\VisualConstructor\Helper\Widget::saveWidgetAsCurrentUserPattern($widget);
		}

		return array('widgetId' => $widget->getGId());
	}

	/**
	 * Create widget from form params action and save it;
	 *
	 * @param array $formParams Parameters from form.
	 * @return array [widgetId => 'Gid of new created widget'].
	 */
	public function addWidgetFromConfigurationFormAction($formParams)
	{
		//@TODO optimize
		$widget = $this->createWidgetByParams($formParams);

		return array('widgetId' => $widget->getGId());
	}


	/**
	 * @param $params
	 * @return \Bitrix\Report\VisualConstructor\Entity\Widget|bool
	 */
	private function createWidgetByParams($params)
	{
		$widgetGid = $params['widgetId'];

		$viewController = ViewProvider::getViewByViewKey($params['widget'][$widgetGid]['configurations']['new']['view_type']);
		if (!$viewController)
		{
			$this->addError(new Error('No such view controller.'));
			return false;
		}

		global $USER;
		$userId = $USER->getId();
		if (!$userId)
		{
			$this->addError(new Error('Can\'t create widget because current user has not id'));
			return false;
		}

		$dashboardForUser = DashboardHelper::getDashboardByKeyForCurrentUser($params['boardId']);
		if (!$dashboardForUser)
		{
			$this->addError(new Error('Can\'t create widget because current user has not board to edit'));
			return false;
		}


		$isPattern = false;
		if (!empty($params['isPattern']))
		{
			$isPattern = $params['isPattern'] === 'on' ? true : false;
		}

		$categoryKey = !empty($params['categoryKey']) ? $params['categoryKey']: '';
		$widgetHandler = $viewController->buildWidgetHandlerForBoard($params['boardId']);


		$widgetPositions = array('cell_' . rand(999, 99999));

		try
		{
			$row = \Bitrix\Report\VisualConstructor\Helper\Row::getRowDefaultEntity(array(
				'cellIds' => $widgetPositions
			));
		}
		catch (ArgumentException $e)
		{
			$this->addError(new Error($e->getMessage()));
			return false;
		}

		$dashboardForUser->addRows($row);


		/** @var \Bitrix\Report\VisualConstructor\Entity\Widget $widget */
		$widget = $widgetHandler->getWidget();
		$widget->setCategoryKey($categoryKey);
		$widget->setWeight($widgetPositions[0]);
		$widget->setOwnerId($userId);
		$widget->setGId(Util::generateUserUniqueId());
		$row->addWidgets($widget);
		$dashboardForUser->save();


		$widgetGId = $params['widgetId'];
		$widgetConfigurations = $params['widget'][$widgetGId]['configurations'];
		$reportsConfigurationsFromForm = $params['widget'][$widgetGId]['reports'];

		$widgetHandler = $widget->getWidgetHandler();
		$this->setConfigurableEntityConfiguration($widget, $widgetHandler, $widgetConfigurations);
		//save report configurations
		foreach ($reportsConfigurationsFromForm as $reportId => $configurationFromForm)
		{
			$configuration = $configurationFromForm['configurations'];

			if (in_array($reportId, $params['deletedReports']))
			{
				continue;
			}

			if ($this->isReportPseudo($reportId))
			{
				$this->addReportToWidget($widget, $configuration);
			}
		}

		if ($isPattern)
		{
			\Bitrix\Report\VisualConstructor\Helper\Widget::saveWidgetAsCurrentUserPattern($widget, $widget->getCategoryKey());
		}

		return $widget;
	}

	/**
	 * Build create or configuration form.
	 *
	 * @param array $params Parameters to create form.
	 * @return Component|bool
	 */
	public function buildFormAction($params)
	{
		$componentName = 'bitrix:report.visualconstructor.widget.form';

		$boardId = $params['boardId'];
		$mode = $params['mode'];
		try
		{
			$widget = \Bitrix\Report\VisualConstructor\Helper\Widget::constructNewPseudoWidgetByParams($params);
		}
		catch (ArgumentException $e)
		{
			$this->addError(new Error($e->getMessage()));
			return false;
		}

		$widget->setGId('pseudo_widget_for_add');
		if ($widget)
		{
			$templateName = '';
			$params = array(
				'MODE' => $mode,
				'ORIGINAL_WIDGET_GID' => $params['widgetId'],
				'WIDGET' => $widget,
				'BOARD_ID' => $boardId,
				'PAGE_TITLE' => $mode === 'create' ? Loc::getMessage('REPORT_CREATE_WIDGET_SETTINGS_CONTENT_TITLE') : Loc::getMessage('REPORT_WIDGET_SETTINGS_CONTENT_TITLE'),
				'SAVE_BUTTON_TITLE' => $mode === 'create' ? Loc::getMessage('REPORT_CREATE_WIDGET_SETTINGS_SAVE_BUTTON_TITLE') : Loc::getMessage('REPORT_WIDGET_SETTINGS_SAVE_BUTTON_TITLE'),
			);
			return new Component($componentName, $templateName, $params);
		}
		else
		{
			$this->addError(new Error('No widget with this id'));
			return false;
		}
	}

	/**
	 * This action call when try to change to other view type of existing widget.
	 * If new view key do not compatible with core view type return false, else true.
	 *
	 * @param array $params Parameters like [newViewKey => 'linearGraph', oldViewKey => 'column'].
	 * @return array|bool
	 */
	public function checkIsCompatibleWithSelectedViewAction($params)
	{
		if (!isset($params['newViewKey']))
		{
			$this->addError(new Error('new view key not exist'));
			return false;
		}

		if (!isset($params['oldViewKey']))
		{
			$this->addError(new Error('old view key not exist'));
			return false;
		}
		$newView = ViewProvider::getViewByViewKey($params['newViewKey']);
		$oldView = ViewProvider::getViewByViewKey($params['oldViewKey']);

		if (!$newView)
		{
			$this->addError(new Error('view not found with key: ' . $params['newViewKey']));
			return false;
		}

		if (!$oldView)
		{
			$this->addError(new Error('view not found with key: ' . $params['oldViewKey']));
			return false;
		}


		$result = $oldView->isCompatibleWithView($newView);
		return array('isCompatible' => $result);
	}

	/**
	 * Construct widget for show preview.
	 *
	 * @param array $params Form params will be apply in preview widget.
	 * @return array|bool
	 */
	public function constructPseudoWidgetAction($params)
	{
		try
		{
			$widget = \Bitrix\Report\VisualConstructor\Helper\Widget::constructPseudoWidgetByParams($params);
		}
		catch (ArgumentException $e)
		{
			$this->addError(new Error($e->getMessage()));
			return false;
		}

		$pseudoWidgetPreparedData = \Bitrix\Report\VisualConstructor\Helper\Widget::prepareWidgetContent($widget, true);
		$widgetConfigurationFields = $widget->getWidgetHandler()->getFormElements();
		$reports = $widget->getReports();
		$reportsResult = array();
		if ($reports)
		{
			foreach ($reports as $report)
			{
				$configurationFields = $report->getReportHandler()->getFormElements();
				$reportsResult[] = array(
					'configurationFields' => $configurationFields
				);
			}
		}

		return array(
			'widget' => array(
				'pseudoWidget' => $pseudoWidgetPreparedData,
				'configurationFields' => $widgetConfigurationFields,
			),
			'reports' => $reportsResult
		);
	}

	/**
	 * @param ConfigurableModel $model
	 * @param Base $handler
	 * @param $formConfigurations
	 */
	private function setConfigurableEntityConfiguration(ConfigurableModel $model, Base $handler, $formConfigurations)
	{
		if (!empty($formConfigurations['old']))
		{
			$keys = array_keys($formConfigurations['old']);
			$configurations = $handler->getConfigurationsGidKeyed();
			foreach ($configurations as $id => $configuration)
			{
				if (in_array($id, $keys))
				{
					$field = $handler->getFormElement($configuration->getKey());
					if ($field instanceof BaseValuable)
					{
						$newValue = $formConfigurations['old'][$id][$configuration->getKey()];
						$field->setValue($newValue);
						$configuration->setValue($field->getValue());
					}
				}
			}
		}


		if (!empty($formConfigurations['new']))
		{
			foreach ($formConfigurations['new'] as $key => $newConfiguration)
			{
				$field = $handler->getFormElement($key);
				if ($field instanceof BaseValuable)
				{
					$field->setDefaultValue($newConfiguration);
					$model->addConfigurationField($field);
				}
			}
		}
	}


	/**
	 * Check is report id is pseudo.
	 *
	 * @param string $reportId Report id.
	 * @return bool
	 */
	private function isReportPseudo($reportId)
	{
		return (strpos($reportId, '_pseudo') === 0);
	}


	/**
	 * @param $widget
	 * @param array $configuration
	 */
	private function addReportToWidget(\Bitrix\Report\VisualConstructor\Entity\Widget $widget, $configuration)
	{
		if (!empty($configuration['new']['reportHandler']))
		{
			$reportHandler = Report::buildReportHandlerForWidget($configuration['new']['reportHandler'], $widget);
			if ($reportHandler instanceof BaseReport)
			{
				foreach ($configuration['new'] as $key => $configurationValue)
				{
					$formElement = $reportHandler->getFormElementFromCollected($key);
					if ($formElement instanceof BaseValuable)
					{
						$formElement->setValue($configurationValue);
						$reportConfiguration = $reportHandler->getConfiguration($key);
						if ($reportConfiguration)
						{
							$reportConfiguration->setValue($formElement->getValue());
						}
					}
				}
				$reportHandler->getReport()->setConfigurations($reportHandler->getConfigurations());
				$widget->addReportHandler($reportHandler);
				$widget->save();
			}


		}
	}

	/**
	 * Load widget params for rendering.
	 *
	 * @param string $widgetId Widget gId.
	 * @return array|false
	 */
	public function loadAction($widgetId)
	{
		$widget = \Bitrix\Report\VisualConstructor\Entity\Widget::getCurrentUserWidgetByGId($widgetId);
		if (!$widget->getId())
		{
			$this->addError(new Error('Widget no exist'));
			return false;
		}
		$preparedWidget = \Bitrix\Report\VisualConstructor\Helper\Widget::prepareWidgetContent($widget, true);
		$preparedWidget['row'] = array(
			'id' => $widget->getRow()->getGId(),
			'layoutMap' => $widget->getRow()->getLayoutMap(),
		);
		return $preparedWidget;
	}

	/**
	 * Load widget by board Id.
	 *
	 * @param string $boardId Board id.
	 * @return array
	 */
	public function loadByBoardIdAction($boardId)
	{
		$preparedObjectForDashboard = \Bitrix\Report\VisualConstructor\Helper\Widget::prepareBoardWithEntitiesByBoardId($boardId);
		return $preparedObjectForDashboard;
	}

	/**
	 * Widget update action.
	 * Call whan save configuration form.
	 *
	 * @param string $boardKey Board key.
	 * @param string $widgetId Widget gId.
	 * @param array $params Form parameters to apply in update of widget.
	 * @return string Saved widget gId.
	 */
	public function updateAction($boardKey, $widgetId, $params)
	{
		$dashboardForUser = DashboardHelper::getDashboardByKeyForCurrentUser($boardKey);

		if (!$dashboardForUser)
		{
			$this->addError(new Error('Can\'t update widget because current user has not dashboard to edit'));
			return false;
		}

		$widget = \Bitrix\Report\VisualConstructor\Entity\Widget::getCurrentUserWidgetByGId($widgetId);
		if ($widget)
		{

			if (!empty($params['rowId']) && $params['rowId'] != $widget->getRow()->getGId())
			{
				$row = DashboardRow::getCurrentUserRowByGId($params['rowId']);

				if ($row)
				{
					$widget->setRow($row);
				}
				else
				{
					$this->addError(new Error("No row with id: " . $params['rowId']));
				}
			}

			$widget->getRow()->setLayoutMap($params['rowLayoutMap']);


			if (!empty($params['cellId']))
			{
				$widget->setWeight($params['cellId']);
			}

			$widget->save();
			return $widget->getGId();
		}
		else
		{
			$this->addError(new Error("No widget with id: " . $widgetId));
			return null;
		}

	}

	/**
	 * Remove widget from board action.
	 *
	 * @param array $params Parameters like [boardId => 'some_board_id', widgetId => 'some_widget_gId'].
	 * @return bool
	 */
	public function removeAction($params)
	{
		$boardKey = $params['boardId'];
		$widgetId = $params['widgetId'];
		$dashboardForUser = DashboardHelper::getDashboardByKeyForCurrentUser($boardKey);

		if ($dashboardForUser)
		{
			$deleteWidgetId = \Bitrix\Report\VisualConstructor\Entity\Widget::removeCurrentUserWidgetByGId($widgetId);
			return $deleteWidgetId;
		}
		else
		{
			$this->addError(new Error('Cant delete row because current user has not own dashboard'));
			return false;
		}

	}

	/**
	 * Remove pattern widget.
	 * Delete only current user pattern widget.
	 *
	 * @param string $widgetId Widget id.
	 * @return void
	 */
	public function removePatternAction($widgetId)
	{
		global $USER;
		$filter = Query::filter();
		$filter->where('GID', $widgetId);
		$filter->where('OWNER_ID', $USER->getId());
		$filter->where('IS_PATTERN', true);
		$widget = \Bitrix\Report\VisualConstructor\Entity\Widget::load($filter);

		if ($widget->getOwnerId() === $USER->getId())
		{
			$widget->deletePatternWidget();
		}
	}


}

Zerion Mini Shell 1.0