lovata/oc-toolbox-plugin

View on GitHub
models/CommonProperty.php

Summary

Maintainability
C
1 day
Test Coverage
File `CommonProperty.php` has 316 lines of code (exceeds 250 allowed). Consider refactoring.
<?php namespace Lovata\Toolbox\Models;
 
use Lang;
use Backend\Models\ImportModel;
use October\Rain\Database\Traits\Validation;
use October\Rain\Database\Traits\Sortable;
 
use Kharanenka\Scope\TypeField;
use Kharanenka\Scope\SlugField;
use Kharanenka\Scope\ActiveField;
use Kharanenka\Scope\CodeField;
use Kharanenka\Scope\NameField;
 
/**
* Class CommonProperty
* @package Lovata\Toolbox\Models
* @author Andrey Kharanenka, a.khoronenko@lovata.com, LOVATA Group
*
* @mixin \October\Rain\Database\Builder
* @mixin \Eloquent
*
* @property $id
* @property bool $active
* @property string $name
* @property string $code
* @property string $slug
* @property string $type (input, textarea, select, checkbox)
* @property array $settings
* @property string $description
* @property int $sort_order
*
* @property \October\Rain\Argon\Argon $created_at
* @property \October\Rain\Argon\Argon $updated_at
*/
The class CommonProperty has an overall complexity of 57 which is very high. The configured complexity threshold is 50.
`CommonProperty` has 22 functions (exceeds 20 allowed). Consider refactoring.
Class "CommonProperty" has 22 methods, which is greater than 20 authorized. Split it into smaller classes.
class CommonProperty extends ImportModel
{
const NAME = 'property';
 
use Validation;
use Sortable;
use ActiveField;
use NameField;
use CodeField;
use SlugField;
use TypeField;
 
const TYPE_INPUT = 'input';
const TYPE_NUMBER = 'number';
const TYPE_TEXT_AREA = 'textarea';
const TYPE_RICH_EDITOR = 'rich_editor';
const TYPE_SINGLE_CHECKBOX = 'single_checkbox';
const TYPE_SWITCH = 'switch';
const TYPE_CHECKBOX = 'checkbox';
const TYPE_BALLOON = 'balloon_selector';
const TYPE_TAG_LIST = 'tag_list';
const TYPE_SELECT = 'select';
const TYPE_RADIO = 'radio';
const TYPE_DATE = 'date';
const TYPE_COLOR_PICKER = 'colorpicker';
const TYPE_MEDIA_FINDER = 'mediafinder';
 
public $table = null;
 
public $implement = [
'@RainLab.Translate.Behaviors.TranslatableModel',
];
 
public $translatable = ['name', 'description'];
 
public $rules = [];
 
public $dates = ['created_at', 'updated_at'];
public $jsonable = ['settings'];
 
public $attachOne = [
'import_file' => [\System\Models\File::class, 'public' => false],
];
 
/**
* Get widget data
* @return array
*/
Function `getWidgetData` has a Cognitive Complexity of 16 (exceeds 5 allowed). Consider refactoring.
Method `getWidgetData` has 52 lines of code (exceeds 25 allowed). Consider refactoring.
The method getWidgetData() has a Cyclomatic Complexity of 16. The configured cyclomatic complexity threshold is 10.
public function getWidgetData()
{
$arResult = [];
 
switch ($this->type) {
case self::TYPE_INPUT:
$arResult = $this->getInputFieldSettings();
break;
case self::TYPE_NUMBER:
$arResult = $this->getNumberFieldSettings();
break;
case self::TYPE_TEXT_AREA:
$arResult = $this->getTextareaFieldSettings();
break;
case self::TYPE_RICH_EDITOR:
$arResult = $this->getRichEditorFieldSettings();
break;
case self::TYPE_SINGLE_CHECKBOX:
$arResult = $this->getSingleCheckboxFieldSettings();
break;
case self::TYPE_SWITCH:
$arResult = $this->getSwitchFieldSettings();
break;
case self::TYPE_CHECKBOX:
$arResult = $this->getCheckboxListSettings();
break;
case self::TYPE_BALLOON:
$arResult = $this->getBalloonSettings();
break;
case self::TYPE_TAG_LIST:
$arResult = $this->getTagListSettings();
break;
case self::TYPE_SELECT:
$arResult = $this->getSelectSettings();
break;
case self::TYPE_RADIO:
$arResult = $this->getRadioSettings();
break;
case self::TYPE_DATE:
$arResult = $this->getDateSettings();
break;
case self::TYPE_COLOR_PICKER:
$arResult = $this->getColorPickerSettings();
break;
/** FILE FINDER TYPE */
case self::TYPE_MEDIA_FINDER:
$arResult = $this->getMediaFinderSettings();
break;
default:
return $arResult;
}
 
//Get common widget settings
if (empty($arResult)) {
return $arResult;
}
 
$arResult = array_merge($arResult, $this->getDefaultConfigSettings());
 
return $arResult;
}
 
/**
* Get property variants from settings
* @return array
*/
Function `getPropertyVariants` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.
public function getPropertyVariants()
{
$arValueList = [];
 
//Get and check settings array
$arSettings = $this->settings;
if (empty($arSettings) || !isset($arSettings['list']) || empty($arSettings['list'])) {
return $arValueList;
}
 
//Get property value variants
foreach ($arSettings['list'] as $arValue) {
Define a constant instead of duplicating this literal "value" 4 times.
if (!isset($arValue['value']) || empty($arValue['value'])) {
continue;
}
 
$arValueList[$arValue['value']] = $arValue['value'];
}
 
natsort($arValueList);
 
return $arValueList;
}
 
/**
* Check, property is translatable flag
* @return bool
*/
public function isTranslatable()
{
return (bool) $this->getSettingValue('is_translatable');
}
 
/**
* Get type list
* @return array
*/
public function getTypeOptions()
{
$sLangPath = 'lovata.toolbox::lang.type.';
 
return [
self::TYPE_INPUT => Lang::get($sLangPath.self::TYPE_INPUT),
self::TYPE_NUMBER => Lang::get($sLangPath.self::TYPE_NUMBER),
self::TYPE_TEXT_AREA => Lang::get($sLangPath.self::TYPE_TEXT_AREA),
self::TYPE_RICH_EDITOR => Lang::get($sLangPath.self::TYPE_RICH_EDITOR),
self::TYPE_SINGLE_CHECKBOX => Lang::get($sLangPath.self::TYPE_SINGLE_CHECKBOX),
self::TYPE_SWITCH => Lang::get($sLangPath.self::TYPE_SWITCH),
self::TYPE_CHECKBOX => Lang::get($sLangPath.self::TYPE_CHECKBOX),
self::TYPE_TAG_LIST => Lang::get($sLangPath.self::TYPE_TAG_LIST),
self::TYPE_SELECT => Lang::get($sLangPath.self::TYPE_SELECT),
self::TYPE_RADIO => Lang::get($sLangPath.self::TYPE_RADIO),
self::TYPE_BALLOON => Lang::get($sLangPath.self::TYPE_BALLOON),
self::TYPE_DATE => Lang::get($sLangPath.self::TYPE_DATE),
self::TYPE_COLOR_PICKER => Lang::get($sLangPath.self::TYPE_COLOR_PICKER),
self::TYPE_MEDIA_FINDER => Lang::get($sLangPath.self::TYPE_MEDIA_FINDER),
];
}
 
/**
* Import item list from CSV file
* @param array $arElementList
* @param null $sSessionKey
* @throws \Throwable
*/
Avoid unused parameters such as '$arElementList'.
Avoid unused parameters such as '$sSessionKey'.
public function importData($arElementList, $sSessionKey = null)
{
}
 
/**
* Get field setting with type "text"
* @return array
*/
protected function getInputFieldSettings() : array
{
$arResult = [
'type' => 'text',
];
 
if ($this->isTranslatable()) {
$arResult = $this->addTranslatable($arResult);
}
 
return $arResult;
}
 
/**
* Get field setting with type "number"
* @return array
*/
protected function getNumberFieldSettings() : array
{
$arResult = [
'type' => 'number',
];
 
return $arResult;
}
 
/**
* Get field setting with type "textarea"
* @return array
*/
protected function getTextareaFieldSettings() : array
{
$arResult = [
'type' => 'textarea',
'size' => 'large',
];
 
if ($this->isTranslatable()) {
$arResult = $this->addTranslatable($arResult);
}
 
return $arResult;
}
 
/**
* Get field setting with type "rich editor"
* @return array
*/
protected function getRichEditorFieldSettings() : array
{
$arResult = [
'type' => 'richeditor',
'size' => 'large',
];
 
if ($this->isTranslatable()) {
$arResult = $this->addTranslatable($arResult);
}
 
return $arResult;
}
 
/**
* Get field setting with type "checkbox"
* @return array
*/
protected function getSingleCheckboxFieldSettings() : array
{
$arResult = [
'type' => 'checkbox',
];
 
return $arResult;
}
 
/**
* Get field setting with type "switch"
* @return array
*/
protected function getSwitchFieldSettings() : array
{
$arResult = [
'type' => 'switch',
];
 
return $arResult;
}
 
/**
* Get field setting with type "checkbox list"
* @return array
*/
protected function getCheckboxListSettings() : array
{
//Get property variants
$arValueList = $this->getPropertyVariants();
if (empty($arValueList)) {
return [];
}
 
$arResult = [
'type' => 'checkboxlist',
Define a constant instead of duplicating this literal "options" 5 times.
'options' => $arValueList,
];
 
return $arResult;
}
 
/**
* Get field setting with type "balloon-selector"
* @return array
*/
protected function getBalloonSettings() : array
{
//Get property variants
$arValueList = $this->getPropertyVariants();
if (empty($arValueList)) {
return [];
}
 
$arResult = [
'type' => 'balloon-selector',
'options' => $arValueList,
];
 
return $arResult;
}
 
/**
* Get field setting with type "tag list"
* @return array
*/
protected function getTagListSettings() : array
{
//Get property variants
$arValueList = $this->getPropertyVariants();
if (empty($arValueList)) {
return [];
}
 
$arResult = [
'type' => 'taglist',
'options' => $arValueList,
];
 
return $arResult;
}
 
/**
* Get field setting with type "select"
* @return array
*/
protected function getSelectSettings() : array
{
//Get property variants
$arValueList = $this->getPropertyVariants();
if (empty($arValueList)) {
return [];
}
 
$arResult = [
'type' => 'dropdown',
'emptyOption' => 'lovata.toolbox::lang.field.empty',
'options' => $arValueList,
];
 
return $arResult;
}
 
/**
* Get field setting with type "radio"
* @return array
*/
protected function getRadioSettings() : array
{
//Get property variants
$arValueList = $this->getPropertyVariants();
if (empty($arValueList)) {
return [];
}
 
$arResult = [
'type' => 'radio',
'options' => $arValueList,
];
 
return $arResult;
}
 
/**
* Get field setting with type "date"
* @return array
*/
protected function getDateSettings() : array
{
$sMode = $this->getSettingValue('datepicker');
if (!in_array($sMode, ['date', 'time', 'datetime'])) {
return [];
}
 
$arResult = [
'type' => 'datepicker',
'mode' => $sMode,
];
 
return $arResult;
}
 
/**
* Get field setting with type "color picker"
* @return array
*/
protected function getColorPickerSettings() : array
{
$arResult = [
'type' => self::TYPE_COLOR_PICKER,
];
 
return $arResult;
}
 
/**
* Get field setting with type "media finder"
* @return array
*/
protected function getMediaFinderSettings() : array
{
$sMode = $this->getSettingValue(self::TYPE_MEDIA_FINDER);
if (!in_array($sMode, ['file', 'image'])) {
return [];
}
 
$arResult = [
'type' => self::TYPE_MEDIA_FINDER,
'mode' => $sMode,
];
 
return $arResult;
}
 
/**
* Get default config field settings
* @return array
*/
protected function getDefaultConfigSettings() : array
{
$arResult = [
'tab' => 'lovata.toolbox::lang.tab.properties',
'span' => 'left',
'label' => $this->name,
'comment' => $this->description,
];
 
//Get property tab
$sTabName = $this->getSettingValue('tab');
if (!empty($sTabName)) {
$arResult['tab'] = $sTabName;
}
 
return $arResult;
}
/**
* Get property settings value
* @param string $sKey
* @return mixed|null
*/
protected function getSettingValue($sKey)
{
$arSettings = $this->settings;
if (empty($sKey) || empty($arSettings) || !isset($arSettings[$sKey])) {
return null;
}
 
return $arSettings[$sKey];
}
 
/**
* Add translatable parameter to field config
* @param $arConfig
* @return array
*/
protected function addTranslatable($arConfig) : array
{
$arConfig['translatable'] = true;
 
return $arConfig;
}
}