Completed
Push — master ( acb423...2a302c )
by Jacob
03:45
created

PostController::get_comment_array()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 54
Code Lines 38

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 54
rs 9.0306
cc 4
eloc 38
nc 4
nop 1

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?
0 ignored issues
show
Security Best Practice introduced by
It is not recommend to use PHP's short opening tag <?, better use <?php, or <?= in case of outputting.

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.

Loading history...
2
3
Loader::load('collector', 'waterfall/LogCollector');
4
Loader::load('controller', 'blog/DefaultPageController');
5
6
final class PostController extends DefaultPageController
7
{
8
9
	private static $PAGE_DESCRIPTION_LIMIT = 250;
10
11
	private static $TITLE = "%s | Jacob Emerick's Blog";
12
	private static $AUTHOR = 'Jacob Emerick';
13
	private static $AUTHOR_URL = 'https://home.jacobemerick.com/';
14
15
	private static $POST_LENGTH_SHORT = 100;
16
	private static $POST_LENGTH_LONG = 140;
17
18
	private $post;
19
	private $tags;
20
	private $comment_errors = array();
0 ignored issues
show
Comprehensibility introduced by
Consider using a different property name as you override a private property of the parent class.
Loading history...
Unused Code introduced by
The property $comment_errors is not used and could be removed.

This check marks private properties in classes that are never used. Those properties can be removed.

Loading history...
21
22
	public function __construct()
23
	{
24
		parent::__construct();
25
		
26
        global $container;
27
        $repository = new Jacobemerick\Web\Domain\Blog\Post\MysqlPostRepository($container['db_connection_locator']);
28
        $this->post = $repository->findPostByPath(URLDecode::getPiece(2));
29
30
		if($this->post == null)
31
			$this->eject();
32
		
33
		$this->handle_comment_submit(
34
			self::$BLOG_SITE_ID,
35
			$this->post['path'],
36
			Loader::getRootUrl('blog') . $this->post['category'] . '/' . $this->post['path'] . '/',
37
			$this->post['title']);
38
39
        global $container;
40
        $repository = new Jacobemerick\Web\Domain\Blog\Tag\MysqlTagRepository($container['db_connection_locator']);
41
        $this->tags = $repository->getTagsForPost($this->post['id']);
42
	}
43
44
	protected function set_head_data()
45
	{
46
		parent::set_head_data();
47
		
48
		$this->set_title(sprintf(self::$TITLE, $this->post['title']));
49
		$this->set_description($this->get_post_description());
50
		$this->set_keywords($this->get_post_keywords());
51
		$this->set_author(self::$AUTHOR);
52
53
    $photo = Content::instance('FetchFirstPhoto', $this->post['body'])->activate(true);
54
    $photo = preg_match('/^<img src="([a-z-:\.\/]+)" [^>]+>$/', $photo, $matches);
0 ignored issues
show
Unused Code introduced by
$photo is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
55
    $this->set_head('thumbnail', $matches[1]);
56
57
		if (array_key_exists($this->post['id'], self::$DEPRECATED_BLOGS)) {
58
			$log_id = self::$DEPRECATED_BLOGS[$this->post['id']];
59
			$log = LogCollector::getById($log_id);
60
			if (!empty($log)) {
61
				$log_url = Loader::getRootUrl('waterfalls') . "journal/{$log->alias}/";
62
				$this->set_canonical($log_url);
63
			}
64
		}
65
	}
66
67
	protected function get_introduction() {}
68
69
	protected function set_body_data()
70
	{
71
		parent::set_body_data();
72
		
73
		$this->set_body('title', $this->post['title']);
74
		$this->set_body('view', 'Post');
75
		$this->set_body('data', array(
76
			'post' => $this->format_post($this->post, false),
77
			'series_posts' => $this->get_series_posts(),
78
			'related_posts' => $this->get_related_posts(),
79
			'author' => self::$AUTHOR,
80
			'author_url' => self::$AUTHOR_URL,
81
      'comment_array' => $this->get_comment_array(
82
          'blog.jacobemerick.com',
83
          "{$this->post['category']}/{$this->post['path']}"
84
      ),
85
    ));
86
	}
87
88
	protected function get_post_description()
89
	{
90
		$description = $this->post['body'];
91
		$description = strip_tags($description);
92
		$description = Content::instance('SmartTrim', $description)->activate(self::$PAGE_DESCRIPTION_LIMIT);
93
		
94
		return $description;
95
	}
96
97
	protected function get_post_keywords()
98
	{
99
		$keyword_array = array();
100
		$keywords = $this->tags;
101
		
102
		foreach($keywords as $keyword)
103
		{
104
			$keyword_array[] = $keyword['tag'];
105
		}
106
		
107
		$keyword_array[] = 'blog';
108
		$keyword_array[] = 'Jacob Emerick';
109
		
110
		return $keyword_array;
111
	}
112
113
	private function get_series_posts()
114
	{
115
		$series_posts = $this->fetch_series_posts();
116
		if(count($series_posts) < 1)
117
			return array();
118
		
119
		$previous_post = new stdclass();
120
		$next_post = new stdclass();
121
		
122
		$found_current_post = false;
123
		foreach($series_posts as $post_row)
124
		{
125
			if($post_row['post'] == $this->post['id'])
126
			{
127
				$found_current_post = true;
128
				continue;
129
			}
130
			
131
			$post = new stdclass();
132
133
      if (
134
        strpos($post_row['title'], 'Rainy Supe Loop') === 0 ||
135
        strpos($post_row['title'], 'Malapais Loop') === 0 ||
136
        strpos($post_row['title'], 'Mazatzal Peak Loop') === 0 ||
137
        strpos($post_row['title'], 'Dripping Springs Loop') === 0
138
      ) {
139
        $title = $post_row['title'];
140
        $title = explode(':', $title);
141
        $title = array_pop($title);
142
        $title = trim($title);
143
        $post->title = $title;
144
      } else if (strpos($post_row['title'], 'Isle Royale') === 0) {
145
				$title = $post_row['title'];
146
				$title = explode(',', $title);
147
				$title = array_pop($title);
148
				$title = trim($title);
149
				$post->title = $title;
150
			} else {
151
				$post->title = $post_row['title'];
152
			}
153
154
			$post->url = Loader::getRootUrl('blog') . "{$post_row['category']}/{$post_row['path']}/";
155
			
156
			if(!$found_current_post)
157
				$previous_post = $post;
158
			else
159
			{
160
				$next_post = $post;
161
				break;
162
			}
163
		}
164
		
165
		return array(
166
			'title' => $post_row['series_title'],
0 ignored issues
show
Bug introduced by
The variable $post_row seems to be defined by a foreach iteration on line 123. Are you sure the iterator is never empty, otherwise this variable is not defined?

It seems like you are relying on a variable being defined by an iteration:

foreach ($a as $b) {
}

// $b is defined here only if $a has elements, for example if $a is array()
// then $b would not be defined here. To avoid that, we recommend to set a
// default value for $b.


// Better
$b = 0; // or whatever default makes sense in your context
foreach ($a as $b) {
}

// $b is now guaranteed to be defined here.
Loading history...
167
			'description' => Content::instance('FixInternalLink', $post_row['series_description'])->activate(),
168
			'previous' => $previous_post,
169
			'next' => $next_post);
170
	}
171
172
	private $series_posts;
173
	private function fetch_series_posts()
174
	{
175
      if(!isset($this->series_posts)) {
176
          global $container;
177
          $repository = new Jacobemerick\Web\Domain\Blog\Series\MysqlSeriesRepository($container['db_connection_locator']);
178
          $this->series_posts = $repository->getSeriesForPost($this->post['id']);
179
      }
180
      return $this->series_posts;
181
	}
182
183
	private function get_related_posts()
184
	{
185
		$tag_array = array();
186
		foreach($this->tags as $tag)
187
		{
188
			$tag_array[] = $tag['id'];
189
		}
190
		
191
		$series_posts = $this->fetch_series_posts();
192
		$exclude_post_array = array();
193
		foreach($series_posts as $series_post)
194
		{
195
			$exclude_post_array[] = $series_post['post'];
196
		}
197
198
        global $container;
199
        $repository = new Jacobemerick\Web\Domain\Blog\Post\MysqlPostRepository($container['db_connection_locator']);
200
        $post_result = $repository->getActivePostsByRelatedTags($this->post['id']);
201
202
        $post_array = array();
203
		
204 View Code Duplication
		foreach($post_result as $post_row)
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
205
		{
206
			$post = new stdclass();
207
			$post->title = $post_row['title'];
208
			$post->url = Loader::getRootUrl('blog') . "{$post_row['category']}/{$post_row['path']}/";
209
			$post->category = ucwords(str_replace('-', ' ', $post_row['category']));
210
			$post->thumb = Content::instance('FetchFirstPhoto', $post_row['body'])->activate();
211
			$post->body = Content::instance('SmartTrim', $post_row['body'])->activate(($post->thumb !== '') ? self::$POST_LENGTH_SHORT : self::$POST_LENGTH_LONG);
212
			
213
			$post_array[] = $post;
214
		}
215
		
216
		return $post_array;
217
	}
218
}
219