Blame view

common/modules/product/models/Export.php 7.95 KB
d8c1a2e0   Yarik   Big commit artbox
1
  <?php
36d1807a   Yarik   Big commit.
2
3
4
      
      namespace common\modules\product\models;
      
96410438   Yarik   Project admin com...
5
      use common\modules\language\models\Language;
72a992f5   Yarik   Import browser v1.0
6
      use common\modules\rubrication\models\TaxOption;
36d1807a   Yarik   Big commit.
7
8
9
10
      use yii\base\Model;
      
      class Export extends Model
      {
c70f24ea   Yarik   For Leha commit.
11
12
13
14
15
          /**
           * Language ID to export language tables
           *
           * @var int $lang
           */
96410438   Yarik   Project admin com...
16
17
18
19
          public $lang;
          
          public $file;
          
36d1807a   Yarik   Big commit.
20
21
22
23
          public $errors = [];
          
          public $output = [];
          
c70f24ea   Yarik   For Leha commit.
24
25
26
          /**
           * @inheritdoc
           */
96410438   Yarik   Project admin com...
27
28
29
30
31
32
33
34
35
36
          public function rules()
          {
              return [
                  [
                      'lang',
                      'integer',
                  ],
                  [
                      'lang',
                      'default',
8af13427   Yarik   For leha commit.
37
                      'value' => Language::getCurrent()->id,
96410438   Yarik   Project admin com...
38
39
40
41
                  ],
              ];
          }
          
c70f24ea   Yarik   For Leha commit.
42
43
44
45
46
47
48
49
          /**
           * Perform product export
           *
           * @param null|string $filename Export csv file name
           * @param int         $from     Product start
           *
           * @return array
           */
4428da8c   Yarik   Almost all databa...
50
          public function process($filename = null, $from = 0)
d8c1a2e0   Yarik   Big commit artbox
51
          {
96410438   Yarik   Project admin com...
52
53
              $limit = 100;
              
4428da8c   Yarik   Almost all databa...
54
              if (empty( $filename )) {
36d1807a   Yarik   Big commit.
55
                  $filename = 'products_' . date('d_m_Y_H_i') . '.csv';
96410438   Yarik   Project admin com...
56
57
58
                  $handle = fopen(\Yii::getAlias('@storage/sync/') . $filename, "w");
              } else {
                  $handle = fopen(\Yii::getAlias('@storage/sync/') . $filename, "a");
d8c1a2e0   Yarik   Big commit artbox
59
              }
96410438   Yarik   Project admin com...
60
              
8af13427   Yarik   For leha commit.
61
              $language = Language::findOne(\Yii::$app->session->get('export_lang', Language::getDefaultLanguage()->id));
96410438   Yarik   Project admin com...
62
              Language::setCurrent($language->url);
5c2eb7c8   Yarik   Big commit almost...
63
              
72a992f5   Yarik   Import browser v1.0
64
65
66
              /**
               * @var Product[] $products
               */
36d1807a   Yarik   Big commit.
67
              $products = Product::find()
af036678   Yarik   Image behaviors
68
                                 ->with('variantsWithFilters', 'brand.lang', 'categories.lang', 'filters', 'images')
96410438   Yarik   Project admin com...
69
70
71
                                 ->joinWith('lang', true, 'INNER JOIN')
                                 ->limit($limit)
                                 ->offset($from)
36d1807a   Yarik   Big commit.
72
                                 ->all();
96410438   Yarik   Project admin com...
73
74
75
              $filesize = Product::find()
                                 ->joinWith('lang', true, 'INNER JOIN')
                                 ->count();
4428da8c   Yarik   Almost all databa...
76
              foreach ($products as $product) {
36d1807a   Yarik   Big commit.
77
78
79
                  $mods = [];
                  $filterString = $this->convertFilterToString($product->filters);
                  
4428da8c   Yarik   Almost all databa...
80
                  foreach ($product->variantsWithFilters as $variant) {
72a992f5   Yarik   Import browser v1.0
81
82
83
                      /**
                       * @var ProductVariant $variant
                       */
8af13427   Yarik   For leha commit.
84
                      $color = $variant->lang->title;
4428da8c   Yarik   Almost all databa...
85
86
87
88
89
                      $mods[] = $variant->sku . $this->generateID(
                              $variant->remote_id
                          ) . '=' . $this->convertFilterToString(
                              $variant->filters
                          ) . '=' . $color . '=' . ( ( !empty( $variant->image ) ) ? $variant->image->image : '' ) . '=' . $variant->stock;
36d1807a   Yarik   Big commit.
90
91
92
                  }
                  
                  $fotos = [];
4428da8c   Yarik   Almost all databa...
93
                  foreach ($product->images as $image) {
af036678   Yarik   Image behaviors
94
95
                      $fotos[] = $image->image;
                  }
36d1807a   Yarik   Big commit.
96
97
                  
                  $categories = [];
4428da8c   Yarik   Almost all databa...
98
                  foreach ($product->categories as $value) {
8af13427   Yarik   For leha commit.
99
                      $categories[] = $value->lang->title . $this->generateID($value->remote_id);
36d1807a   Yarik   Big commit.
100
101
102
103
104
                  }
                  
                  $categories = implode(',', $categories);
                  
                  $list = [
5c2eb7c8   Yarik   Big commit almost...
105
106
                      $categories,
                      //A - категории через запятую Название(remote_id)
4428da8c   Yarik   Almost all databa...
107
108
109
                      ( ( !empty( $product->brand ) ) ? $product->brand->lang->title . $this->generateID(
                              $product->brand->remote_id
                          ) : '' ),
5c2eb7c8   Yarik   Big commit almost...
110
                      //B - бренд Название(remote_id)
8af13427   Yarik   For leha commit.
111
                      $product->lang->title . $this->generateID($product->remote_id),
5c2eb7c8   Yarik   Big commit almost...
112
113
114
115
116
117
118
119
120
                      //C - название товара Название(remote_id)
                      ( ( !empty( $product->lang->description ) ) ? $product->lang->description : '' ),
                      //D - описание товара Описание(remote_id)
                      $filterString,
                      //E - характеристики товара. Структура: [Группа1(remote_id):Характеристика11(remote_id),Характеристика12(remote_id)]*[Группа2(remote_id):Характеристика21(remote_id),Характеристика22(remote_id)]
                      ( !empty( $product->variant ) ) ? $product->variant->price_old : '',
                      //F - страрая цена
                      ( !empty( $product->variant ) ) ? $product->variant->price : '',
                      //G - новая цена
4428da8c   Yarik   Almost all databa...
121
                      intval($product->is_discount),
5c2eb7c8   Yarik   Big commit almost...
122
123
124
125
126
127
128
129
130
131
132
                      //H - товар акционный (1/0)
                      '',
                      //I - пустой
                      intval($product->is_new),
                      //J - товар новинка
                      intval($product->is_top),
                      //K - товар в топе
                      $product->video,
                      //L - ссылка на видео (iframe)
                      implode(',', $fotos),
                      //M - название файлов через запятую, картинки должны хранится в /storage/sync/product_images
af036678   Yarik   Image behaviors
133
                      // Все последующие модификации: SKU(remote_id)=[Группа1(remote_id):Характеристика11(remote_id),Характеристика12(remote_id)]*[Группа2(remote_id):Характеристика21(remote_id),Характеристика22(remote_id)]=Название=Изображение=Остаток
36d1807a   Yarik   Big commit.
134
135
                  ];
                  $to_write = array_merge($list, $mods);
36d1807a   Yarik   Big commit.
136
137
                  fputcsv($handle, $to_write, ';');
                  unset( $product );
d8c1a2e0   Yarik   Big commit artbox
138
              }
36d1807a   Yarik   Big commit.
139
140
141
              
              fclose($handle);
              
96410438   Yarik   Project admin com...
142
143
              $from += $limit;
              $end = false;
4428da8c   Yarik   Almost all databa...
144
              if ($from > $filesize) {
96410438   Yarik   Project admin com...
145
146
147
148
149
150
151
152
153
154
                  $end = true;
              }
              
              $result = [
                  'end'       => $end,
                  'from'      => $from,
                  'totalsize' => $filesize,
                  'filename'  => $filename,
              ];
              
4428da8c   Yarik   Almost all databa...
155
156
157
158
159
160
161
              if ($end) {
                  $result = array_merge(
                      $result,
                      [
                          'link' => '/storage/sync/' . $filename,
                      ]
                  );
96410438   Yarik   Project admin com...
162
163
164
              }
              
              return $result;
d8c1a2e0   Yarik   Big commit artbox
165
          }
36d1807a   Yarik   Big commit.
166
          
c70f24ea   Yarik   For Leha commit.
167
168
169
170
171
172
173
174
          /**
           * Stringify filters for export
           * * Result: [filterName1:filterValue11,filterValue12]*[filterName2:filterValue21,filterValue22]
           *
           * @param $filters
           *
           * @return string
           */
36d1807a   Yarik   Big commit.
175
176
          public function convertFilterToString($filters)
          {
c70f24ea   Yarik   For Leha commit.
177
              $filtersArray = [];
72a992f5   Yarik   Import browser v1.0
178
179
180
              /**
               * @var TaxOption[] $filters
               */
4428da8c   Yarik   Almost all databa...
181
              foreach ($filters as $filter) {
c70f24ea   Yarik   For Leha commit.
182
                  $filtersArray[ $filter->taxGroup->lang->title . $this->generateID(
4428da8c   Yarik   Almost all databa...
183
184
                      $filter->taxGroup->remote_id
                  ) ][] = $filter->lang->value . $this->generateID($filter->remote_id);
36d1807a   Yarik   Big commit.
185
186
187
              }
              $filterString = [];
              
c70f24ea   Yarik   For Leha commit.
188
              foreach ($filtersArray as $filterName => $filterRows) {
36d1807a   Yarik   Big commit.
189
190
191
192
                  $row = implode(',', $filterRows);
                  $filterString[] = "[{$filterName}:{$row}]";
              }
              return implode('*', $filterString);
d8c1a2e0   Yarik   Big commit artbox
193
          }
72a992f5   Yarik   Import browser v1.0
194
          
c70f24ea   Yarik   For Leha commit.
195
196
197
198
199
200
201
          /**
           * Generate remote ID string
           *
           * @param string $id Remote ID
           *
           * @return string Formatted remote ID
           */
5c2eb7c8   Yarik   Big commit almost...
202
203
          private function generateID(string $id):string
          {
72a992f5   Yarik   Import browser v1.0
204
205
              return sprintf('(#%s#)', $id);
          }
c70f24ea   Yarik   For Leha commit.
206
207
      }