как сделать sitemap.xml

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

как сделать sitemap.xml

Сообщение svil »

Вызываю в консоли ./yii site-map Sitemap в папке web не создается. По компу не находится.
Получаю ошибки

Код: Выделить всё

PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php/extensions/no-debug-non-zts-20131226/php_curl.dll' - dlopen(/usr/lib/php/extensions/no-debug-non-zts-20131226/php_curl.dll, 9): image not found in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php/extensions/no-debug-non-zts-20131226/php_gd2.dll' - dlopen(/usr/lib/php/extensions/no-debug-non-zts-20131226/php_gd2.dll, 9): image not found in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php/extensions/no-debug-non-zts-20131226/php_mysql.dll' - dlopen(/usr/lib/php/extensions/no-debug-non-zts-20131226/php_mysql.dll, 9): image not found in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php/extensions/no-debug-non-zts-20131226/php_mysqli.dll' - dlopen(/usr/lib/php/extensions/no-debug-non-zts-20131226/php_mysqli.dll, 9): image not found in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php/extensions/no-debug-non-zts-20131226/php_pdo_mysql.dll' - dlopen(/usr/lib/php/extensions/no-debug-non-zts-20131226/php_pdo_mysql.dll, 9): image not found in Unknown on line 0
Exception 'yii\base\InvalidConfigException' with message 'Please configure UrlManager::baseUrl correctly as you are running a console application.'

in /Users/svetlanailina/Sites/shop/vendor/yiisoft/yii2/web/UrlManager.php:573

Stack trace:
#0 /Users/svetlanailina/Sites/shop/vendor/yiisoft/yii2/web/UrlManager.php(404): yii\web\UrlManager->getBaseUrl()
#1 /Users/svetlanailina/Sites/shop/vendor/yiisoft/yii2/helpers/BaseUrl.php(105): yii\web\UrlManager->createUrl(Array)
#2 /Users/svetlanailina/Sites/shop/vendor/yiisoft/yii2/helpers/BaseUrl.php(214): yii\helpers\BaseUrl::toRoute(Array, false)
#3 /Users/svetlanailina/Sites/shop/commands/SiteMapController.php(28): yii\helpers\BaseUrl::to(Array)
#4 [internal function]: app\commands\SiteMapController->actionIndex()
#5 /Users/svetlanailina/Sites/shop/vendor/yiisoft/yii2/base/InlineAction.php(57): call_user_func_array(Array, Array)
#6 /Users/svetlanailina/Sites/shop/vendor/yiisoft/yii2/base/Controller.php(157): yii\base\InlineAction->runWithParams(Array)
#7 /Users/svetlanailina/Sites/shop/vendor/yiisoft/yii2/console/Controller.php(148): yii\base\Controller->runAction('', Array)
#8 /Users/svetlanailina/Sites/shop/vendor/yiisoft/yii2/base/Module.php(528): yii\console\Controller->runAction('', Array)
#9 /Users/svetlanailina/Sites/shop/vendor/yiisoft/yii2/console/Application.php(180): yii\base\Module->runAction('site-map', Array)
#10 /Users/svetlanailina/Sites/shop/vendor/yiisoft/yii2/console/Application.php(147): yii\console\Application->runAction('site-map', Array)
#11 /Users/svetlanailina/Sites/shop/vendor/yiisoft/yii2/base/Application.php(386): yii\console\Application->handleRequest(Object(yii\console\Request))
#12 /Users/svetlanailina/Sites/shop/yii(20): yii\base\Application->run()
#13 {main}
PHP Core Warning 'yii\base\ErrorException' with message 'PHP Startup: Unable to load dynamic library '/usr/lib/php/extensions/no-debug-non-zts-20131226/php_pdo_mysql.dll' - dlopen(/usr/lib/php/extensions/no-debug-non-zts-20131226/php_pdo_mysql.dll, 9): image not found'

in ./Unknown:0

Stack trace:
#0 [internal function]: yii\base\ErrorHandler->handleFatalError()
#1 {main}
MacBook-Pro-Svetlana:shop svetlanailina$

Код: Выделить всё

<?php
namespace app\commands;
use yii\console\Controller;
use app\models\Category;
use app\models\Discount;
use yii\helpers\Url;


