SiteMapController.php 10.2 KB
<?php
    
    namespace artweb\artbox\ecommerce\console;
    
    use artweb\artbox\ecommerce\models\Brand;
    use artweb\artbox\ecommerce\models\ProductVariant;
    use artweb\artbox\language\models\Language;
    use artweb\artbox\seo\models\Seo;
    use artweb\artbox\ecommerce\models\Category;
    use artweb\artbox\ecommerce\models\Product;
    use artweb\artbox\ecommerce\models\ProductFrontendSearch;
    use Yii;
    use artweb\artbox\models\Page;
    use yii\helpers\ArrayHelper;
    use yii\helpers\Url;
    use yii\console\Controller;
    
    /**
     * PageController implements the CRUD actions for Page model.
     */
    class SiteMapController extends Controller
    {
        
        private $urlList = [ 'https://dev.extremstyle.ua/ru' ];
        private $count = 1;
        
        public function checkFilter($category, $filter)
        {
            $productModel = new ProductFrontendSearch();
            $productProvider = $productModel->search($category, $filter);
            if (!empty( $productProvider->models )) {
                return true;
            } else {
                return false;
            }
        }
        
        public function getAddStatic()
        {
            return [
                'https://dev.extremstyle.ua/ru',
            ];
        }
        
        public function getVariants()
        {
            return ProductVariant::find()
                                 ->with('lang')
                                 ->with('product.lang')
                                 ->batch(1000);
            
        }
        
        public function getSeoLinks()
        {
            return Seo::find()
                      ->where([ 'meta' => '' ])
                      ->all();
            
        }
        
        public function getStaticPages()
        {
            return Page::find()
                       ->with('lang')
                       ->all();
        }
        
        public function getCategories()
        {
            return Category::find()
                           ->with('lang')
                           ->all();
        }
        
        public function getCategoriesWithFilters()
        {
            return Category::find()
                           ->with('lang')
                           ->joinWith('taxGroups.lang')
                           ->with('taxGroups.taxOptions.lang')
                           ->where(['tax_group.meta_robots' => '',])
                           ->all();
        }
        
        public function getBrands()
        {
            return Brand::find()
                        ->joinWith('lang')
                        ->all();
        }
        
        /**
         * @param $category Category;
         *
         * @return mixed
         */
        
        public function getFilters($category)
        {
            return $category->getActiveFilters()
                            ->andWhere(
                                [
                    
                                    'tax_group.meta_robots' => '',
                                ]
                            )
                            ->all();
            
        }
        
        public function checkUrl($url)
        {
            if (!in_array($url, $this->urlList)) {
                $this->urlList[] = $url;
                return true;
            } else {
                return false;
            }
        }
        
        public function createRow($url, $priority, &$content)
        {
            if ($this->checkUrl($url)) {
                print $this->count++ . $url . "\n";
                $content .= '<url>' . '<loc>' . $url . '</loc>' . '<lastmod>' . date(
                        'Y-m-d'
                    ) . '</lastmod>' . '<changefreq>Weekly</changefreq>' . '<priority>' . $priority . '</priority>' . '</url>';
            }
        }
        
        public function actionProcess()
        {
            $config = ArrayHelper::merge(
                require( \Yii::getAlias('@frontend/config/') . 'main.php' ),
                require( \Yii::getAlias('@common/config/') . 'main.php' )
            );
            
            Yii::$app->urlManager->addRules($config[ 'components' ][ 'urlManager' ][ 'rules' ]);
            
            $dirName = Yii::getAlias('@frontend') . '/web';
            
            $filename = 'test_sitemap.xml';
            setlocale(LC_ALL, 'ru_RU.CP1251');
            $handle = fopen($dirName . '/' . $filename, "w");
            
            $content = '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
            
            foreach ($this->getAddStatic() as $page) {
                $this->createRow($page, 1, $content);
            }
            
            foreach ($this->getStaticPages() as $page) {
                $url = Url::to(
                    [
                        'site/page',
                        'slug' => $page->lang->alias,
                    ]
                );
                $this->createRow($url, 1, $content);
            }
            
            foreach ($this->getCategories() as $category) {
                $url = Url::to(
                    [
                        'catalog/category',
                        'category' => $category->lang->alias,
                    ]
                );
                $this->createRow($url, 0.8, $content);
            }
            
            foreach ($this->getVariants() as $rows) {
                foreach ($rows as $row) {
                    $url = Url::to(
                        [
                            'catalog/product',
                            'product' => $row->product->lang->alias,
                            'variant' => $row->sku,
                        ]
                    );
                    $this->createRow($url, 0.9, $content);
                }
            }
            
            foreach ($this->getBrands() as $brand) {

                $url = Url::to(
                    [
                        'brand/view',
                        'slug' => $brand->lang->alias,
                    ]
                );
                $this->createRow($url, 0.7, $content);

            }
            
            foreach ($this->getCategoriesWithFilters() as $category) {
                foreach ($category->taxGroups as $group) {
                    foreach ($group->taxOptions as $option) {
                        $url = Url::to(
                            [
                                'catalog/category',
                                'category' => $category,
                                'filters'  => [ $group->lang->alias => [ $option->lang->alias ] ],
                            ]
                        );
                        $this->createRow($url, 0.8, $content);
                    }
                    
                }
            }
            
            foreach ($this->getSeoLinks() as $link) {
                $url = Yii::$app->urlManager->baseUrl . $link->url;
                $this->createRow($url, 0.7, $content);

            }
            
            //            foreach ($this->getCategories() as $category) {
            //                foreach ($this->getFilters($category) as $filter1) {
            //                    foreach ($this->getFilters($category) as $filter2) {
            //                        if ($this->checkFilter(
            //                            $category,
            //                            [
            //                                $filter1[ 'group_alias' ] => [ $filter1[ 'option_alias' ] ],
            //                                $filter2[ 'group_alias' ] => [ $filter2[ 'option_alias' ] ],
            //                            ]
            //                        )
            //                        ) {
            //                            $url = Url::to(
            //                                [
            //                                    'catalog/category',
            //                                    'category' => $category,
            //                                    'filters'  => [
            //                                        $filter1[ 'group_alias' ] => [ $filter1[ 'option_alias' ] ],
            //                                        $filter2[ 'group_alias' ] => [ $filter2[ 'option_alias' ] ],
            //                                    ],
            //                                ]
            //                            );
            //                            $this->createRow($url, 0.7, $content);
            //                        }
            //
            //                    }
            //
            //                    foreach ($this->getBrands($category) as $brand) {
            //                        if ($this->checkFilter(
            //                            $category,
            //                            [
            //                                'brands'                  => [ $brand->id ],
            //                                $filter1[ 'group_alias' ] => [ $filter1[ 'option_alias' ] ],
            //                            ]
            //                        )
            //                        ) {
            //                            $url = Url::to(
            //                                [
            //                                    'catalog/category',
            //                                    'category' => $category,
            //                                    'filters'  => [
            //                                        'brands'                  => [ $brand->alias ],
            //                                        $filter1[ 'group_alias' ] => [ $filter1[ 'option_alias' ] ],
            //                                    ],
            //                                ]
            //                            );
            //                            $this->createRow($url, 0.7, $content);
            //                        }
            //
            //                    }
            //                }
            //            }
            
            $content .= '</urlset>';
            
            fwrite($handle, $content);
            fclose($handle);
            
            print $dirName . '/' . $filename;
        }
        
    }