Blame view

common/components/artboxtree/ArtboxTreeQueryTrait.php 2.72 KB
4253cbec   root   first commit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
  <?php

  

  namespace common\components\artboxtree;

  

  use common\components\artboxtree\ArtboxTreeHelper;

  

  trait ArtboxTreeQueryTrait {

  

      static public $cache_tree = [];

  

      /** @var \yii\db\ActiveQuery $this */

      static $model;

  

      /*

       * @return \yii\db\ActiveQuery

       */

      private function getModel()

      {

          if (empty(self::$model)) {

              $class = $this->modelClass;

              self::$model = new $class;

          }

          return self::$model;

      }

  

      public function getTree($group = null, $with = null) {

          $model = $this->getModel();

          if ($group !== null) {

              $this->andWhere([$model->keyNameGroup => $group]);

          }

          if ($with) {

              $this->with($with);

          }

          $data = $this->all();

          if (empty($data))

              return [];

  

          return $this->buildTree($data);

      }

  

      private function _recursiveRebuild($tree, $parentPath = null, $depth = 0) {

          $model = $this->getModel();

  

          foreach ($tree as $row) {

              $path = (is_null($parentPath) ? '' : $parentPath . $model->delimiter) . $row['item']->getAttribute($model->keyNameId);

              $row['item']->setAttribute($model->keyNamePath, $path);

              $row['item']->setAttribute($model->keyNameDepth, $depth);

              $row['item']->save();

              if (!empty($row['children'])) {

                  $this->_recursiveRebuild($row['children'], $path, $depth+1);

              }

          }

      }

  

      /**

       * @param int $group

       */

      public function rebuildMP($group, $with = null) {

          $tree = $this->getTree($group, $with);

  

          $this->_recursiveRebuild($tree);

      }

  

      protected function buildTree(array $data, $parentId = 0) {

          $model = $this->getModel();

  

          $result = [];

          foreach ($data as $element) {

              if ($element[$model->keyNameParentId] == $parentId) {

                  $children = $this->buildTree($data, $element[$model->keyNameId]);

                  $result[] = [

                      'item' => $element,

                      'children' => $children

                  ];

              }

          }

          return $result;

      }

  

      public function normalizeTreeData(array $data, $parentId = null)

      {

          $model = $this->getModel();

  

          $result = [];

          foreach ($data as $element) {

              if ($element[$model->keyNameParentId] == $parentId) {

                  $result[] = $element;

                  $children = $this->normalizeTreeData($data, $element[$model->keyNameId]);

                  if ($children) {

                      $result = array_merge($result, $children);

                  }

              }

          }

          return $result;

      }

  }