Yii2: Sluggable Behavior - создание понятных ссылок

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Закрыто
Boglik
Сообщения: 42
Зарегистрирован: 2018.10.16, 04:49

Yii2: Sluggable Behavior - создание понятных ссылок

Сообщение Boglik »

Воспользовался несколькими статьями:
https://code.tutsplus.com/tutorials/how ... -cms-23222
https://coderius.biz.ua/blog/article/yi ... a-avtomate

Создал админ панель, которая создает статью, вставляет в поле (alias) ссылки от производной статьи. С этим проблем нет.
У меня сложность с выводом и переходом по ссылкам.
advanced/config/main.php

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

        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
                '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',

                'defaultRoute' => '/site/index',
                'site/<slug>' => 'site/slug',
            ],
        ],
        
В таблице alias ссылки типа:

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

novosti/istoriya-v-nashih-serdtsah
video/istoriya-v-nashih-serdtsah
Будет несколько категорий и в поле хранится категория/новость.

Контроллер(SiteController):

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

    public function actionIndex()
    {
        $query = Blog::find()->select('id, title,images')->orderBy('id DESC');
        $pages = new \yii\data\Pagination(['totalCount' =>$query->count(), 'pageSize' => 20, 'pageSizeParam' => false, 'forcePageParam' => false]);
        $posts = $query->offset($pages->offset)->limit(5)->all();
        return $this->renderFile('@app/views/site/index.php', compact('posts', 'pages'));
    }
    
    public function actionView(){
        $id = \Yii::$app->request->get('id');
        $post = Blog::findOne($id);
        if(empty($post)) throw new \yii\web\HttpException(404,'Такой страницы нет');
        return $this->renderFile('@app/views/site/view.php', compact('post'));

    }
   
    
Модель(Blog)

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

<?php

namespace site\models;

use yii\behaviors\SluggableBehavior;


/**
 * This is the model class for table "news".
 *
 * @property int $id
 * @property string|null $title
  * @property string|null $text
    * @property string|null $images
 */
class Blog extends \yii\db\ActiveRecord
{
    public function behaviors()
    {
        return [
            [
                'class' => SluggableBehavior::className(),
                'attribute' => 'title',
                'slugAttribute' => 'alias',
            ],
        ];
    }
    /**
     * {@inheritdoc}
     */
    public static function tableName()
    {
        return '{{blog}}';
    }

    /**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            [['title', 'text', 'images'], 'string'],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function attributeLabels()
    {
        return [
            'title' => 'Заголовок',
            'images' => 'Изображение',
            'text' => 'Текст',
        ];
    }
}

Представление:view/index.php

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

        <div class="row">
            <section class="grid">
                <?php if (!empty($posts)): ?>
                <?php foreach($posts as $post): ?>
                <article class="grid-item">
                    <div class="image">
                        <img src="<?=$post->images?>" />
                    </div>
                    <div class="info">
                        <h2><?=$post->title?></h2>
                        <div class="info-text">
                            <p>&nbsp;<?=$post->anonce?></p>
                        </div>
                        <div class="button-wrap">
                            <?= Html::a(Yii::t('app', 'Подробнее'), ['site', 'id' => $post->id], ['class' => 'atuin-btn']) ?>

                        </div>
                    </div>
                    
view.php

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

...
               <div class="panel panel-default">
    <div class="panel-heading">
    <b><?=$post->title?></b>
    </div>
    <div class="panel-body">
        &nbsp;<?=$post->id?><br>
    </div>
    <div class="panel-body">
        <?= Html::a(Yii::t('app', 'назад'), ['site/view', 'id' => $post->id], ['class' => 'btn btn-success']) ?>
    </div>
</div>
....
В вышеуказанном примере все работает без slug
Но мне нужны ссылки типа:
site.ru/novosti/istoriya-v-nashih-serdtsah
site.ru/video/istoriya
и пр.

Как уже писал - категории и заголовки хранятся в поле alias
Но у меня не генерируются и не получается проходить по данным ссылкам когда я делаю следующее:
В контроллере пишу:

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

  
    public function actionSlug($slug){
    $id = \Yii::$app->request->get('alias');
    $post = Blog::find()->where(['alias'=>$slug])->one();
    if(empty($post)) throw new \yii\web\HttpException(404,'Такой страницы нет');
    return $this->renderFile('@app/views/site/view.php', compact('post'));
    }

    public function actionSlugs($slug)
    { 
      $model = Blog::find()->where(['alias'=>$slug])->one();
      if (!is_null($model)) {
        return $this->renderFile('@app/views/site/view.php', compact('post'));    
      } else {
        return $this->redirect('/site/index');
      }
    }
И возвращает нет страницы. Хотя два разных примера. Пробовал и так и так.

В чем может быть ошибка?
Boglik
Сообщения: 42
Зарегистрирован: 2018.10.16, 04:49

Re: Yii2: Sluggable Behavior - создание понятных ссылок

Сообщение Boglik »

Проблема была в том, что slug или yii2 не понимает '/' - он воспринимает это как отдельную папку и вываливает ошибку 404.
как заставить его понимать категории типа
"novosti/i-snova-vserossijskie-proekty"
Обычные слова "novost" он понимает

Разобрался сам.
С подкатегориями, когда в базу заносятся значения типа:
/news/12312
/video/13123
Нужно вставлять код:

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

             'site/view/<id:\d+>' => 'site/view',
             'site/view/<slug:[/a-z0-9-]+>' => 'site/view/',
			 'site/view/<slug>/' => 'site/view/',
            '<controller:\w+>/<action:\w+>/' => '<controller>/<action>',
Здесь 3 правила - циферно-буквенное значение, view/10, текстовое /view/news/10 и подкатегории /view/news/car/1
Закрыто