class SiteMapController extends Controller
{
    public function  actionIndex()
    {
        $begin = '<?xml version="1.0" encoding="UTF-8"?>
        <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';

        $end = '</urlset>';

        $string = '
                    <url><loc>http://localhost/~svetlanailina/shop/web/</loc><priority>0.9</priority></url>
                    <url><loc>http://localhost/~svetlanailina/shop/web/category/index</loc><priority>0.5</priority></url>
                    <url><loc>http://localhost/~svetlanailina/shop/web/discount/index</loc><priority>0.5</priority></url>
                    ';

        $category = Category::find()->all();

        foreach ($category as $cat)
        {
            $string = $string . '<url><loc>'.Url::to(['category/index', 'categotyId' => $cat->id]).'</loc><priority>0.5</priority></url>';
        }

        $lesson = Discount::find()->all();

        foreach ($lesson as $les)
        {
            $string = $string . '<url><loc>'.Url::to(['discount/index', 'lesson' => $les->id]).'</loc><priority>0.5</priority></url>';
        }

        $siteMap =  $begin .  $string .  $end;

        // открываем файл и перезаписать содержимое, а если файла нет то создаем его- указываем от корневой папки сервера
        $fp = fopen("web/sitemap.xml", "w");
    //    $fp = fopen("sitemap.xml", "w");

        //Записываем файл
        fwrite($fp, $siteMap);

        //Закрываем файл
        fclose($fp);
    }
}

Модели:

Код: Выделить всё

<?php
/**
 * Created by PhpStorm.
 * User: Andrey
 * Date: 07.05.2016
 * Time: 10:28
 */

namespace app\models;
use yii\db\ActiveRecord;
use himiklab\sitemap\behaviors\SitemapBehavior;

class Category extends ActiveRecord{

    public function behaviors()
    {
        return [
            'image' => [
                'class' => 'rico\yii2images\behaviors\ImageBehave',
            ],
//            'sitemap' => [
//                'class' => SitemapBehavior::className(),
//                'scope' => function ($model) {
//                    /** @var \yii\db\ActiveQuery $model */
//                    $model->select(['url', 'lastmod']);
//                    $model->andWhere(['is_deleted' => 0]);
//                },
//                'dataClosure' => function ($model) {
//                    /** @var self $model */
//                    return [
//                        'loc' => Url::to($model->url, true),
//                        'lastmod' => strtotime($model->lastmod),
//                        'changefreq' => SitemapBehavior::CHANGEFREQ_DAILY,
//                        'priority' => 0.8
//                    ];
//                }
//            ],
        ];
    }

    public static function tableName(){
        return 'category';
    }

    public function getProducts(){
        return $this->hasMany(Product::className(), ['category_id' => 'id']);
    }

} 

Код: Выделить всё

<?php

namespace app\models;

use Yii;
use himiklab\sitemap\behaviors\SitemapBehavior;
/**
 * This is the model class for table "discount".
 *
 * @property int $id
 * @property string $name
 * @property string $date
 * @property string $description
 * @property string $title
 * @property string $text
 * @property string $slider
 */
class Discount extends \yii\db\ActiveRecord
{

    public function behaviors()
    {
        return [
            'image' => [
                'class' => 'rico\yii2images\behaviors\ImageBehave',
            ],
//            'sitemap' => [
//                'class' => SitemapBehavior::className(),
//                'scope' => function ($model) {
//                    /** @var \yii\db\ActiveQuery $model */
//                    $model->select(['url', 'lastmod']);
//                    $model->andWhere(['is_deleted' => 0]);
//                },
//                'dataClosure' => function ($model) {
//                    /** @var self $model */
//                    return [
//                        'loc' => Url::to($model->url, true),
//                        'lastmod' => strtotime($model->lastmod),
//                        'changefreq' => SitemapBehavior::CHANGEFREQ_DAILY,
//                        'priority' => 0.8
//                    ];
//                }
//            ],
        ];
    }
    /**
     * {@inheritdoc}
     */
    public static function tableName()
    {
        return 'discount';
    }

