Passed
Push — develop ( 73b4e9...8d0058 )
by Daniel
05:19
created

base_view::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 11
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
eloc 9
nc 1
nop 9
dl 0
loc 11
ccs 0
cts 11
cp 0
crap 2
rs 9.4285
c 0
b 0
f 0

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
<?php
2
/**
3
 *
4
 * @package sitemaker
5
 * @copyright (c) 2016 Daniel A. (blitze)
6
 * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
7
 *
8
 */
9
10
namespace blitze\content\services\views\driver;
11
12
abstract class base_view implements views_interface
13
{
14
    /** @var \phpbb\event\dispatcher_interface */
0 ignored issues
show
Bug introduced by
The type phpbb\event\dispatcher_interface was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
15
    protected $phpbb_dispatcher;
16
17
    /** @var\phpbb\language\language */
18
    protected $language;
19
20
    /** @var \phpbb\pagination */
0 ignored issues
show
Bug introduced by
The type phpbb\pagination was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
21
    protected $pagination;
22
23
    /** @var \phpbb\template\template */
0 ignored issues
show
Bug introduced by
The type phpbb\template\template was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
24
    protected $template;
25
26
    /* @var \blitze\content\services\fields */
27
    protected $fields;
28
29
    /** @var \blitze\sitemaker\services\forum\data */
0 ignored issues
show
Bug introduced by
The type blitze\sitemaker\services\forum\data was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
30
    protected $forum;
31
32
    /* @var \blitze\content\services\helper */
33
    protected $helper;
34
35
    /* @var \blitze\content\services\quickmod */
36
    protected $quickmod;
37
38
    /** @var \blitze\content\services\topic\blocks_factory */
39
    protected $topic_blocks_factory;
40
41
    /**
42
     * Constructor
43
     *
44
     * @param \phpbb\event\dispatcher_interface					$phpbb_dispatcher		Event dispatcher object
45
     * @param \phpbb\language\language							$language				Language Object
46
     * @param \phpbb\pagination									$pagination				Pagination object
47
     * @param \phpbb\template\template							$template				Template object
48
     * @param \blitze\content\services\fields					$fields					Content fields object
49
     * @param \blitze\sitemaker\services\forum\data				$forum					Forum Data object
50
     * @param \blitze\content\services\helper					$helper					Content helper object
51
     * @param \blitze\content\services\quickmod					$quickmod				Quick moderator tools
52
     * @param \blitze\content\services\topic\blocks_factory		$topic_blocks_factory	Topic blocks factory object
53
     */
54
    public function __construct(\phpbb\event\dispatcher_interface $phpbb_dispatcher, \phpbb\language\language $language, \phpbb\pagination $pagination, \phpbb\template\template $template, \blitze\content\services\fields $fields, \blitze\sitemaker\services\forum\data $forum, \blitze\content\services\helper $helper, \blitze\content\services\quickmod $quickmod, \blitze\content\services\topic\blocks_factory $topic_blocks_factory)
0 ignored issues
show
Bug introduced by
The type phpbb\language\language was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
55
    {
56
        $this->phpbb_dispatcher = $phpbb_dispatcher;
57
        $this->language = $language;
58
        $this->pagination = $pagination;
59
        $this->template = $template;
60
        $this->fields = $fields;
61
        $this->forum = $forum;
62
        $this->helper = $helper;
63
        $this->quickmod = $quickmod;
64
        $this->topic_blocks_factory = $topic_blocks_factory;
65
    }
66
67
    /**
68
     * {@inheritdoc}
69
     */
70
    public function get_detail_template()
71
    {
72
        return 'views/content_detail.html';
73
    }
74
75
    /**
76
     * {@inheritdoc}
77
     */
78
    public function build_index_query(array $filters, \blitze\content\model\entity\type $entity = null)
79
    {
80
        $forum_id = $entity ? $entity->get_forum_id() : 0;
81
        $sql_array = $this->get_filter_sql($filters, $forum_id);
82
83
        $this->forum->query()
84
            ->fetch_forum($forum_id)
85
            ->fetch_custom($sql_array)
86
            ->set_sorting('t.topic_time')
87
            ->build(true, false, false);
88
    }
89
90
    /**
91
     * {@inheritdoc}
92
     */
93
    public function render_index(\blitze\content\model\entity\type $entity, $page, array $filters, array $topic_data_overwrite = array())
94
    {
95
        $content_type = $entity->get_content_name();
96
        $items_per_page = $entity->get_items_per_page();
97
        $start = ($page - 1) * $items_per_page;
98
99
        $this->build_index_query($filters, $entity);
100
        $this->set_mcp_url($entity->get_forum_id());
101
102
        if ($entity->get_show_pagination())
103
        {
104
            $filter_type = key($filters);
105
            $filter_value = (array) current($filter_value);
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $filter_value seems to be never defined.
Loading history...
106
107
            $total_topics = $this->forum->get_topics_count();
108
            $this->generate_pagination('summary', $total_topics, $start, $items_per_page, array(
109
                'type'			=> $content_type,
110
                'filter_type'	=> $filter_type,
111
                'filter_value'	=> current($filter_value),
112
            ));
113
        }
114
115
        return $this->display_topics($entity, $items_per_page, $start, $topic_data_overwrite);
116
    }
117
118
    /**
119
     * @param \blitze\content\model\entity\type $entity
120
     * @param int $items_per_page
121
     * @param int $start
122
     * @param array $topic_data_overwrite
123
     * @return int
124
     */
125
    protected function display_topics(\blitze\content\model\entity\type $entity, $items_per_page = 1, $start = 0, array $topic_data_overwrite = array())
126
    {
127
        $content_type = $entity->get_content_name();
128
        $topics_data = $this->forum->get_topic_data($items_per_page, $start);
129
        $posts_data = $this->forum->get_post_data('first');
130
        $topic_tracking_info = $this->forum->get_topic_tracking_info($entity->get_forum_id());
131
        $users_cache = $this->forum->get_posters_info();
132
        $attachments = $this->forum->get_attachments($entity->get_forum_id());
133
134
        $this->fields->prepare_to_show($entity, array_keys($topics_data), $entity->get_summary_fields(), $entity->get_summary_tpl(), 'summary');
135
136
        $update_count = array();
137
        $max_update_time = 0;
138
139
        foreach ($posts_data as $topic_id => $posts)
140
        {
141
            $post_data	= array_shift($posts);
142
            $topic_data	= $topics_data[$topic_id];
143
            $topic_data = array_merge(
144
                $this->fields->show($content_type, $topic_data, $post_data, $users_cache, $attachments, $update_count, $topic_tracking_info),
145
                $topic_data_overwrite
146
            );
147
148
            $this->template->assign_block_vars('topicrow', $topic_data);
149
            $max_update_time = max($max_update_time, $topic_data['UPDATED']);
150
        }
151
        unset($topics_data, $posts_data, $users_cache, $attachments, $topic_tracking_info);
152
153
        return $max_update_time;
154
    }
155
156
    /**
157
     * {@inheritdoc}
158
     */
159
    public function render_detail(\blitze\content\model\entity\type $entity, $topic_id, array &$update_count, array $topic_data_overwrite = array())
160
    {
161
        $this->language->add_lang('viewtopic');
162
        $this->language->add_lang('content', 'blitze/content');
163
        $this->set_mcp_url($entity->get_forum_id(), $topic_id);
164
165
        $this->forum->query()
166
            ->fetch_topic($topic_id)
167
            ->fetch_watch_status()
168
            ->fetch_bookmark_status()
169
            ->build(true, true, false);
170
171
        return $this->display_topic($topic_id, $entity, $update_count, $topic_data_overwrite);
172
    }
173
174
    /**
175
     * @param int $topic_id
176
     * @param \blitze\content\model\entity\type $entity
177
     * @param array $update_count
178
     * @param array $topic_data_overwrite
179
     * @return array
180
     * @throws \Exception
181
     */
182
    protected function display_topic($topic_id, \blitze\content\model\entity\type $entity, array &$update_count, array $topic_data_overwrite)
183
    {
184
        $forum_id = $entity->get_forum_id();
185
        $content_type = $entity->get_content_name();
186
187
        $topics_data = $this->forum->get_topic_data();
188
        $post_data = $this->forum->get_post_data('first');
189
        $topic_tracking_info = $this->forum->get_topic_tracking_info($forum_id);
190
        $users_cache = $this->forum->get_posters_info();
191
        $attachments = $this->forum->get_attachments($forum_id);
192
193
        if (!sizeof($post_data))
194
        {
195
            throw new \Exception($this->language->lang('CONTENT_NO_EXIST'));
196
        }
197
198
        $this->fields->prepare_to_show($entity, array_keys($topics_data), $entity->get_detail_fields(), $entity->get_detail_tpl(), 'detail');
199
200
        $topic_data = array_shift($topics_data);
201
        $post_data = array_shift($post_data[$topic_id]);
202
        $tpl_data = array_merge($topic_data,
203
            $this->fields->show($content_type, $topic_data, $post_data, $users_cache, $attachments, $update_count, $topic_tracking_info, $topic_data_overwrite),
204
            $this->fields->get_topic_tools_data($topic_data)
205
        );
206
207
        $this->template->assign_vars(array_change_key_case($tpl_data, CASE_UPPER));
208
        $this->fields->show_attachments($attachments, $post_data['post_id']);
209
        $this->show_topic_blocks($entity, $topic_data, $post_data, array_shift($users_cache));
210
        $this->quickmod->show_tools($topic_data);
211
        $this->set_meta_tags($entity->get_detail_fields(), $tpl_data);
212
213
        return array_merge($topic_data, array(
214
            'topic_title'		=> $tpl_data['TOPIC_TITLE'],
215
            'total_comments'	=> $tpl_data['TOPIC_COMMENTS'],
216
            'topic_url'			=> $tpl_data['TOPIC_URL'],
217
        ));
218
    }
219
220
    /**
221
     * @param array $attachments
222
     * @param int $post_id
223
     * @return void
224
     */
225
    protected function show_attachments(array $attachments, $post_id)
226
    {
227
        if (!empty($attachments[$post_id]))
228
        {
229
            foreach ($attachments[$post_id] as $attachment)
230
            {
231
                $this->template->assign_block_vars('attachment', array(
232
                        'DISPLAY_ATTACHMENT'	=> $attachment)
233
                );
234
            }
235
        }
236
    }
237
238
    /**
239
     * @param string $view_mode
240
     * @param int $total_topics
241
     * @param int $start
242
     * @param int $items_per_page
243
     * @param array $params
244
     */
245
    protected function generate_pagination($view_mode, $total_topics, &$start, $items_per_page, array $params)
246
    {
247
        $params = array_filter($params);
248
        $route_type = $this->get_route_type($view_mode, $params);
249
        $start = $this->pagination->validate_start($start, $items_per_page, $total_topics);
250
        $this->pagination->generate_template_pagination(
251
            array(
252
                'routes' => array(
253
                    'blitze_content_' . $route_type,
254
                    'blitze_content_' . $route_type . '_page',
255
                ),
256
                'params' => $params,
257
            ),
258
            'pagination', 'page', $total_topics, $items_per_page, $start
259
        );
260
    }
261
262
    /**
263
     * @param string $view_mode
264
     * @param array $params
265
     * @return string
266
     */
267
    protected function get_route_type($view_mode, array $params)
268
    {
269
        $types = array(
270
            'show'		=> 'show',
271
            'summary'	=> join('_', array_filter(array(
272
                (!empty($params['type'])) ? 'type' : '',
273
                (!empty($params['filters'])) ? 'multi' : '',
274
                (!empty($params['filter_type'])) ? 'filter' : '',
275
            ))),
276
        );
277
278
        return $types[$view_mode];
279
    }
280
281
    /**
282
     * {@inheritdoc}
283
     */
284
    protected function get_filter_sql(array $filters, $forum_id)
285
    {
286
        $sql_array = array();
287
288
        /**
289
         * Event to filter topics by field value e.g category/food
290
         *
291
         * @event blitze.content.view.filter
292
         * @var mixed								forum_id		Forum id, if available
293
         * @var array								filters			Filters
294
         * @var array								sql_array		Array to modify sql query to get topics
295
         */
296
        $vars = array('forum_id', 'filters', 'sql_array');
297
        extract($this->phpbb_dispatcher->trigger_event('blitze.content.view.filter', compact($vars)));
298
299
        return $sql_array;
300
    }
301
302
    /**
303
     * @param \blitze\content\model\entity\type $entity
304
     * @param array $topic_data
305
     * @param array $post_data
306
     * @param array $user_cache
307
     * @return void
308
     */
309
    protected function show_topic_blocks(\blitze\content\model\entity\type $entity, array $topic_data, array $post_data, array $user_cache)
310
    {
311
        $topic_blocks = $entity->get_topic_blocks();
312
        foreach ($topic_blocks as $service_name)
313
        {
314
            /** @var \blitze\content\services\topic\driver\block_interface $block */
315
            if ($block = $this->topic_blocks_factory->get($service_name))
316
            {
317
                $block->show_block($entity, $topic_data, $post_data, $user_cache);
318
            }
319
        }
320
    }
321
322
    /**
323
     * @param int $forum_id
324
     * @param int $topic_id
325
     * @return void
326
     */
327
    protected function set_mcp_url($forum_id, $topic_id = 0)
328
    {
329
        $this->template->assign_var('U_MCP', $this->helper->get_mcp_url($forum_id, $topic_id));
330
    }
331
332
    /**
333
     * @param array $field_types
334
     * @param array $topic_data
335
     * @return void
336
     */
337
    protected function set_meta_tags(array $field_types, array $topic_data)
338
    {
339
        $image_url = $this->get_topic_image_url($field_types, $topic_data['FIELDS']['all']);
340
        $description = $this->get_topic_description($field_types, $topic_data['FIELDS']['all']);
341
342
        $meta = "<meta name=\"description\" content=\"$description\" />\n";
343
        $meta .= "<meta name=\"twitter:card\" value=\"summary\">\n";
344
        $meta .= "<meta property=\"og:title\" content=\"{$topic_data['TOPIC_TITLE']}\" />\n";
345
        $meta .= "<meta property=\"og:type\" content=\"article\" />\n";
346
        $meta .= "<meta property=\"og:url\" content=\"{$topic_data['PERMA_LINK']}\" />\n";
347
        $meta .= "<meta property=\"og:image\" content=\"$image_url\" />\n";
348
        $meta .= "<meta property=\"og:description\" content=\"$description\" />";
349
350
        $this->template->assign_var('META', $meta);
351
    }
352
353
    /**
354
     * @param array $field_types
355
     * @param array $fields_data
356
     * @return string
357
     */
358
    protected function get_topic_image_url(array $field_types, array $fields_data)
359
    {
360
        $image_url = '';
361
362
        $image_field = $this->get_field_name($field_types, 'image');
363
        if (null !== ($figure = $fields_data[$image_field]) && preg_match('/src="(.*?)"/i', $figure, $matches))
364
        {
365
            $image_url = $matches[1];
366
        }
367
368
        return $image_url;
369
    }
370
371
    /**
372
     * @param array $field_types
373
     * @param array $fields_data
374
     * @return string
375
     */
376
    protected function get_topic_description(array $field_types, array $fields_data)
377
    {
378
        $desc_field = $this->get_field_name($field_types, 'textarea');
379
380
        if (null !== ($description = $fields_data[$desc_field]))
381
        {
382
            $description = implode(' ', array_slice(explode(' ', strip_tags($description)), 1, 20));
383
        }
384
385
        return $description;
386
    }
387
388
    /**
389
     * @param array $field_types
390
     * @param string $search_field
391
     * @return string
392
     */
393
    protected function get_field_name(array $field_types, $search_field)
394
    {
395
        $results = array_keys($field_types, $search_field);
396
        return array_shift($results);
397
    }
398
}
399