Export.php 4.67 KB
<?php
    
    namespace common\modules\product\models;
    
    use common\modules\language\models\Language;
    use yii\base\Model;
    
    class Export extends Model
    {
        
        public $lang;
        
        public $file;
        
        public $errors = [];
        
        public $output = [];
        
        public function rules()
        {
            return [
                [
                    'lang',
                    'integer',
                ],
                [
                    'lang',
                    'default',
                    'value' => Language::getCurrent()->language_id,
                ],
            ];
        }
        
        public function process($filename = NULL, $from = 0)
        {
            $limit = 100;
            
            if(empty( $filename )) {
                $filename = 'products_' . date('d_m_Y_H_i') . '.csv';
                $handle = fopen(\Yii::getAlias('@storage/sync/') . $filename, "w");
            } else {
                $handle = fopen(\Yii::getAlias('@storage/sync/') . $filename, "a");
            }
            
            $language = Language::findOne(\Yii::$app->session->get('export_lang', Language::getDefaultLanguage()->language_id));
            Language::setCurrent($language->url);
            
            $products = Product::find()
                               ->with('variantsWithFilters', 'brand.lang', 'categories.lang', 'filters')
                               ->joinWith('lang', true, 'INNER JOIN')
                               ->limit($limit)
                               ->offset($from)
                               ->all();
            $filesize = Product::find()
                               ->joinWith('lang', true, 'INNER JOIN')
                               ->count();
            foreach($products as $product) {
                $mods = [];
                $filterString = $this->convertFilterToString($product->filters);
                
                foreach($product->variantsWithFilters as $variant) {
                    $color = $variant->lang->name;
                    $mods[] = $variant->sku . '=' . $this->convertFilterToString($variant->filters) . '=' . $color . '=' . ( ( !empty( $variant->image ) ) ? $variant->image->image : '' ) . '=' . $variant->stock;
                }
                
                $fotos = [];
                
                $categories = [];
                foreach($product->categories as $value) {
                    $categories[] = $value->lang->name;
                }
                
                $categories = implode(',', $categories);
                
                $list = [
                    $categories,
                    ( ( !empty( $product->brand ) ) ? $product->brand->lang->name : '' ),
                    $product->lang->name,
                    '',
                    ( ( !empty( $product->lang->description ) ) ? $product->lang->description : '' ),
                    $filterString,
                    ( !empty( $product->variant ) ) ? $product->variant->price_old : '',
                    ( !empty( $product->variant ) ) ? $product->variant->price : '',
                    intval($product->akciya),
                    '',
                    intval($product->is_new),
                    intval($product->is_top),
                    $product->video,
                    implode(',', $fotos),
                ];
                $to_write = array_merge($list, $mods);
                fputcsv($handle, $to_write, ';');
                unset( $product );
            }
            
            fclose($handle);
            
            $from += $limit;
            $end = false;
            if($from > $filesize) {
                $end = true;
            }
            
            $result = [
                'end'       => $end,
                'from'      => $from,
                'totalsize' => $filesize,
                'filename'  => $filename,
            ];
            
            if($end) {
                $result = array_merge($result, [
                    'link' => '/storage/sync/' . $filename,
                ]);
            }
            
            return $result;
            
        }
        
        public function convertFilterToString($filters)
        {
            $fittersArray = [];
            foreach($filters as $filter) {
                $fittersArray[ $filter->taxGroup->alias ][] = $filter->lang->value;
            }
            $filterString = [];
            
            foreach($fittersArray as $filterName => $filterRows) {
                $row = implode(',', $filterRows);
                $filterString[] = "[{$filterName}:{$row}]";
            }
            return implode('*', $filterString);
        }
    }