    /**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            [['name', 'date', 'description', 'title', 'text'], 'required'],
            [['date'], 'safe'],
            [['slider'], 'string'],
            [['name', 'text'], 'string', 'max' => 1000],
            [['description'], 'string', 'max' => 200],
            [['title'], 'string', 'max' => 100],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'name' => 'Name',
            'date' => 'Date',
            'description' => 'Description',
            'title' => 'Title',
            'text' => 'Text',
            'slider' => 'Slider',
        ];
    }
}
web.php

Код: Выделить всё

<?php
use \himiklab\sitemap\behaviors\SitemapBehavior;

?>
<?php

$params = require __DIR__ . '/params.php';
$db = require __DIR__ . '/db.php';

$config = [
    'id' => 'basic',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'language' => 'ru-RU',
    'defaultRoute'=>'category/index',

    'aliases' => [
        '@bower' => '@vendor/bower-asset',
        '@npm'   => '@vendor/npm-asset',
    ],
    'modules' => [
        'admin' => [
            'class' => 'app\modules\admin\Module',
            'layout'=> 'admin',
             'defaultRoute'=>'order/index',
        ],
        'yii2images' => [
            'class' => 'rico\yii2images\Module',
            //be sure, that permissions ok
            //if you cant avoid permission errors you have to create "images" folder in web root manually and set 777 permissions
            'imagesStorePath' => 'upload/store', //path to origin images
            'imagesCachePath' => 'upload/cache', //path to resized copies
            'graphicsLibrary' => 'GD', //but really its better to use 'Imagick'
            'placeHolderPath' => '@webroot/upload/store/no-image.png', // if you want to get placeholder when image not exists, string will be processed by Yii::getAlias
            'imageCompressionQuality' => 100, // Optional. Default value is 85.

        ],
        'sitemap' => [
            'class' => 'himiklab\sitemap\Sitemap',
            'models' => [
                // your models
                'app\models\Category',
                'app\models\Blog',
                'app\models\Brand',
                'app\models\Cart',
                'app\models\Comment',
         //       'app\modules\news\models\News',
                // or configuration for creating a behavior
                [
                    'class' => 'app\modules\news\models\News',
                    'behaviors' => [
                        'sitemap' => [
                            'class' => SitemapBehavior::className(),
                            'scope' => function ($model) {
                                /** @var \yii\db\ActiveQuery $model */
                                $model->select(['url', 'lastmod']);
                                $model->andWhere(['is_deleted' => 0]);
                            },
                            'dataClosure' => function ($model) {
                                /** @var self $model */
                                return [
                                    'loc' => Url::to($model->url, true),
                                    'lastmod' => strtotime($model->lastmod),
                                    'changefreq' => SitemapBehavior::CHANGEFREQ_DAILY,
                                    'priority' => 0.8
                                ];
                            }
                        ],
                    ],
                ],
            ],
            'urls'=> [
                // your additional urls
                [
                    'loc' => '/news/index',
                    'changefreq' => \himiklab\sitemap\behaviors\SitemapBehavior::CHANGEFREQ_DAILY,
                    'priority' => 0.8,
                    'news' => [
                        'publication'   => [
                            'name'          => 'Example Blog',
                            'language'      => 'en',
                        ],
                        'access'            => 'Subscription',
                        'genres'            => 'Blog, UserGenerated',
                        'publication_date'  => 'YYYY-MM-DDThh:mm:ssTZD',
                        'title'             => 'Example Title',
                        'keywords'          => 'example, keywords, comma-separated',
                        'stock_tickers'     => 'NASDAQ:A, NASDAQ:B',
                    ],
                    'images' => [
                        [
                            'loc'           => 'http://example.com/image.jpg',
                            'caption'       => 'This is an example of a caption of an image',
                            'geo_location'  => 'City, State',
                            'title'         => 'Example image',
                            'license'       => 'http://example.com/license',
                        ],
                    ],
                ],
            ],
            'enableGzip' => true, // default is false
            'cacheExpire' => 1, // 1 second. Default is 24 hours
        ],
    ],
    'components' => [
        'request' => [
            // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
            // 'cookieValidationKey' => 'OFwTWd2ye4uytMHdXAmuLG3jtikD_3zw',
            'cookieValidationKey' => 'yYy4YYYX8lYyYyQOl8vOcO6ROo7i8twO',
           // 'baseUrl' => '',
        ],
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        'user' => [
            'identityClass' => 'app\models\User',
            'enableAutoLogin' => true,
        ],
        'errorHandler' => [
            'errorAction' => 'site/error',
        ],
        'mailer' => [
            'class' => 'yii\swiftmailer\Mailer',
            // send all mails to a file by default. You have to set
            // 'useFileTransport' to false and configure a transport
            // for the mailer to send real emails.
            'useFileTransport' => false, //true когда почта реально не будет отправляться,
            //если надо отправлять - устанавливаем в false и устанавливаем конфигурацию
            //smtp сервера - пример есть в непереводной документации
            //https://www.yiiframework.com/extension/yiisoft/yii2-swiftmailer/doc/api/2.2/yii-swiftmailer-mailer
        //    'host' => 'smtp.gmail.com',
          //  'username' => 'username',
           // 'password' => 'password',
            'transport' => [
                'class' => 'Swift_SmtpTransport',
                'host' => 'smtp.mail.ru',
                'username' => 'developersvil1502',
                'password' => 'my_password
                ',
                'port' => '465',
                'encryption' => 'ssl',
            ],

        ],
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
        'db' => $db,

        'urlManager' => [
            'enablePrettyUrl' => true, //
            'showScriptName' => false,


            //для gii
//            'enablePrettyUrl' => false,
//           'showScriptName' => true,
            'rules' => [
                'category/<id:\d+>/page/<page:\d+>' => 'category/view',
                'category/<id:\d+>' => 'category/view',
                'product/<id:\d+>' => 'product/view',
                'search' => 'category/search',
                'cart/<id:\d+>' => 'cart/pi',
                'brand/<id:\d+>' => 'brand/view',
                'test/<id:\d+>/page/<page:\d+>' => 'test/page',
                'test/<id:\d+>' => 'test/page',
                'footer/<id:\d+>' => 'footer/hits',
                '<_m:debug>/<_c:\w+>/<_a:\w+>' => '<_m>/<_c>/<_a>',
         //       'pattern' => 'sitemap', 'route' => 'sitemap/default/index', 'suffix' => '.xml',
               // 'sitemap.xml' => 'site/map',
              //  '<id:([0-9])+>/images/image-by-item-and-alias' => 'yii2images/images/image-by-item-and-alias',

               //    '' => 'site/index',
               // '<controller:\w+>/<action:\w+>/' => '<controller>/<action>',
               'baseUrl' => 'http://localhost/~svetlanailina/shop/web/',
            ],
        ],
        'yandexMapsApi' => [
            'class' => 'mirocow\yandexmaps\Api',
        ],


    ],
    'controllerMap' => [
        'elfinder' => [
            'class' => 'mihaildev\elfinder\PathController',
            'access' => ['@'],
            'root' => [
              //  'baseUrl'=>'/web',
                'path' => 'upload/global',
                'name' => 'Global'
            ],
            'watermark' => [
                'source'         => __DIR__.'/logo.png', // Path to Water mark image
                'marginRight'    => 5,          // Margin right pixel
                'marginBottom'   => 5,          // Margin bottom pixel
                'quality'        => 95,         // JPEG image save quality
                'transparency'   => 70,         // Water mark image transparency ( other than PNG )
                'targetType'     => IMG_GIF|IMG_JPG|IMG_PNG|IMG_WBMP, // Target image formats ( bit-field )
                'targetMinPixel' => 200         // Target image minimum pixel size
            ]
        ]
    ],
    'params' => $params,
];

