Как сделать sitemap.xml для сайта-визитки и для товаров

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

Как сделать sitemap.xml для сайта-визитки и для товаров

Сообщение svil » 2019.06.08, 22:18

Делаю sitemap.xml: http://домен/sitemap.xml
по мануалу https://coderius.biz.ua/blog/article/ka ... xml-v-yii2
На локальном все работает.
После пуша на хостинг выдает внутреннюю ошибку сервера.

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

2019-06-08 18:53:22 [...][-][-][error][yii\base\UnknownMethodException] exception 'yii\base\UnknownMethodException' with message 'Calling unknown method: app\models\query\G$
Stack trace:
#0 /var/www/html/.../controllers/SitemapController.php(43): yii\base\Component->__call('active', Array)
#1 /var/www/html/.../controllers/SitemapController.php(43): app\models\query\GroupQuery->active()
#2 [internal function]: app\controllers\SitemapController->actionIndex()
#3 /var/www/html/.../vendor/yiisoft/yii2/base/InlineAction.php(57): call_user_func_array(Array, Array)
#4 /var/www/html/.../vendor/yiisoft/yii2/base/Controller.php(157): yii\base\InlineAction->runWithParams(Array)
#5 /var/www/html/.../vendor/yiisoft/yii2/base/Module.php(528): yii\base\Controller->runAction('index', Array)
#6 /var/www/html/.../vendor/yiisoft/yii2/web/Application.php(103): yii\base\Module->runAction('sitemap/index', Array)
#7 /var/www/html/.../vendor/yiisoft/yii2/base/Application.php(386): yii\web\Application->handleRequest(Object(yii\web\Request))
#8 /var/www/html/.../web/index.php(18): yii\base\Application->run()
#9 {main}
2019-06-08 18:53:22 [..][-][-][info][application] $_GET = []

$_POST = []

$_FILES = []

$_COOKIE = [
    'PHPSESSID' => '..
    '_csrf' => '...
    'dcjq-accordion' => '0,1'
]

