| Total Complexity | 55 |
| Total Lines | 280 |
| Duplicated Lines | 0 % |
| Changes | 1 | ||
| Bugs | 0 | Features | 0 |
Complex classes like ArtistsHandler often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use ArtistsHandler, and based on these observations, apply Extract Interface, too.
| 1 | <?php declare(strict_types=1); |
||
| 16 | class ArtistsHandler extends \XoopsPersistableObjectHandler |
||
| 17 | { |
||
| 18 | /** |
||
| 19 | * ArtistsHandler constructor. |
||
| 20 | * @param \XoopsDatabase $db |
||
| 21 | */ |
||
| 22 | public function __construct(XoopsDatabase $db) |
||
| 23 | { |
||
| 24 | parent::__construct($db, 'songlist_artists', Artists::class, 'aid', 'name'); |
||
| 25 | } |
||
| 26 | |||
| 27 | /** |
||
| 28 | * @return array |
||
| 29 | */ |
||
| 30 | public function filterFields(): array |
||
| 31 | { |
||
| 32 | return ['aid', 'cids', 'singer', 'name', 'albums', 'songs', 'hits', 'rank', 'votes', 'created', 'updated']; |
||
| 33 | } |
||
| 34 | |||
| 35 | /** |
||
| 36 | * @param $filter |
||
| 37 | * @return \CriteriaCompo |
||
| 38 | */ |
||
| 39 | public function getFilterCriteria($filter): CriteriaCompo |
||
| 40 | { |
||
| 41 | $parts = \explode('|', $filter); |
||
| 42 | $criteria = new CriteriaCompo(); |
||
| 43 | foreach ($parts as $part) { |
||
| 44 | $var = \explode(',', $part); |
||
| 45 | if (!empty($var[1]) && !\is_numeric($var[0])) { |
||
| 46 | $object = $this->create(); |
||
| 47 | if (\XOBJ_DTYPE_TXTBOX == $object->vars[$var[0]]['data_type'] |
||
| 48 | || \XOBJ_DTYPE_TXTAREA == $object->vars[$var[0]]['data_type']) { |
||
| 49 | $criteria->add(new Criteria('`' . $var[0] . '`', '%' . $var[1] . '%', ($var[2] ?? 'LIKE'))); |
||
| 50 | } elseif (in_array($object->vars[$var[0]]['data_type'], [XOBJ_DTYPE_INT, XOBJ_DTYPE_DECIMAL, XOBJ_DTYPE_FLOAT])) { |
||
| 51 | $criteria->add(new Criteria('`' . $var[0] . '`', $var[1], ($var[2] ?? '='))); |
||
| 52 | } elseif (\XOBJ_DTYPE_ENUM == $object->vars[$var[0]]['data_type']) { |
||
| 53 | $criteria->add(new Criteria('`' . $var[0] . '`', $var[1], ($var[2] ?? '='))); |
||
| 54 | } elseif (\XOBJ_DTYPE_ARRAY == $object->vars[$var[0]]['data_type']) { |
||
| 55 | $criteria->add(new Criteria('`' . $var[0] . '`', '%"' . $var[1] . '";%', ($var[2] ?? 'LIKE'))); |
||
| 56 | } |
||
| 57 | } elseif (!empty($var[1]) && \is_numeric($var[0])) { |
||
| 58 | $criteria->add(new Criteria($var[0], $var[1])); |
||
| 59 | } |
||
| 60 | } |
||
| 61 | |||
| 62 | return $criteria; |
||
| 63 | } |
||
| 64 | |||
| 65 | /** |
||
| 66 | * @param $filter |
||
| 67 | * @param $field |
||
| 68 | * @param string $sort |
||
| 69 | * @param string $op |
||
| 70 | * @param string $fct |
||
| 71 | * @return string |
||
| 72 | */ |
||
| 73 | public function getFilterForm($filter, $field, $sort = 'created', $op = 'dashboard', $fct = 'list'): string |
||
| 81 | } |
||
| 82 | |||
| 83 | /** |
||
| 84 | * @param bool $force |
||
| 85 | * @param null $object |
||
|
|
|||
| 86 | * @return bool|mixed |
||
| 87 | */ |
||
| 88 | public function insert(\XoopsObject $obj, $force = true, $object = null) |
||
| 160 | } |
||
| 161 | |||
| 162 | public $_objects = ['object' => [], 'array' => []]; |
||
| 163 | |||
| 164 | /** |
||
| 165 | * @param null $id |
||
| 166 | * @param null $fields |
||
| 167 | * @return \XoopsObject |
||
| 168 | */ |
||
| 169 | public function get($id = null, $fields = null): \XoopsObject//get($id, $fields = '*') |
||
| 170 | { |
||
| 171 | $fields = $fields ?: '*'; |
||
| 172 | if (!isset($this->_objects['object'][$id])) { |
||
| 173 | $this->_objects['object'][$id] = parent::get($id, $fields); |
||
| 174 | if (!isset($GLOBALS['songlistAdmin']) && \is_object($this->_objects['object'][$id])) { |
||
| 175 | $sql = 'UPDATE `' . $this->table . '` set hits=hits+1 where `' . $this->keyName . '` = ' . $this->_objects['object'][$id]->getVar($this->keyName); |
||
| 176 | $GLOBALS['xoopsDB']->queryF($sql); |
||
| 177 | } |
||
| 178 | } |
||
| 179 | |||
| 180 | return $this->_objects['object'][$id]; |
||
| 181 | } |
||
| 182 | |||
| 183 | /** |
||
| 184 | * @param \CriteriaElement|\CriteriaCompo $criteria |
||
| 185 | * @param bool $id_as_key |
||
| 186 | * @param bool $as_object |
||
| 187 | * @return array |
||
| 188 | */ |
||
| 189 | public function &getObjects($criteria = null, $id_as_key = false, $as_object = true): array |
||
| 215 | } |
||
| 216 | |||
| 217 | /** |
||
| 218 | * @return string |
||
| 219 | */ |
||
| 220 | public function getURL(): string |
||
| 221 | { |
||
| 222 | global $file, $op, $fct, $id, $value, $gid, $vid, $cid, $start, $limit; |
||
| 223 | if ($GLOBALS['songlistModuleConfig']['htaccess']) { |
||
| 224 | if (0 != $cid) { |
||
| 225 | $artistHandler = \XoopsModules\Songlist\Helper::getInstance()->getHandler('Artists'); |
||
| 226 | $artist = $artistHandler->get($cid); |
||
| 227 | if (\is_object($artist) && !$artist->isNew()) { |
||
| 228 | return XOOPS_URL |
||
| 229 | . '/' |
||
| 230 | . $GLOBALS['songlistModuleConfig']['baseofurl'] |
||
| 231 | . '/' |
||
| 232 | . $file |
||
| 233 | . '/' |
||
| 234 | . \urlencode(\str_replace([' ', \chr(9)], '-', $artist->getVar('name'))) |
||
| 235 | . '/' |
||
| 236 | . $start |
||
| 237 | . '-' |
||
| 238 | . $id |
||
| 239 | . '-' |
||
| 240 | . $op |
||
| 241 | . '-' |
||
| 242 | . $fct |
||
| 243 | . '-' |
||
| 244 | . $gid |
||
| 245 | . '-' |
||
| 246 | . $cid |
||
| 247 | . '/' |
||
| 248 | . \urlencode($value) |
||
| 249 | . $GLOBALS['songlistModuleConfig']['endofurl']; |
||
| 250 | } |
||
| 251 | |||
| 252 | return XOOPS_URL . '/' . $GLOBALS['songlistModuleConfig']['baseofurl'] . '/' . $file . '/' . $start . '-' . $id . '-' . $op . '-' . $fct . '-' . $gid . '-' . $cid . '/' . \urlencode($value) . $GLOBALS['songlistModuleConfig']['endofurl']; |
||
| 253 | } |
||
| 254 | |||
| 255 | return XOOPS_URL . '/' . $GLOBALS['songlistModuleConfig']['baseofurl'] . '/' . $file . '/' . $start . '-' . $id . '-' . $op . '-' . $fct . '-' . $gid . '-' . $cid . '/' . \urlencode($value) . $GLOBALS['songlistModuleConfig']['endofurl']; |
||
| 256 | } |
||
| 257 | |||
| 258 | return XOOPS_URL . '/modules/songlist/' . $file . '.php?op=' . $op . '&fct=' . $fct . '&id=' . $id . '&value=' . \urlencode($value ?? '') . '&gid=' . $gid . '&vid=' . $vid . '&cid=' . $cid . '&start=' . $start; |
||
| 259 | } |
||
| 260 | |||
| 261 | /** |
||
| 262 | * @param null $criteria |
||
| 263 | * @return array |
||
| 264 | */ |
||
| 265 | public function getSIDs($criteria = null): array |
||
| 266 | { |
||
| 267 | $ret = []; |
||
| 268 | $songHandler = \XoopsModules\Songlist\Helper::getInstance()->getHandler('Songs'); |
||
| 269 | foreach ($this->getObjects($criteria, true) as $aid => $object) { |
||
| 270 | $crita = new Criteria('aids', '%"' . $aid . '"%', 'LIKE'); |
||
| 271 | foreach ($songHandler->getObjects($crita, true) as $sid => $song) { |
||
| 272 | $ret[$sid] = $sid; |
||
| 273 | } |
||
| 274 | } |
||
| 275 | |||
| 276 | return $ret; |
||
| 277 | } |
||
| 278 | |||
| 279 | /** |
||
| 280 | * @param int $limit |
||
| 281 | * @return array |
||
| 282 | */ |
||
| 283 | public function getTop($limit = 1): array |
||
| 296 | } |
||
| 297 | } |
||
| 298 |