| Total Complexity | 85 |
| Total Lines | 517 |
| Duplicated Lines | 0 % |
| Changes | 0 | ||
Complex classes like XoopsStory 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 XoopsStory, and based on these observations, apply Extract Interface, too.
| 1 | <?php |
||
| 29 | class XoopsStory |
||
| 30 | { |
||
| 31 | public $table; |
||
| 32 | public $storyid; |
||
| 33 | public $topicid; |
||
| 34 | public $uid; |
||
| 35 | public $title; |
||
| 36 | public $hometext; |
||
| 37 | public $bodytext = ''; |
||
| 38 | public $counter; |
||
| 39 | public $created; |
||
| 40 | public $published; |
||
| 41 | public $expired; |
||
| 42 | public $hostname; |
||
| 43 | public $nohtml = 0; |
||
| 44 | public $nosmiley = 0; |
||
| 45 | public $ihome = 0; |
||
| 46 | public $notifypub = 0; |
||
| 47 | public $type; |
||
| 48 | public $approved; |
||
| 49 | public $topicdisplay; |
||
| 50 | public $topicalign; |
||
| 51 | public $db; |
||
| 52 | public $topicstable; |
||
| 53 | public $comments; |
||
| 54 | |||
| 55 | /** |
||
| 56 | * @param int|array $storyid |
||
| 57 | */ |
||
| 58 | public function Story($storyid = -1) |
||
| 59 | { |
||
| 60 | $this->db = XoopsDatabaseFactory::getDatabaseConnection(); |
||
| 61 | $this->table = ''; |
||
| 62 | $this->topicstable = ''; |
||
| 63 | if (is_array($storyid)) { |
||
| 64 | $this->makeStory($storyid); |
||
| 65 | } elseif ($storyid != -1) { |
||
| 66 | $this->getStory((int)$storyid); |
||
| 67 | } |
||
| 68 | } |
||
| 69 | |||
| 70 | /** |
||
| 71 | * @param $value |
||
| 72 | */ |
||
| 73 | public function setStoryId($value) |
||
| 74 | { |
||
| 75 | $this->storyid = (int)$value; |
||
| 76 | } |
||
| 77 | |||
| 78 | /** |
||
| 79 | * @param $value |
||
| 80 | */ |
||
| 81 | public function setTopicId($value) |
||
| 82 | { |
||
| 83 | $this->topicid = (int)$value; |
||
| 84 | } |
||
| 85 | |||
| 86 | /** |
||
| 87 | * @param $value |
||
| 88 | */ |
||
| 89 | public function setUid($value) |
||
| 90 | { |
||
| 91 | $this->uid = (int)$value; |
||
| 92 | } |
||
| 93 | |||
| 94 | /** |
||
| 95 | * @param $value |
||
| 96 | */ |
||
| 97 | public function setTitle($value) |
||
| 98 | { |
||
| 99 | $this->title = $value; |
||
| 100 | } |
||
| 101 | |||
| 102 | /** |
||
| 103 | * @param $value |
||
| 104 | */ |
||
| 105 | public function setHometext($value) |
||
| 106 | { |
||
| 107 | $this->hometext = $value; |
||
| 108 | } |
||
| 109 | |||
| 110 | /** |
||
| 111 | * @param $value |
||
| 112 | */ |
||
| 113 | public function setBodytext($value) |
||
| 114 | { |
||
| 115 | $this->bodytext = $value; |
||
| 116 | } |
||
| 117 | |||
| 118 | /** |
||
| 119 | * @param $value |
||
| 120 | */ |
||
| 121 | public function setPublished($value) |
||
| 122 | { |
||
| 123 | $this->published = (int)$value; |
||
| 124 | } |
||
| 125 | |||
| 126 | /** |
||
| 127 | * @param $value |
||
| 128 | */ |
||
| 129 | public function setExpired($value) |
||
| 130 | { |
||
| 131 | $this->expired = (int)$value; |
||
| 132 | } |
||
| 133 | |||
| 134 | /** |
||
| 135 | * @param $value |
||
| 136 | */ |
||
| 137 | public function setHostname($value) |
||
| 138 | { |
||
| 139 | $this->hostname = $value; |
||
| 140 | } |
||
| 141 | |||
| 142 | /** |
||
| 143 | * @param int $value |
||
| 144 | */ |
||
| 145 | public function setNohtml($value = 0) |
||
| 146 | { |
||
| 147 | $this->nohtml = $value; |
||
| 148 | } |
||
| 149 | |||
| 150 | /** |
||
| 151 | * @param int $value |
||
| 152 | */ |
||
| 153 | public function setNosmiley($value = 0) |
||
| 154 | { |
||
| 155 | $this->nosmiley = $value; |
||
| 156 | } |
||
| 157 | |||
| 158 | /** |
||
| 159 | * @param $value |
||
| 160 | */ |
||
| 161 | public function setIhome($value) |
||
| 162 | { |
||
| 163 | $this->ihome = $value; |
||
| 164 | } |
||
| 165 | |||
| 166 | /** |
||
| 167 | * @param $value |
||
| 168 | */ |
||
| 169 | public function setNotifyPub($value) |
||
| 170 | { |
||
| 171 | $this->notifypub = $value; |
||
| 172 | } |
||
| 173 | |||
| 174 | /** |
||
| 175 | * @param $value |
||
| 176 | */ |
||
| 177 | public function setType($value) |
||
| 178 | { |
||
| 179 | $this->type = $value; |
||
| 180 | } |
||
| 181 | |||
| 182 | /** |
||
| 183 | * @param $value |
||
| 184 | */ |
||
| 185 | public function setApproved($value) |
||
| 186 | { |
||
| 187 | $this->approved = (int)$value; |
||
| 188 | } |
||
| 189 | |||
| 190 | /** |
||
| 191 | * @param $value |
||
| 192 | */ |
||
| 193 | public function setTopicdisplay($value) |
||
| 194 | { |
||
| 195 | $this->topicdisplay = $value; |
||
| 196 | } |
||
| 197 | |||
| 198 | /** |
||
| 199 | * @param $value |
||
| 200 | */ |
||
| 201 | public function setTopicalign($value) |
||
| 202 | { |
||
| 203 | $this->topicalign = $value; |
||
| 204 | } |
||
| 205 | |||
| 206 | /** |
||
| 207 | * @param $value |
||
| 208 | */ |
||
| 209 | public function setComments($value) |
||
| 210 | { |
||
| 211 | $this->comments = (int)$value; |
||
| 212 | } |
||
| 213 | |||
| 214 | /** |
||
| 215 | * @param bool $approved |
||
| 216 | * |
||
| 217 | * @return bool |
||
| 218 | */ |
||
| 219 | public function store($approved = false) |
||
| 220 | { |
||
| 221 | //$newpost = 0; |
||
| 222 | $myts = MyTextSanitizer::getInstance(); |
||
| 223 | $title = $myts->censorString($this->title); |
||
| 224 | $hometext = $myts->censorString($this->hometext); |
||
| 225 | $bodytext = $myts->censorString($this->bodytext); |
||
| 226 | $title = $myts->addSlashes($title); |
||
| 227 | $hometext = $myts->addSlashes($hometext); |
||
| 228 | $bodytext = $myts->addSlashes($bodytext); |
||
| 229 | if (!isset($this->nohtml) || $this->nohtml != 1) { |
||
| 230 | $this->nohtml = 0; |
||
| 231 | } |
||
| 232 | if (!isset($this->nosmiley) || $this->nosmiley != 1) { |
||
| 233 | $this->nosmiley = 0; |
||
| 234 | } |
||
| 235 | if (!isset($this->notifypub) || $this->notifypub != 1) { |
||
| 236 | $this->notifypub = 0; |
||
| 237 | } |
||
| 238 | if (!isset($this->topicdisplay) || $this->topicdisplay != 0) { |
||
| 239 | $this->topicdisplay = 1; |
||
| 240 | } |
||
| 241 | $expired = !empty($this->expired) ? $this->expired : 0; |
||
| 242 | if (!isset($this->storyid)) { |
||
| 243 | //$newpost = 1; |
||
| 244 | $newstoryid = $this->db->genId($this->table . '_storyid_seq'); |
||
| 245 | $created = time(); |
||
| 246 | $published = $this->approved ? $this->published : 0; |
||
| 247 | |||
| 248 | $sql = sprintf("INSERT INTO %s (storyid, uid, title, created, published, expired, hostname, nohtml, nosmiley, hometext, bodytext, counter, topicid, ihome, notifypub, story_type, topicdisplay, topicalign, comments) VALUES (%u, %u, '%s', %u, %u, %u, '%s', %u, %u, '%s', '%s', %u, %u, %u, %u, '%s', %u, '%s', %u)", $this->table, $newstoryid, $this->uid, $title, $created, $published, $expired, $this->hostname, $this->nohtml, $this->nosmiley, $hometext, $bodytext, 0, $this->topicid, $this->ihome, $this->notifypub, $this->type, $this->topicdisplay, $this->topicalign, $this->comments); |
||
| 249 | } else { |
||
| 250 | if ($this->approved) { |
||
| 251 | $sql = sprintf("UPDATE %s SET title = '%s', published = %u, expired = %u, nohtml = %u, nosmiley = %u, hometext = '%s', bodytext = '%s', topicid = %u, ihome = %u, topicdisplay = %u, topicalign = '%s', comments = %u WHERE storyid = %u", $this->table, $title, $this->published, $expired, $this->nohtml, $this->nosmiley, $hometext, $bodytext, $this->topicid, $this->ihome, $this->topicdisplay, $this->topicalign, $this->comments, $this->storyid); |
||
| 252 | } else { |
||
| 253 | $sql = sprintf("UPDATE %s SET title = '%s', expired = %u, nohtml = %u, nosmiley = %u, hometext = '%s', bodytext = '%s', topicid = %u, ihome = %u, topicdisplay = %u, topicalign = '%s', comments = %u WHERE storyid = %u", $this->table, $title, $expired, $this->nohtml, $this->nosmiley, $hometext, $bodytext, $this->topicid, $this->ihome, $this->topicdisplay, $this->topicalign, $this->comments, $this->storyid); |
||
| 254 | } |
||
| 255 | $newstoryid = $this->storyid; |
||
| 256 | } |
||
| 257 | if (!$result = $this->db->query($sql)) { |
||
| 258 | return false; |
||
| 259 | } |
||
| 260 | if (empty($newstoryid)) { |
||
| 261 | $newstoryid = $this->db->getInsertId(); |
||
| 262 | $this->storyid = $newstoryid; |
||
| 263 | } |
||
| 264 | |||
| 265 | return $newstoryid; |
||
| 266 | } |
||
| 267 | |||
| 268 | /** |
||
| 269 | * @param $storyid |
||
| 270 | */ |
||
| 271 | public function getStory($storyid) |
||
| 272 | { |
||
| 273 | $storyid = (int)$storyid; |
||
| 274 | $sql = 'SELECT * FROM ' . $this->table . ' WHERE storyid=' . $storyid . ''; |
||
| 275 | $array = $this->db->fetchArray($this->db->query($sql)); |
||
| 276 | $this->makeStory($array); |
||
| 277 | } |
||
| 278 | |||
| 279 | /** |
||
| 280 | * @param $array |
||
| 281 | */ |
||
| 282 | public function makeStory($array) |
||
| 283 | { |
||
| 284 | foreach ($array as $key => $value) { |
||
| 285 | $this->$key = $value; |
||
| 286 | } |
||
| 287 | } |
||
| 288 | |||
| 289 | /** |
||
| 290 | * @return bool |
||
| 291 | */ |
||
| 292 | public function delete() |
||
| 293 | { |
||
| 294 | $sql = sprintf('DELETE FROM %s WHERE storyid = %u', $this->table, $this->storyid); |
||
| 295 | if (!$result = $this->db->query($sql)) { |
||
| 296 | return false; |
||
| 297 | } |
||
| 298 | |||
| 299 | return true; |
||
| 300 | } |
||
| 301 | |||
| 302 | /** |
||
| 303 | * @return bool |
||
| 304 | */ |
||
| 305 | public function updateCounter() |
||
| 306 | { |
||
| 307 | $sql = sprintf('UPDATE %s SET counter = counter+1 WHERE storyid = %u', $this->table, $this->storyid); |
||
| 308 | if (!$result = $this->db->queryF($sql)) { |
||
| 309 | return false; |
||
| 310 | } |
||
| 311 | |||
| 312 | return true; |
||
| 313 | } |
||
| 314 | |||
| 315 | /** |
||
| 316 | * @param $total |
||
| 317 | * |
||
| 318 | * @return bool |
||
| 319 | */ |
||
| 320 | public function updateComments($total) |
||
| 328 | } |
||
| 329 | |||
| 330 | public function topicid() |
||
| 331 | { |
||
| 332 | return $this->topicid; |
||
| 333 | } |
||
| 334 | |||
| 335 | /** |
||
| 336 | * @return XoopsTopic |
||
| 337 | */ |
||
| 338 | public function topic() |
||
| 339 | { |
||
| 340 | return new XoopsTopic($this->topicstable, $this->topicid); |
||
| 341 | } |
||
| 342 | |||
| 343 | public function uid() |
||
| 344 | { |
||
| 345 | return $this->uid; |
||
| 346 | } |
||
| 347 | |||
| 348 | /** |
||
| 349 | * @return string |
||
| 350 | */ |
||
| 351 | public function uname() |
||
| 352 | { |
||
| 353 | return XoopsUser::getUnameFromId($this->uid); |
||
| 354 | } |
||
| 355 | |||
| 356 | /** |
||
| 357 | * @param string $format |
||
| 358 | * |
||
| 359 | * @return mixed |
||
| 360 | */ |
||
| 361 | public function title($format = 'Show') |
||
| 362 | { |
||
| 363 | $myts = MyTextSanitizer::getInstance(); |
||
| 364 | $smiley = 1; |
||
| 365 | if ($this->nosmiley()) { |
||
| 366 | $smiley = 0; |
||
| 367 | } |
||
| 368 | switch ($format) { |
||
| 369 | case 'Show': |
||
| 370 | case 'Edit': |
||
| 371 | $title = $myts->htmlSpecialChars($this->title); |
||
| 372 | break; |
||
| 373 | case 'Preview': |
||
| 374 | case 'InForm': |
||
| 375 | $title = $myts->htmlSpecialChars($myts->stripSlashesGPC($this->title)); |
||
| 376 | break; |
||
| 377 | } |
||
| 378 | |||
| 379 | return $title; |
||
| 380 | } |
||
| 381 | |||
| 382 | /** |
||
| 383 | * @param string $format |
||
| 384 | * |
||
| 385 | * @return string |
||
| 386 | */ |
||
| 387 | public function hometext($format = 'Show') |
||
| 388 | { |
||
| 389 | $myts = MyTextSanitizer::getInstance(); |
||
| 390 | $html = 1; |
||
| 391 | $smiley = 1; |
||
| 392 | $xcodes = 1; |
||
| 393 | if ($this->nohtml()) { |
||
| 394 | $html = 0; |
||
| 395 | } |
||
| 396 | if ($this->nosmiley()) { |
||
| 397 | $smiley = 0; |
||
| 398 | } |
||
| 399 | switch ($format) { |
||
| 400 | case 'Show': |
||
| 401 | $hometext = $myts->displayTarea($this->hometext, $html, $smiley, $xcodes); |
||
| 402 | break; |
||
| 403 | case 'Edit': |
||
| 404 | $hometext = htmlspecialchars($this->hometext, ENT_QUOTES); |
||
| 405 | break; |
||
| 406 | case 'Preview': |
||
| 407 | $hometext = $myts->previewTarea($this->hometext, $html, $smiley, $xcodes); |
||
| 408 | break; |
||
| 409 | case 'InForm': |
||
| 410 | $hometext = htmlspecialchars($myts->stripSlashesGPC($this->hometext), ENT_QUOTES); |
||
| 411 | break; |
||
| 412 | } |
||
| 413 | |||
| 414 | return $hometext; |
||
| 415 | } |
||
| 416 | |||
| 417 | /** |
||
| 418 | * @param string $format |
||
| 419 | * |
||
| 420 | * @return string |
||
| 421 | */ |
||
| 422 | public function bodytext($format = 'Show') |
||
| 423 | { |
||
| 424 | $myts = MyTextSanitizer::getInstance(); |
||
| 425 | $html = 1; |
||
| 426 | $smiley = 1; |
||
| 427 | $xcodes = 1; |
||
| 428 | if ($this->nohtml()) { |
||
| 429 | $html = 0; |
||
| 430 | } |
||
| 431 | if ($this->nosmiley()) { |
||
| 432 | $smiley = 0; |
||
| 433 | } |
||
| 434 | switch ($format) { |
||
| 435 | case 'Show': |
||
| 436 | $bodytext = $myts->displayTarea($this->bodytext, $html, $smiley, $xcodes); |
||
| 437 | break; |
||
| 438 | case 'Edit': |
||
| 439 | $bodytext = htmlspecialchars($this->bodytext, ENT_QUOTES); |
||
| 440 | break; |
||
| 441 | case 'Preview': |
||
| 442 | $bodytext = $myts->previewTarea($this->bodytext, $html, $smiley, $xcodes); |
||
| 443 | break; |
||
| 444 | case 'InForm': |
||
| 445 | $bodytext = htmlspecialchars($myts->stripSlashesGPC($this->bodytext), ENT_QUOTES); |
||
| 446 | break; |
||
| 447 | } |
||
| 448 | |||
| 449 | return $bodytext; |
||
| 450 | } |
||
| 451 | |||
| 452 | public function counter() |
||
| 453 | { |
||
| 454 | return $this->counter; |
||
| 455 | } |
||
| 456 | |||
| 457 | public function created() |
||
| 458 | { |
||
| 459 | return $this->created; |
||
| 460 | } |
||
| 461 | |||
| 462 | public function published() |
||
| 463 | { |
||
| 464 | return $this->published; |
||
| 465 | } |
||
| 466 | |||
| 467 | public function expired() |
||
| 468 | { |
||
| 469 | return $this->expired; |
||
| 470 | } |
||
| 471 | |||
| 472 | public function hostname() |
||
| 473 | { |
||
| 474 | return $this->hostname; |
||
| 475 | } |
||
| 476 | |||
| 477 | public function storyid() |
||
| 480 | } |
||
| 481 | |||
| 482 | /** |
||
| 483 | * @return int |
||
| 484 | */ |
||
| 485 | public function nohtml() |
||
| 486 | { |
||
| 487 | return $this->nohtml; |
||
| 488 | } |
||
| 489 | |||
| 490 | /** |
||
| 491 | * @return int |
||
| 492 | */ |
||
| 493 | public function nosmiley() |
||
| 494 | { |
||
| 495 | return $this->nosmiley; |
||
| 496 | } |
||
| 497 | |||
| 498 | /** |
||
| 499 | * @return int |
||
| 500 | */ |
||
| 501 | public function notifypub() |
||
| 502 | { |
||
| 503 | return $this->notifypub; |
||
| 504 | } |
||
| 505 | |||
| 506 | public function type() |
||
| 507 | { |
||
| 508 | return $this->type; |
||
| 509 | } |
||
| 510 | |||
| 511 | /** |
||
| 512 | * @return int |
||
| 513 | */ |
||
| 514 | public function ihome() |
||
| 515 | { |
||
| 516 | return $this->ihome; |
||
| 517 | } |
||
| 518 | |||
| 519 | public function topicdisplay() |
||
| 522 | } |
||
| 523 | |||
| 524 | /** |
||
| 525 | * @param bool $astext |
||
| 526 | * |
||
| 527 | * @return string |
||
| 528 | */ |
||
| 529 | public function topicalign($astext = true) |
||
| 530 | { |
||
| 531 | $ret = 'left'; |
||
| 532 | if ($astext) { |
||
| 533 | if ($this->topicalign === 'R') { |
||
| 534 | $ret = 'right'; |
||
| 535 | } |
||
| 536 | |||
| 537 | return $ret; |
||
| 538 | } |
||
| 539 | |||
| 540 | return $this->topicalign; |
||
| 541 | } |
||
| 542 | |||
| 543 | public function comments() |
||
| 544 | { |
||
| 545 | return $this->comments; |
||
| 546 | } |
||
| 547 | } |
||
| 548 |
The PSR-1: Basic Coding Standard recommends that a file should either introduce new symbols, that is classes, functions, constants or similar, or have side effects. Side effects are anything that executes logic, like for example printing output, changing ini settings or writing to a file.
The idea behind this recommendation is that merely auto-loading a class should not change the state of an application. It also promotes a cleaner style of programming and makes your code less prone to errors, because the logic is not spread out all over the place.
To learn more about the PSR-1, please see the PHP-FIG site on the PSR-1.