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
.