$_SERVER = [
    'REDIRECT_STATUS' => '200'
    'HTTP_HOST' => 'ДОМЕН'
    'HTTP_UPGRADE_INSECURE_REQUESTS' => '1'
    'HTTP_USER_AGENT' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'
    'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3'
    'HTTP_ACCEPT_ENCODING' => 'gzip, deflate'
    'HTTP_ACCEPT_LANGUAGE' => 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7'
    'HTTP_COOKIE' => '...; ...Bi$
    'HTTP_VIA' => '1.1 ДОМЕН'
    'HTTP_X_FORWARDED_FOR' => 'XX.XX.XXX.XXX'
    'HTTP_X_FORWARDED_HOST' => 'Домен'
    'HTTP_X_FORWARDED_SERVER' => 'Домен'
    'HTTP_CONNECTION' => 'Keep-Alive'
    'PATH' => '...'
    'SERVER_SIGNATURE' => '<address>Apache/2.4.10 (Debian) Server at...</address>
'
    'SERVER_SOFTWARE' => 'Apache/2.4.10 (Debian)'
    'SERVER_NAME' => 'Домен'
    'SERVER_ADDR' => ''XX.XX.XXX.XXX'
    'SERVER_PORT' => 'XX'
    'REMOTE_ADDR' => ''XX.XX.XXX.XXX'
    'DOCUMENT_ROOT' => '/var/www/html/../web'
    'REQUEST_SCHEME' => 'http'
    'CONTEXT_PREFIX' => ''
    'CONTEXT_DOCUMENT_ROOT' => '/var/www/html/../web'
Последний раз редактировалось svil 2019.06.09, 11:48, всего редактировалось 1 раз.

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

Re: Внутренняя ошибка сервера при переносе на хостинг

Сообщение svil » 2019.06.09, 00:01

Ругается нa active
Может его надо отдельно реализовать как в примере?

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

class BlogArticlesQuery extends \yii\db\ActiveQuery
{
    
    public function active()
    {
        return $this->andWhere([BlogArticles::tableName().'.flagActive' => EnumBlog::ARTICLE_STATUS_ACTIVE]);
    }​

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

Re: Внутренняя ошибка сервера при переносе на хостинг

Сообщение svil » 2019.06.09, 08:59

Перестала работать и на локальном
Ошибка

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

Calling unknown method: yii\db\ActiveQuery::active()
Оставила одну модель - таблицу в БД Gallery
web.php

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

   
   'urlManager' => [

            'enablePrettyUrl' => true,
            'showScriptName' => false,

            'rules' => [
                'images/<id>/<name>' => 'site/image',
                'site/<id:\d+>' => 'site/info',
                '<id:([0-9])+>/images/image-by-item-and-alias' => 'yii2images/images/image-by-item-and-alias',
                '/images/image-by-item-and-alias' => 'yii2images/images/image-by-item-and-alias',

                'sitemap.xml' => 'sitemap/index',//правило для карты сайта

          //  '/' => 'site/index',​

                ],

        ],
SitemapController

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

<?php

/**
 * Sitemap
 */
namespace app\controllers;


//Здесь обозначаем модели и базовые классы, которые будем использовать в коде.
//use frontend\models\blog\articles\BlogArticles;
//use frontend\models\blog\categories\BlogCategories;
//use frontend\models\blog\tags\BlogTags;
//


use app\models\visitka\Gallery;
use yii\web\Controller;
use yii\db\Query;
use Yii;
class SitemapController extends Controller
{

    public function actionIndex()
    {
        //Если нужно сбросить кэш, то расскоментируем и перезагрузим страницу
   //   Yii::$app->cache->delete('sitemap');

       if (!$xml_sitemap = Yii::$app->cache->get('sitemap')) {  // проверяем есть ли закэшированная версия sitemap

            $urls = array();

            // Выбираем категории сайта



            $galleries= Gallery::find()->active()->orderCreatedAt()->all();
            foreach ($galleries as $gallery) {
                $urls[] = array(
                    'loc' => $gallery->url,
                    'changefreq' => 'weekly',
                    'priority' => 0.8
                );
            }

            $xml_sitemap = $this->renderPartial('index', array( // записываем view на переменную для последующего кэширования
                'host' => Yii::$app->request->hostInfo,         // текущий домен сайта
                'urls' => $urls,                                // с генерированные ссылки для sitemap
            ));

            Yii::$app->cache->set('sitemap', $xml_sitemap, 60 * 60 * 12); // кэшируем результат на 12 ч
        }

        Yii::$app->response->format = \yii\web\Response::FORMAT_RAW;
        $headers = Yii::$app->response->headers;
        $headers->add('Content-Type', 'text/xml');

        return $xml_sitemap;
    }
}
Gallery

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

<?php

namespace app\models\visitka;

use Yii;

/**
 * This is the model class for table "gallery".
 *
 * @property int $id
 * @property string $text
 */
class Gallery extends \yii\db\ActiveRecord
{
    /**
     * {@inheritdoc}
     */

    public $image;

    public function behaviors()
    {
        return [
            'image' => [
                'class' => 'rico\yii2images\behaviors\ImageBehave',
            ]
        ];
    }


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

    /**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            [['text'], 'required'],
            [['text'], 'string', 'max' => 250],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'text' => 'Text',
            'image' => 'Фото',
        ];
    }

    public function upload()
    {
        if ($this->validate()) {
            $path = 'upload/store/' . $this->image->baseName . '.' . $this->image->extension;
            $this->image->saveAs($path);
            $this->attachImage($path, true);
            @unlink($path);
            return true;
        } else {
            return false;
        }
    }


}
sitemap/index (вид)

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

<?php

/* @var $urls */
/* @var $host */

echo '<?xml version="1.0" encoding="UTF-8"?>';
?>

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <?php foreach($urls as $url): ?>
        <url>
            <loc><?= $host . $url['loc']; ?></loc>
            <?php if(isset($url['lastmod'])): ?>
                <lastmod><?= $url['lastmod']; ?></lastmod>
            <?php endif; ?>
            <changefreq><?= $url['changefreq']; ?></changefreq>
            <priority><?= $url['priority']; ?></priority>
        </url>
    <?php endforeach; ?>
</urlset>​

Аватара пользователя
ElisDN
Сообщения: 5234
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Внутренняя ошибка сервера при переносе на хостинг

Сообщение ElisDN » 2019.06.09, 09:45

В Gallery нет static function find() с GalleryQuery.

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

Re: Внутренняя ошибка сервера при переносе на хостинг

Сообщение svil » 2019.06.09, 10:29

Спасибо, попробую

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

Re: Как сделать sitemap.xml для сайта-визитки и для товаров

Сообщение svil » 2019.06.09, 11:51

Не получилось.
Непонятно, как урлы генерируются или в БД поле есть для них. Атрибуты таблиц в мануале неизвестны, поэтому логика мне непонятна.
Иду другим путем https://golos.io/vox-populi/@vp-webdev/ ... mvoke-yii2
Пока в активном поиске, как сделать sitemap.xml

Аватара пользователя
futbolim
Сообщения: 2047
Зарегистрирован: 2012.07.08, 19:28

Re: Как сделать sitemap.xml для сайта-визитки и для товаров

Сообщение futbolim » 2019.06.09, 12:42

Всегда любил свои велосипеды. Так ты лучше и точно понимаешь, что происходит. Код не идеальный (и старый). Но может подойдёт

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

<?php
namespace console\controllers;

use common\models\Agency;
use common\models\City;
use common\models\ProductCategory;
use DOMDocument;
use common\helpers\SitemapHelper;
use frontend\models\search\AgencySearch;
use frontend\models\search\ProductSearch;
use yii\console\Controller;

class SitemapController extends Controller
{
    public function actionIndex()
    {
        $categories = ProductCategory::find()->asArray()->all();
        $cities = City::find()->with(['metroStations'])->asArray()->all();
        $agencies = Agency::find()->asArray()->all();

        // Преднастройки
        $xml = new DOMDocument("1.0", "UTF-8");
        $urlset = $xml->createElement('urlset');
        $urlset->setAttribute('xmlns', 'http://www.sitemaps.org/schemas/sitemap/0.9');
        $urlset->setAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
        $urlset->setAttribute('xsi:schemaLocation', 'http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd');

        // Главная
        SitemapHelper::createUrl($xml, $urlset, '');
        SitemapHelper::createUrl($xml, $urlset, '/site/signup?type=agency');
        SitemapHelper::createUrl($xml, $urlset, '/site/signup?type=agent');

        // Агентства
        $this->generateAgencies($xml, $urlset, $cities, $agencies, $categories);

        // Агенты
        $this->generateAgents($xml, $urlset);

        // Товары
        $this->generateProducts($xml, $urlset, $categories, $cities);

        // и сохраним файл
        $xml->appendChild($urlset);
        $xml->formatOutput = true;
        $xml->preserveWhiteSpace = false;
        $xml->save(\Yii::getAlias('@frontend/web') . '/sitemap.xml');

        echo 'Sitemap generated successfully.' . PHP_EOL;
    }

    /**
     * @param $xml \DOMDocument
     * @param $urlset \DOMElement
     * @param $cities
     * @param $agencies
     * @param $categories
     */
    private function generateAgencies($xml, $urlset, $cities, $agencies, $categories) {
        SitemapHelper::createUrl($xml, $urlset, '/agencies');
        SitemapHelper::createUrl($xml, $urlset, '/agencies/' . AgencySearch::ANIMAL);

        foreach($cities as $city) {
            SitemapHelper::createUrl($xml, $urlset, '/agencies/' . $city['slug']);
            SitemapHelper::createUrl($xml, $urlset, '/agencies/' . AgencySearch::ANIMAL . '/' . $city['slug']);

            if(count($city['metroStations'])) {
                foreach($city['metroStations'] as $metroStation) {
                    SitemapHelper::createUrl($xml, $urlset, '/agencies/' . $city['slug'] . '/' . $metroStation['slug']);
                    SitemapHelper::createUrl($xml, $urlset, '/agencies/' . AgencySearch::ANIMAL . '/' . $city['slug'] . '/' . $metroStation['slug']);
                }
            }
        }

        foreach($agencies as $agency) {
            SitemapHelper::createUrl($xml, $urlset, '/agency/' . $agency['hash']);
            SitemapHelper::createUrl($xml, $urlset, '/agency/' . $agency['hash'] . '/reviews');
            SitemapHelper::createUrl($xml, $urlset, '/agency/' . $agency['hash'] . '/products');
            foreach ($categories as $category) {
                SitemapHelper::createUrl($xml, $urlset, '/agency/' . $agency['hash'] . '/products/' . $category['slug']);
            }
            SitemapHelper::createUrl($xml, $urlset, '/agency/' . $agency['hash'] . '/services');
            SitemapHelper::createUrl($xml, $urlset, '/agency/' . $agency['hash'] . '/transport');
        }
    }

    /**
     * @param $xml \DOMDocument
     * @param $urlset \DOMElement
     */
    private function generateAgents($xml, $urlset) {
        SitemapHelper::createUrl($xml, $urlset, '/agents');
    }

    /**
     * @param $xml \DOMDocument
     * @param $urlset \DOMElement
     * @param $categories
     * @param $cities
     */
    private function generateProducts($xml, $urlset, $categories, $cities) {
        SitemapHelper::createUrl($xml, $urlset, '/products');

        foreach($categories as $category) {
            SitemapHelper::createUrl($xml, $urlset, '/products/' . ProductSearch::ALL_CITIES . '/' . $category['slug']);
            foreach($cities as $city) {
                SitemapHelper::createUrl($xml, $urlset, '/products/' . $city['slug'] . '/' . $category['slug']);
            }
        }
    }
}

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

<?php
namespace common\helpers;

use Yii;

/**
 * Class SitemapHelper
 * @package common\helpers
 */
class SitemapHelper {
    const CHANGEFREQ_ALWAYS = 'always';
    const CHANGEFREQ_HOURLY = 'hourly';
    const CHANGEFREQ_DAILY = 'daily';
    const CHANGEFREQ_WEEKLY = 'weekly';
    const CHANGEFREQ_MONTHLY = 'monthly';
    const CHANGEFREQ_YEARLY = 'yearly';
    const CHANGEFREQ_NEVER = 'never';

    /**
     * @param $date
     * @return false|string
     */
    protected function dateToW3C($date)
    {
        if (is_int($date))
            return date(DATE_W3C, $date);
        else
            return date(DATE_W3C, strtotime($date));
    }

    /**
     * @param $xml \DOMDocument
     * @param $urlset \DOMElement
     * @param $loc
     */
    public static function createUrl($xml, $urlset, $loc) {
        $url = $xml->createElement('url');
        $loc = $xml->createElement('loc', Yii::$app->params['domain-frontend'] . $loc);
//        $lastmod = $xml->createElement("lastmod", '2005-01-01');
//        $changefreq = $xml->createElement("changefreq", 'monthly');
//        $priority = $xml->createElement("priority", '0.6');

        $url->appendChild($loc);
//        $url->appendChild($xml_lastmod);
//        $url->appendChild($xml_changefreq);
//        $url->appendChild($xml_priority);

        $urlset->appendChild($url);
    }
}

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

Re: Как сделать sitemap.xml для сайта-визитки и для товаров

Сообщение svil » 2019.06.09, 13:44

Спасибо. Разбираюсь.

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

Re: Как сделать sitemap.xml для сайта-визитки и для товаров

Сообщение svil » 2019.06.13, 15:38

Как очистить хэш после изменений sitemap.xml, чтобы посмотреть изменения после перезагрузки браузера ?

Аватара пользователя
futbolim
Сообщения: 2047
Зарегистрирован: 2012.07.08, 19:28

Re: Как сделать sitemap.xml для сайта-визитки и для товаров

Сообщение futbolim » 2019.06.14, 09:21

ctrl + F5.
Браузер кеширует, боты нет.

Ответить