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

base_view::render_index()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 23
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 0
Metric Value
cc 2
eloc 14
nc 2
nop 4
dl 0
loc 23
ccs 0
cts 19
cp 0
crap 6
rs 9.0856
c 0
b 0
f 0
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