Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
| 1 | <? |
||
| 11 | final class CommentSubmitModule |
||
| 12 | { |
||
| 13 | |||
| 14 | private $site; |
||
| 15 | private $path; |
||
| 16 | private $full_path; |
||
| 17 | private $page_title; |
||
| 18 | |||
| 19 | public function __construct($site, $path, $full_path, $page_title) |
||
| 20 | { |
||
| 21 | $this->site = $site; |
||
| 22 | $this->path = $path; |
||
| 23 | $this->full_path = $full_path; |
||
| 24 | $this->page_title = $page_title; |
||
| 25 | } |
||
| 26 | |||
| 27 | public function activate() |
||
| 28 | { |
||
| 29 | if(!Request::hasPost()) |
||
| 30 | return false; |
||
| 31 | if(!Request::getPost('submit') == 'Submit Comment') |
||
| 32 | return false; |
||
| 33 | |||
| 34 | $errors = $this->fetch_errors(); |
||
| 35 | if(count($errors) > 0) |
||
| 36 | return $errors; |
||
| 37 | if(Request::getPost('catch') !== '') |
||
| 38 | return false; |
||
| 39 | |||
| 40 | $page_id = $this->save_comment_page(); |
||
| 41 | $commenter_id = $this->save_commenter(); |
||
| 42 | $comment_id = $this->save_comment(); |
||
| 43 | |||
| 44 | $comment_meta_id = $this->save_comment_meta($commenter_id, $comment_id, $page_id); |
||
| 45 | |||
| 46 | $this->send_notifications($page_id); |
||
| 47 | $this->redirect_to_comment($comment_meta_id); |
||
| 48 | } |
||
| 49 | |||
| 50 | private function fetch_errors() |
||
| 51 | { |
||
| 52 | $errors = array(); |
||
| 53 | if(!Validate::checkRequest('post', 'name', 'name')) |
||
| 54 | $errors['name'] = 'You must include a valid name'; |
||
| 55 | if(!Validate::checkRequest('post', 'email', 'email')) |
||
| 56 | $errors['email'] = 'You must include a valid email'; |
||
| 57 | if(Request::getPost('website') && !Validate::checkRequest('post', 'website', 'url')) |
||
| 58 | $errors['website'] = 'Please enter a valid website'; |
||
| 59 | if(!Validate::checkRequest('post', 'comment', 'string')) |
||
| 60 | $errors['comment'] = 'You must enter a comment'; |
||
| 61 | if(Request::getPost('notify') && Request::getPost('notify') != 'check') |
||
| 62 | $errors['notify'] = 'You entered an invalid notify request'; |
||
| 63 | if(Request::getPost('reply') && !Validate::checkRequest('post', 'reply', 'integer')) |
||
| 64 | $errors['reply'] = 'You entered an invalid reply request'; |
||
| 65 | |||
| 66 | return $errors; |
||
| 67 | } |
||
| 68 | |||
| 69 | private function save_comment_page() |
||
| 70 | { |
||
| 71 | $page_result = CommentCollector::getCommentPageByURL($this->path, $this->site); |
||
| 72 | if($page_result !== null) |
||
| 73 | return $page_result->id; |
||
| 74 | |||
| 75 | $query = "INSERT INTO `jpemeric_comment`.`comment_page` (`site`, `path`) VALUES ('%d', '%s')"; |
||
| 76 | $query = sprintf($query, $this->site, $this->path); |
||
| 77 | Database::execute($query); |
||
| 78 | |||
| 79 | return Database::lastInsertID(); |
||
| 80 | } |
||
| 81 | |||
| 82 | private function save_commenter() |
||
| 83 | { |
||
| 84 | $cookie_value = array( |
||
| 85 | 'name' => Request::getPost('name'), |
||
| 86 | 'email' => Request::getPost('email')); |
||
| 87 | |||
| 88 | if(Request::getPost('website') != '') |
||
| 89 | $cookie_value['website'] = Request::getPost('website'); |
||
| 90 | |||
| 91 | $cookie_value = json_encode($cookie_value); |
||
| 92 | |||
| 93 | Cookie::instance('Commenter') |
||
| 94 | ->setValue($cookie_value) |
||
| 95 | ->save(); |
||
| 96 | |||
| 97 | $commenter_result = CommentCollector::getCommenterByFields(Request::getPost('name'), Request::getPost('email'), Request::getPost('website')); |
||
| 98 | if($commenter_result !== null) |
||
| 99 | return $commenter_result->id; |
||
| 100 | |||
| 101 | $query = "INSERT INTO `jpemeric_comment`.`commenter` (`name`,`email`,`url`) VALUES ('%s','%s','%s')"; |
||
| 102 | |||
| 103 | $name = Database::escape(Request::getPost('name')); |
||
| 104 | $email = Database::escape(Request::getPost('email')); |
||
| 105 | $website = Database::escape(Request::getPost('website')); |
||
| 106 | |||
| 107 | $query = sprintf($query, $name, $email, $website); |
||
| 108 | Database::execute($query); |
||
| 109 | return Database::lastInsertID(); |
||
| 110 | } |
||
| 111 | |||
| 112 | private function save_comment() |
||
| 113 | { |
||
| 114 | $comment_result = CommentCollector::getCommentByBody(Request::getPost('comment')); |
||
| 115 | if($comment_result !== null) |
||
| 116 | return $comment_result->id; |
||
| 117 | |||
| 118 | $query = "INSERT INTO `jpemeric_comment`.`comment` (`body`, `body_format`) VALUES ('%s', '%s')"; |
||
| 119 | |||
| 120 | $body = Database::escape(Request::getPost('comment')); |
||
| 121 | |||
| 122 | $body_format = Request::getPost('comment'); |
||
| 123 | $body_format = Content::instance('CleanComment', $body_format)->activate(); |
||
| 124 | $body_format = Database::escape($body_format); |
||
| 125 | |||
| 126 | $query = sprintf($query, $body, $body_format); |
||
| 127 | Database::execute($query); |
||
| 128 | return Database::lastInsertID(); |
||
| 129 | } |
||
| 130 | |||
| 131 | private function save_comment_meta($commenter, $comment, $page) |
||
| 132 | { |
||
| 133 | $query = "INSERT INTO `jpemeric_comment`.`comment_meta` (`commenter`,`comment`,`reply`,`notify`,`comment_page`,`date`,`display`) VALUES ('%d','%d','%d','%d','%d','%s','%d')"; |
||
| 134 | |||
| 135 | $reply = Database::escape(Request::getPost('type')); |
||
| 136 | if($reply == 'new') |
||
| 137 | $reply = 0; |
||
| 138 | // else check to make sure value is legit |
||
| 139 | |||
| 140 | $notify = (Request::getPost('notify') == 'check') ? 1 : 0; |
||
| 141 | $date = date('Y-m-d H:i:s'); |
||
| 142 | $display = 1; |
||
| 143 | |||
| 144 | $query = sprintf($query, $commenter, $comment, $reply, $notify, $page, $date, $display); |
||
| 145 | Database::execute($query); |
||
| 146 | return Database::lastInsertID(); |
||
| 147 | } |
||
| 148 | |||
| 149 | private function send_notifications($page) |
||
| 150 | { |
||
| 151 | Loader::load('utility', 'Mail'); |
||
| 152 | |||
| 153 | $email_recipient_array = array(); |
||
| 154 | |||
| 155 | $commenter_result = CommentCollector::getCommenterByFields(Request::getPost('name'), Request::getPost('email'), Request::getPost('website')); |
||
| 156 | |||
| 157 | if($commenter_result->trusted == 1) |
||
| 158 | { |
||
| 159 | $notification_result = CommentCollector::getNotificationForPage($page); |
||
| 160 | |||
| 161 | foreach($notification_result as $notification_row) |
||
| 162 | { |
||
| 163 | if($notification_row->email == Request::getPost('email')) |
||
| 164 | continue; |
||
| 165 | |||
| 166 | $email_recipient_array[$notification_row->email] = array( |
||
| 167 | 'email' => $notification_row->email, |
||
| 168 | 'name' => $notification_row->name); |
||
| 169 | } |
||
| 170 | } |
||
| 171 | |||
| 172 | $site = URLDecode::getSite(); |
||
| 173 | |||
| 174 | if ($site == 'blog') { |
||
| 175 | $subject = "New Comment on Jacob Emerick's Blog"; |
||
| 176 | $message = "Hello!\nThere has been a new comment on the post '{$this->page_title}' at Jacob Emerick's Blog. You have chosen to be notified of it - please reply to [email protected] if you would like to be removed from these notifications.\n\nOn " . date('F j, Y g:i a') . ", " . Request::getPost('name') . " commented...\n" . Request::getPost('comment') . "\n\nVisit {$this->full_path}#comments to see and reply to all the comments on this post.\nThank you!"; |
||
| 177 | } else if ($site == 'waterfalls') { |
||
| 178 | $subject = "New Comment on Waterfalls of the Keweenaw"; |
||
| 179 | $message = "Hello!\nThere has been a new comment on the page '{$this->page_title}' at Waterfalls of the Keweenaw. You have chosen to be notified of it - please reply to [email protected] if you would like to be removed from these notifications.\n\nOn " . date('F j, Y g:i a') . ", " . Request::getPost('name') . " commented...\n" . Request::getPost('comment') . "\n\nVisit {$this->full_path}#comments to see and reply to all the comments on this post.\nThank you!"; |
||
| 180 | } |
||
| 181 | |||
| 182 | global $container; |
||
| 183 | |||
| 184 | foreach($email_recipient_array as $email_recipient) |
||
| 185 | { |
||
| 186 | $sent = $container['mail'] |
||
| 187 | ->addTo($email_recipient['email'], $email_recipient['name']) |
||
| 188 | ->addBCC($container['config']->admin_email) |
||
| 189 | ->setSubject($subject) |
||
| 190 | ->setMessage($message); |
||
| 191 | ->send(); |
||
| 192 | } |
||
| 193 | } |
||
| 194 | |||
| 195 | private function redirect_to_comment($comment_id) |
||
| 196 | { |
||
| 197 | $url = ''; |
||
| 198 | $url .= $this->full_path; |
||
| 199 | $url .= "#comment-{$comment_id}"; |
||
| 200 | |||
| 201 | Loader::loadNew('controller', 'Error303Controller', array($url))->activate(); |
||
| 202 | exit; |
||
| 203 | } |
||
| 204 | |||
| 205 | } |
||
| 206 |
Short opening tags are disabled in PHP’s default configuration. In such a case, all content of this file is output verbatim to the browser without being parsed, or executed.
As a precaution to avoid these problems better use the long opening tag
<?php.