Blame view

components/artboxtree/ArtboxTreeQueryTrait.php 3.19 KB
01799a55   Yarik   first commit
1
2
  <?php

      

d0c66642   Yarik   Namespaces
3
      namespace artweb\artbox\components\artboxtree;

01799a55   Yarik   first commit
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
97
98
99
100
      

      trait ArtboxTreeQueryTrait

      {

          

          public static $cacheTree = [];

          

          /** @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;

          }

      }