if (YII_ENV_DEV) {
    // configuration adjustments for 'dev' environment
    $config['bootstrap'][] = 'debug';
    $config['modules']['debug'] = [
        'class' => 'yii\debug\Module',
        // uncomment the following to add your IP if you are not connecting from localhost.
        //'allowedIPs' => ['127.0.0.1', '::1'],
    ];

    $config['bootstrap'][] = 'gii';
    $config['modules']['gii'] = [
        'class' => 'yii\gii\Module',
        // uncomment the following to add your IP if you are not connecting from localhost.
        //'allowedIPs' => ['127.0.0.1', '::1'],
    ];
}

return $config;
console.php

Код: Выделить всё

<?php

$params = require __DIR__ . '/params.php';
$db = require __DIR__ . '/db.php';

$config = [
    'id' => 'basic-console',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'controllerNamespace' => 'app\commands',
    'aliases' => [
        '@bower' => '@vendor/bower-asset',
        '@npm'   => '@vendor/npm-asset',
    ],
    'components' => [
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        'log' => [
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
        'db' => $db,
        'urlManager' => [
            'enablePrettyUrl' => true, //
            'showScriptName' => false,


            //для gii
//            'enablePrettyUrl' => false,
//           'showScriptName' => true,
            'rules' => [


                'category/<id:\d+>/page/<page:\d+>' => 'category/view',
                'category/<id:\d+>' => 'category/view',
                'product/<id:\d+>' => 'product/view',
                'search' => 'category/search',
                'cart/<id:\d+>' => 'cart/pi',
                'brand/<id:\d+>' => 'brand/view',
                'test/<id:\d+>/page/<page:\d+>' => 'test/page',
                'test/<id:\d+>' => 'test/page',
                'footer/<id:\d+>' => 'footer/hits',
                '<_m:debug>/<_c:\w+>/<_a:\w+>' => '<_m>/<_c>/<_a>',
              //  'pattern' => 'sitemap', 'route' => 'sitemap/default/index', 'suffix' => '.xml',
                // 'sitemap.xml' => 'site/map',
                //  '<id:([0-9])+>/images/image-by-item-and-alias' => 'yii2images/images/image-by-item-and-alias',

                //    '' => 'site/index',
                // '<controller:\w+>/<action:\w+>/' => '<controller>/<action>',
                'baseUrl' => 'http://localhost/~svetlanailina/shop/web/',
            ],
        ],
    ],
    'params' => $params,
    /*
    'controllerMap' => [
        'fixture' => [ // Fixture generation command line.
            'class' => 'yii\faker\FixtureController',
        ],
    ],
    */
];

if (YII_ENV_DEV) {
    // configuration adjustments for 'dev' environment
    $config['bootstrap'][] = 'gii';
    $config['modules']['gii'] = [
        'class' => 'yii\gii\Module',
    ];
}

return $config;
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

Re: как сделать sitemap.xml

Сообщение svil »

вручную создать и положить в web - самый простой способ?
Аватара пользователя
Йож
Сообщения: 574
Зарегистрирован: 2015.08.26, 03:05

Re: как сделать sitemap.xml

Сообщение Йож »

Что-то Вы все усложнили. Вот инструкция: https://github.com/himiklab/yii2-sitemap-module

Сам файл не создается, он "виртуальный".

P.S. Есть программа Sitemap Generator старенькая, нормально справляется. Можете сгенерить и положить в корень, но не динамический sitemap, конечно, получится.
Последний раз редактировалось Йож 2018.08.17, 18:43, всего редактировалось 1 раз.
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: как сделать sitemap.xml

Сообщение andku83 »

Код: Выделить всё

        $fp = fopen(Yii::getAlias("@web/sitemap.xml"), "w");
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

Re: как сделать sitemap.xml

Сообщение svil »

sitemap.xml не открывался по ссылке itcrc.ru/sitemap.xml
Зашла на яндекс https://yandex.ru/support/webmaster/indexing-options/
На сервисе сгенерировала готовый sitemap.xml, скачала, проверила ошибки в Вебмастере яндекса, вручную положила
в папку web - теперь он открывается домен/sitemap.xml, передала роботу на индексацию. Но почему
расширением не смогла воспользоваться - не поняла. Не факт, что там ошибок не могло бы быть. 3 года назад по этому
расширению вопросы задавали на githab, может оно уже разработчиками не поддерживается.
uEhlO4a
Сообщения: 70
Зарегистрирован: 2017.08.12, 19:19

Re: как сделать sitemap.xml

Сообщение uEhlO4a »

оно же пишет ошибку -
" Exception 'yii\base\InvalidConfigException' with message 'Please configure UrlManager::baseUrl correctly as you are running a console application.'
in /Users/svetlanailina/Sites/shop/vendor/yiisoft/yii2/web/UrlManager.php:573"
означает, что в консоли нету baseUrl. Нужно указать, что-то вроде "http://example.com" и всё.
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

Re: как сделать sitemap.xml

Сообщение svil »

Как я укажу example.com , если на компе у меня просто /Users/svetlanailina/Sites/shop?
Ответить