![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/cartforge.co/vendor/magento/module-backend/Block/Dashboard/ |
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ declare(strict_types=1); namespace Magento\Backend\Block\Dashboard; /** * Adminhtml dashboard google chart block * @deprecated dashboard graphs were migrated to dynamic chart.js solution * @see dashboard.chart.amounts and dashboard.chart.orders in adminhtml_dashboard_index.xml * * @author Magento Core Team <[email protected]> */ class Graph extends \Magento\Backend\Block\Dashboard\AbstractDashboard { const API_URL = 'https://image-charts.com/chart'; /** * All series * * @var array */ protected $_allSeries = []; /** * Axis labels * * @var array */ protected $_axisLabels = []; /** * Axis maps * * @var array */ protected $_axisMaps = []; /** * Data rows * * @var array */ protected $_dataRows = []; /** * Simple encoding chars * * @var string */ protected $_simpleEncoding = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; /** * Extended encoding chars * * @var string */ protected $_extendedEncoding = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-.'; /** * Chart width * * @var string */ protected $_width = '780'; /** * Chart height * * @var string */ protected $_height = '384'; /** * Google chart api data encoding * * @deprecated 101.0.2 since the Google Image Charts API not accessible from March 14, 2019 * @var string */ protected $_encoding = 'e'; /** * Html identifier * * @var string */ protected $_htmlId = ''; /** * @var string */ protected $_template = 'Magento_Backend::dashboard/graph.phtml'; /** * Adminhtml dashboard data * * @var \Magento\Backend\Helper\Dashboard\Data */ protected $_dashboardData = null; /** * @param \Magento\Backend\Block\Template\Context $context * @param \Magento\Reports\Model\ResourceModel\Order\CollectionFactory $collectionFactory * @param \Magento\Backend\Helper\Dashboard\Data $dashboardData * @param array $data */ public function __construct( \Magento\Backend\Block\Template\Context $context, \Magento\Reports\Model\ResourceModel\Order\CollectionFactory $collectionFactory, \Magento\Backend\Helper\Dashboard\Data $dashboardData, array $data = [] ) { parent::__construct($context, $collectionFactory, $data); $this->_dashboardData = $dashboardData; } /** * Get tab template * * @return string */ protected function _getTabTemplate() { return 'dashboard/graph.phtml'; } /** * Set data rows * * @param string $rows * @return void */ public function setDataRows($rows) { $this->_dataRows = (array)$rows; } /** * Add series * * @param string $seriesId * @param array $options * @return void */ public function addSeries($seriesId, array $options) { $this->_allSeries[$seriesId] = $options; } /** * Get series * * @param string $seriesId * @return array|bool */ public function getSeries($seriesId) { if (isset($this->_allSeries[$seriesId])) { return $this->_allSeries[$seriesId]; } return false; } /** * Get all series * * @return array */ public function getAllSeries() { return $this->_allSeries; } /** * Get chart url * * @param bool $directUrl * @return string * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) * @SuppressWarnings(PHPMD.UnusedLocalVariable) */ public function getChartUrl($directUrl = true) { $params = [ 'cht' => 'lc', 'chls' => '7', 'chf' => 'bg,s,f4f4f4|c,lg,90,ffffff,0.1,ededed,0', 'chm' => 'B,f4d4b2,0,0,0', 'chco' => 'db4814', 'chxs' => '0,0,11|1,0,11', 'chma' => '15,15,15,15' ]; $this->_allSeries = $this->getRowsData($this->_dataRows); foreach ($this->_axisMaps as $axis => $attr) { $this->setAxisLabels($axis, $this->getRowsData($attr, true)); } $timezoneLocal = $this->_localeDate->getConfigTimezone(); /** @var \DateTime $dateStart */ /** @var \DateTime $dateEnd */ list($dateStart, $dateEnd) = $this->_collectionFactory->create()->getDateRange( $this->getDataHelper()->getParam('period'), '', '', true ); $dateStart->setTimezone(new \DateTimeZone($timezoneLocal)); $dateEnd->setTimezone(new \DateTimeZone($timezoneLocal)); if ($this->getDataHelper()->getParam('period') == '24h') { $dateEnd->modify('-1 hour'); } else { $dateEnd->setTime(23, 59, 59); $dateStart->setTime(0, 0, 0); } $dates = []; $datas = []; while ($dateStart <= $dateEnd) { switch ($this->getDataHelper()->getParam('period')) { case '7d': case '1m': $d = $dateStart->format('Y-m-d'); $dateStart->modify('+1 day'); break; case '1y': case '2y': $d = $dateStart->format('Y-m'); $dateStart->modify('first day of next month'); break; default: $d = $dateStart->format('Y-m-d H:00'); $dateStart->modify('+1 hour'); } foreach ($this->getAllSeries() as $index => $serie) { if (in_array($d, $this->_axisLabels['x'])) { $datas[$index][] = (double)array_shift($this->_allSeries[$index]); } else { $datas[$index][] = 0; } } $dates[] = $d; } /** * setting skip step */ if (count($dates) > 8 && count($dates) < 15) { $c = 1; } else { if (count($dates) >= 15) { $c = 2; } else { $c = 0; } } /** * skipping some x labels for good reading */ $i = 0; foreach ($dates as $k => $d) { if ($i == $c) { $dates[$k] = $d; $i = 0; } else { $dates[$k] = ''; $i++; } } $this->_axisLabels['x'] = $dates; $this->_allSeries = $datas; // Image-Charts Awesome data format values $params['chd'] = "a:"; $dataDelimiter = ","; $dataSetdelimiter = "|"; $dataMissing = "_"; // process each string in the array, and find the max length $localmaxvalue = [0]; $localminvalue = [0]; foreach ($this->getAllSeries() as $index => $serie) { $localmaxvalue[$index] = max($serie); $localminvalue[$index] = min($serie); } $maxvalue = max($localmaxvalue); $minvalue = min($localminvalue); // default values $miny = 0; $maxy = 0; $yorigin = 0; $xAxis = 'x'; $xAxisIndex = 0; $yAxisIndex = 1; if ($minvalue >= 0 && $maxvalue >= 0) { if ($maxvalue > 10) { $p = pow(10, $this->_getPow((int)$maxvalue)); $maxy = ceil($maxvalue / $p) * $p; $yRange = "$yAxisIndex,$miny,$maxy,$p"; } else { $maxy = ceil($maxvalue + 1); $yRange = "$yAxisIndex,$miny,$maxy,1"; } $params['chxr'] = $yRange; $yorigin = 0; } $chartdata = []; foreach ($this->getAllSeries() as $index => $serie) { $thisdataarray = $serie; $count = count($thisdataarray); for ($j = 0; $j < $count; $j++) { $currentvalue = $thisdataarray[$j]; if (is_numeric($currentvalue)) { $ylocation = $yorigin + $currentvalue; $chartdata[] = $ylocation . $dataDelimiter; } else { $chartdata[] = $dataMissing . $dataDelimiter; } } $chartdata[] = $dataSetdelimiter; } $buffer = implode('', $chartdata); $buffer = rtrim($buffer, $dataSetdelimiter); $buffer = rtrim($buffer, $dataDelimiter); $buffer = str_replace($dataDelimiter . $dataSetdelimiter, $dataSetdelimiter, $buffer); $params['chd'] .= $buffer; if (count($this->_axisLabels) > 0) { $params['chxt'] = implode(',', array_keys($this->_axisLabels)); $this->formatAxisLabelDate($xAxis, (string)$timezoneLocal); $customAxisLabels = $xAxisIndex . ":|" . implode('|', $this->_axisLabels[$xAxis]); $params['chxl'] = $customAxisLabels . $dataSetdelimiter; } // chart size $params['chs'] = $this->getWidth() . 'x' . $this->getHeight(); // return the encoded data if ($directUrl) { $p = []; foreach ($params as $name => $value) { $p[] = $name . '=' . urlencode($value); } return (string)self::API_URL . '?' . implode('&', $p); } $gaData = urlencode(base64_encode(json_encode($params))); $gaHash = $this->_dashboardData->getChartDataHash($gaData); $params = ['ga' => $gaData, 'h' => $gaHash]; return $this->getUrl('adminhtml/*/tunnel', ['_query' => $params]); } /** * Format dates for axis labels * * @param string $idx * @param string $timezoneLocal * * @return void */ private function formatAxisLabelDate($idx, $timezoneLocal) { foreach ($this->_axisLabels[$idx] as $_index => $_label) { if ($_label != '') { $period = new \DateTime($_label, new \DateTimeZone($timezoneLocal)); switch ($this->getDataHelper()->getParam('period')) { case '24h': $this->_axisLabels[$idx][$_index] = $this->_localeDate->formatDateTime( $period->setTime((int)$period->format('H'), 0, 0), \IntlDateFormatter::NONE, \IntlDateFormatter::SHORT ); break; case '7d': case '1m': $this->_axisLabels[$idx][$_index] = $this->_localeDate->formatDateTime( $period, \IntlDateFormatter::SHORT, \IntlDateFormatter::NONE ); break; case '1y': case '2y': $this->_axisLabels[$idx][$_index] = date('m/Y', strtotime($_label)); break; } } else { $this->_axisLabels[$idx][$_index] = ''; } } } /** * Get rows data * * @param array $attributes * @param bool $single * @return array */ protected function getRowsData($attributes, $single = false) { $items = $this->getCollection()->getItems(); $options = []; foreach ($items as $item) { if ($single) { $options[] = max(0, $item->getData($attributes)); } else { foreach ((array)$attributes as $attr) { $options[$attr][] = max(0, $item->getData($attr)); } } } return $options; } /** * Set axis labels * * @param string $axis * @param array $labels * @return void */ public function setAxisLabels($axis, $labels) { $this->_axisLabels[$axis] = $labels; } /** * Set html id * * @param string $htmlId * @return void */ public function setHtmlId($htmlId) { $this->_htmlId = $htmlId; } /** * Get html id * * @return string */ public function getHtmlId() { return $this->_htmlId; } /** * Return pow * * @param int $number * @return int */ protected function _getPow($number) { $pow = 0; while ($number >= 10) { $number = $number / 10; $pow++; } return $pow; } /** * Return chart width * * @return string */ protected function getWidth() { return $this->_width; } /** * Return chart height * * @return string */ protected function getHeight() { return $this->_height; } /** * Sets data helper * * @param \Magento\Backend\Helper\Dashboard\AbstractDashboard $dataHelper * @return void */ public function setDataHelper(\Magento\Backend\Helper\Dashboard\AbstractDashboard $dataHelper) { $this->_dataHelper = $dataHelper; } /** * Prepare chart data * * @return void */ protected function _prepareData() { if ($this->_dataHelper !== null) { $availablePeriods = array_keys($this->_dashboardData->getDatePeriods()); $period = $this->getRequest()->getParam('period'); $this->getDataHelper()->setParam( 'period', $period && in_array($period, $availablePeriods) ? $period : '24h' ); } } }