Completed
Push — development ( eb9524...db4517 )
by Andrij
28:49 queued 02:09
created

Similar_Posts::getPagesByTitle()   B

Complexity

Conditions 4
Paths 4

Size

Total Lines 32
Code Lines 20

Duplication

Lines 0
Ratio 0 %
Metric Value
dl 0
loc 32
rs 8.5806
cc 4
eloc 20
nc 4
nop 0
1
<?php
2
3
if (!defined('BASEPATH')) {
4
    exit('No direct script access allowed');
5
}
6
7
/**
8
 * Class Similar_Posts
9
 * Search similar pages to current which is shown
10
 */
11
class Similar_Posts
12
{
0 ignored issues
show
introduced by
Opening brace of a class must be on the same line as the definition
Loading history...
13
14
    /**
15
     * @var array
16
     */
17
    private $defaultSettings = [
18
        'categories' => ['all'],
19
        'limit' => 5,
20
        'max_short_description_words' => 500,
21
    ];
22
23
    /**
24
     * @var array
25
     */
26
    private $settings = [];
27
28
    /**
29
     * Page title to search similar
30
     * @var string
31
     */
32
    private $pageTitle = '';
33
34
    /**
35
     * Page id to search similar
36
     * @var int
37
     */
38
    private $pageId;
39
40
    public function __construct() {
41
42
    }
43
44
    /**
45
     * @return array
46
     */
47
    public function getDefaultSettings() {
48
        return $this->defaultSettings;
49
    }
50
51
    /**
52
     * @param array $settings
53
     */
54
    private function initSettings($settings) {
55
        foreach ($this->defaultSettings as $settingName => $setting) {
56
            $this->settings[$settingName] = $settings[$settingName] ?: $setting;
57
        }
58
    }
59
60
    /**
61
     * @param string $title
62
     */
63
    private function setPageTitle($title) {
64
        $title = str_replace([',', ';', ':', '-', '+', '=', '@', '.', '/', '\''], '', $title);
65
        $this->pageTitle = $title;
66
    }
67
68
    /**
69
     * @param int $pageId
70
     */
71
    private function setPageId($pageId) {
72
        $this->pageId = $pageId;
73
    }
74
75
    /**
76
     * Start find similar pages
77
     * @param int $pageId
78
     * @param string $title
79
     * @param array $settings
80
     * @return array
81
     */
82
    public function find($pageId, $title, $settings) {
83
        $this->initSettings($settings);
84
        $this->setPageTitle($title);
85
        $this->setPageId($pageId);
86
        return $this->search();
87
    }
88
89
    /**
90
     * Search pages
91
     * @return array
92
     */
93
    private function search() {
94
        $pages = $this->getPagesByTags();
95
96
        $prevTextLimit = $this->settings['max_short_description_words'];
97
        if ($prevTextLimit) {
98
            foreach ($pages as $key => $page) {
99
                $pages[$key]['prev_text'] = mb_strlen($page['prev_text']) > $prevTextLimit ? strip_tags(mb_substr($page['prev_text'], 0, $prevTextLimit)) . '...' : $page['prev_text'];
100
            }
101
        }
102
103
        return $pages;
104
    }
105
106
    /**
107
     * Search pages by tags
108
     * @return array
109
     */
110
    private function getPagesByTags() {
111
        $query = '
112
                SELECT page.*, count(page_tags.tag_id) AS tags_count
113
                FROM `content` AS page
114
                JOIN content_tags  AS page_tags
115
                ON page_tags.page_id = page.id
116
                WHERE tag_id IN (SELECT tag_id FROM content_tags WHERE page_id = ' . $this->pageId . ")  AND `page`.`post_status`='publish'
117
                AND page.id != " . $this->pageId
118
                . ' AND page.lang = ' . CI::$APP->config->item('cur_lang');
119
120
        if (!in_array('all', $this->settings['categories'])) {
121
            $query .= ' AND page.category IN (' . implode(',', $this->settings['categories']) . ')';
122
        }
123
124
        $query .= ' GROUP BY page.id ORDER BY tags_count DESC';
125
        if ($this->settings['limit']) {
126
            $query .= ' LIMIT ' . $this->settings['limit'];
127
        }
128
129
        $result = CI::$APP->db->query($query);
130
131
        return $result ? $result->result_array() : [];
132
    }
133
}