lovata/oc-toolbox-plugin

View on GitHub
classes/helper/PageHelper.php

Summary

Maintainability
B
4 hrs
Test Coverage
<?php namespace Lovata\Toolbox\Classes\Helper;
 
use Cms\Classes\Theme;
use Cms\Classes\Page as CmsPage;
use System\Classes\PluginManager;
 
use October\Rain\Support\Traits\Singleton;
 
/**
* Class PageHelper
* @package Lovata\Toolbox\Classes\Helper
* @author Andrey Kharanenka, a.khoronenko@lovata.com, LOVATA Group
*/
class PageHelper
{
use Singleton;
 
/** @var */
protected $obTheme;
 
/** @var array|CmsPage[] */
protected $arPageList = [];
 
/** @var CmsPage[] */
protected $arPageNameList;
 
/** @var array */
protected $arCachedData = [];
 
/**
* Get component list with URL params for page
* @param string $sPageCode
* @param string $sComponentName
* @param string $sParamName
* @param bool $bFindWildcard
*
* @return array
*/
Function `getUrlParamList` has a Cognitive Complexity of 21 (exceeds 5 allowed). Consider refactoring.
Method `getUrlParamList` has 33 lines of code (exceeds 25 allowed). Consider refactoring.
The method getUrlParamList() has an NPath complexity of 876. The configured NPath complexity threshold is 200.
The method getUrlParamList() has a Cyclomatic Complexity of 14. The configured cyclomatic complexity threshold is 10.
Reduce the number of returns of this function 4, down to the maximum allowed 3.
Refactor this function to reduce its Cognitive Complexity from 17 to the 15 allowed.
public function getUrlParamList($sPageCode, $sComponentName, $sParamName = 'slug', $bFindWildcard = false)
{
$sCacheKey = implode('_', [$sPageCode, $sComponentName, $sParamName, (int) $bFindWildcard]);
if ($this->hasCache($sCacheKey)) {
return $this->getCachedData($sCacheKey);
}
 
$arResult = [];
if (empty($sPageCode) || empty($sParamName)) {
return $arResult;
}
 
//Get component list
$arComponentList = $this->getFullComponentList($sPageCode);
if (empty($arComponentList)) {
return $arResult;
}
 
foreach ($arComponentList as $sKey => $arPropertyList) {
if (!empty($sComponentName) && !preg_match('%^'.$sComponentName.'%', $sKey)) {
continue;
}
 
if (empty($arPropertyList) || !isset($arPropertyList[$sParamName])) {
continue;
}
 
/*
* Extract the routing parameter name
Remove this commented out code.
* eg: {{ :someRouteParam }}
*/
if (!preg_match('/^\{\{([^\}]+)\}\}$/', $arPropertyList['slug'], $arMatches)) {
continue;
}
 
$sValue = trim($arMatches[1]);
$sValue = ltrim($sValue, ':');
 
if ($bFindWildcard && array_get($arPropertyList, 'has_wildcard')) {
$arResult = [$sValue];
break;
} elseif (!$bFindWildcard) {
$arResult[] = $sValue;
}
}
 
$this->setCachedData($sCacheKey, $arResult);
 
return $arResult;
}
 
/**
* Get array with names of pages
* @return array
*/
public function getPageNameList()
{
if (!empty($this->arPageNameList)) {
return $this->arPageNameList;
}
 
$arResult = [];
 
//Get page list
$obPageList = $this->getPageList();
if (empty($obPageList)) {
return $arResult;
}
 
//Process page list
foreach ($obPageList as $obPage) {
$arResult[$obPage->id] = $obPage->title;
}
 
$this->arPageNameList = $arResult;
 
return $arResult;
}
 
/**
* Init class data
*/
protected function init()
{
$this->obTheme = Theme::getActiveTheme();
}
 
/**
* Get component list for page
* @param string $sPageCode
*
* @return array
*/
protected function getFullComponentList($sPageCode)
{
if ($this->hasCache($sPageCode)) {
return $this->getCachedData($sPageCode);
}
 
//Get page object
$obPage = $this->getPageObject($sPageCode);
if (empty($obPage) || empty($obPage->settings) || !isset($obPage->settings['components'])) {
return [];
}
 
//Get component list
$arPageComponentList = $obPage->settings['components'];
$this->setCachedData($sPageCode, $arPageComponentList);
 
return $arPageComponentList;
}
 
/**
* Get page object
* @param string $sPageCode
* @return CmsPage|null
*/
protected function getPageObject($sPageCode)
{
if (isset($this->arPageList[$sPageCode])) {
return $this->arPageList[$sPageCode];
}
 
if (empty($sPageCode) || empty($this->obTheme)) {
return null;
}
 
$this->arPageList[$sPageCode] = CmsPage::loadCached($this->obTheme, $sPageCode);
 
return $this->arPageList[$sPageCode];
}
 
/**
* Get cached data
* @param string $sKey
* @return mixed|null
*/
protected function getCachedData($sKey)
{
if (isset($this->arCachedData[$sKey])) {
return $this->arCachedData[$sKey];
}
 
return null;
}
 
/**
* Set cached data
* @param string $sKey
* @param mixed $obValue
*/
protected function setCachedData($sKey, $obValue)
{
$this->arCachedData[$sKey] = $obValue;
}
 
/**
* @param string $sKey
* @return bool
*/
protected function hasCache($sKey)
{
return isset($this->arCachedData[$sKey]);
}
 
/**
* Get page list
* @return array|\Cms\Classes\CmsObjectCollection|CmsPage[]|null
*/
protected function getPageList()
{
//Get CMS page list
$obPageList = $this->getCmsPageList();
 
//Get static page list
$obStaticPageList = $this->getStaticPageList();
if (!empty($obStaticPageList)) {
if (empty($obPageList)) {
return $obStaticPageList;
}
 
$obPageList = $obPageList->merge($obStaticPageList->all());
}
 
return $obPageList;
}
 
/**
* @return \Cms\Classes\CmsObjectCollection|\Cms\Classes\Page[]|null
*/
protected function getCmsPageList()
{
if (empty($this->obTheme)) {
return null;
}
 
//Get CMS page list
/** @var \Cms\Classes\CmsObjectCollection|\Cms\Classes\Page[] $obPageList */
$obPageList = CmsPage::listInTheme($this->obTheme, true);
 
return $obPageList;
}
 
/**
* Get Static page list
* @return array|\Cms\Classes\CmsObjectCollection|CmsPage[]|null
*/
protected function getStaticPageList()
{
if (!PluginManager::instance()->hasPlugin('RainLab.Pages') || empty($this->obTheme)) {
return null;
}
 
//Get Static page list
/** @var \Cms\Classes\CmsObjectCollection|\Cms\Classes\Page[] $obStaticPageList */
$obStaticPage = new \RainLab\Pages\Classes\PageList($this->obTheme);
$obStaticPageList = $obStaticPage->listPages(true);
 
return $obStaticPageList;
}
}