Passed
Push — master ( eefbba...580dba )
by Aleksandr
02:45
created

Article::formForTitle()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 11
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 5
nc 2
nop 1
dl 0
loc 11
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace carono\exchange1c\models;
4
5
use carono\exchange1c\models\query\ArticleQuery;
6
use Yii;
7
use \carono\exchange1c\models\base\Article as BaseArticle;
8
use yii\behaviors\TimestampBehavior;
9
use yii\db\ActiveQuery;
10
use yii\db\Expression;
11
use yii\helpers\ArrayHelper;
12
use yii\helpers\FileHelper;
13
14
/**
15
 * This is the model class for table "article".
16
 *
17
 * @property Article parent
18
 * @property Article[] articles
19
 */
20
class Article extends BaseArticle
21
{
22
    /**
23
     * @return ArticleQuery|ActiveQuery
24
     */
25
    public function getParent()
26
    {
27
        return $this->hasOne(Article::class, ['id' => 'parent_id']);
28
    }
29
30
    /**
31
     * @return ArticleQuery|ActiveQuery
32
     */
33
    public function getArticles()
34
    {
35
        return $this->hasMany(Article::class, ['parent_id' => 'id']);
36
    }
37
38
    /**
39
     * @return null|object|\yii\db\Connection|mixed
40
     */
41
    public static function getDb()
42
    {
43
        return Yii::$app->get('exchangeDb');
44
    }
45
46
    /**
47
     * @return array
48
     */
49
    public function behaviors()
50
    {
51
        return [
52
            'timestamp' => [
53
                'class' => TimestampBehavior::class,
54
                'value' => new Expression('CURRENT_TIMESTAMP')
55
            ]
56
        ];
57
    }
58
59
    /**
60
     * @return array
61
     */
62
    public function formForMenu()
63
    {
64
        /**
65
         * @var Article $subGroup
66
         */
67
        $item = ['label' => $this->name, 'url' => ['article/view', 'id' => $this->id]];
68
        foreach ($this->getArticles()->orderBy(['[[pos]]' => SORT_ASC])->each() as $subGroup) {
69
            $item['items'][] = $subGroup->formForMenu();
70
        }
71
        return $item;
72
    }
73
74
    /**
75
     * @param int|null $parent
76
     * @return array
77
     */
78
    public static function formMenuItems($parent = null)
79
    {
80
        /**
81
         * @var Article $group
82
         */
83
        $items = [];
84
        $query = self::find()->andWhere(['parent_id' => $parent])->orderBy(['[[pos]]' => SORT_ASC]);
85
        foreach ($query->each() as $group) {
86
            $items[] = $group->formForMenu();
87
        }
88
        return $items;
89
    }
90
91
    /**
92
     * @param int $deep
93
     * @return array
94
     */
95
    public function formForTitle($deep = 0)
96
    {
97
        /**
98
         * @var Article $subGroup
99
         */
100
        $item = [];
101
        $item[] = str_repeat("\t", $deep) . '* ' . "[{$this->name}](#{$this->id})";
102
        foreach ($this->getArticles()->orderBy(['[[pos]]' => SORT_ASC])->each() as $subGroup) {
103
            $item[] = $subGroup->formForTitle($deep + 1);
104
        }
105
        return implode("\n", $item);
0 ignored issues
show
Bug Best Practice introduced by
The expression return implode(' ', $item) returns the type string which is incompatible with the documented return type array.
Loading history...
106
    }
107
108
    /**
109
     * @param int|null $parent
110
     * @return array
111
     */
112
    public static function formTitleItems($parent = null)
113
    {
114
        /**
115
         * @var Article $group
116
         */
117
        $items = [];
118
        $query = self::find()->andWhere(['parent_id' => $parent])->orderBy(['[[pos]]' => SORT_ASC]);
119
        foreach ($query->each() as $group) {
120
            $items[] = $group->formForTitle();
121
        }
122
        return $items;
123
    }
124
125
    /**
126
     * @return false|int
127
     */
128
    public function delete()
129
    {
130
        $files = self::extractFilesFromString($this->content);
131
        foreach ($files as $file) {
132
            $uploadFile = Yii::$app->controller->module->redactor->uploadDir . '/' . $file;
133
            FileHelper::unlink($uploadFile);
134
        }
135
        foreach ($this->articles as $article) {
136
            $article->delete();
137
        }
138
        return parent::delete();
139
    }
140
141
    /**
142
     * @param $content
143
     * @return mixed
144
     */
145
    public static function extractFilesFromString($content)
146
    {
147
        preg_match_all('#/file/article\?file=([\w\-\/\.]+)"#ui', $content, $m);
148
        return $m[1];
149
    }
150
151
    /**
152
     * @param bool $insert
153
     * @param array $changedAttributes
154
     */
155
    public function afterSave($insert, $changedAttributes)
156
    {
157
        if ($content = ArrayHelper::getValue($changedAttributes, 'content')) {
158
            $old = self::extractFilesFromString($content);
159
            $new = self::extractFilesFromString($this->content);
160
            foreach (array_diff($old, $new) as $file) {
161
                $uploadFile = Yii::$app->controller->module->redactor->uploadDir . '/' . $file;
162
                FileHelper::unlink($uploadFile);
163
            }
164
        }
165
        parent::afterSave($insert, $changedAttributes);
166
    }
167
}
168