Как использовать Yii2 Sluggable Behavior?

Я определил это поведение согласно инструкциям документации.

public function behaviors()
{
return [
TimestampBehavior::className(),
[
'class' => SluggableBehavior::className(),
'attribute' => 'title',
],
];
}

В моем config url manager я определил пользовательское правило, подобное этому: example.com/article/1

'urlManager' => [
'class' => 'yii\web\UrlManager',
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
'article/<id:\d+>/<slug>' => 'article/view',
],
],

На мой взгляд действие:

public function actionView($id, $slug = null)
{
return $this->render('view', [
'model' => $this->findModel($id),
]);
}

В моем файле представления индекса я генерирую URL для просмотра действия, подобного этому: Url::to(['article/view', 'id' => $model->id, 'slug' => $model->slug])

Я хотел бы вывести заголовок моей статьи в URL так: example.com/article/1/My-first-post

Но я не получаю заголовок в URL.

Соджу сказал, что слаг — это атрибут базы данных. Я создал новый столбец в таблице статей под названием slug, и это varchar 1024. Но я все еще не получаю слаг в URL. Мой URL-адрес: example.com/article/1

Что случилось ? Спасибо

РЕДАКТИРОВАТЬЯ обновил свой код для вставки значения заголовка в столбец слагов в моей таблице статей. Теперь я работаю, но я не получаю URL-адреса SEO. Я получаю это: article/1/First+Articleи я хотел бы article/1/First-Article,

Я пытался с:

return [
TimestampBehavior::className(),
[
'class' => SluggableBehavior::className(),
'attribute' => 'title',
'value' => function ($event) {
return str_replace(' ', '-', $this->slug);
}
],
];

Это тоже не работает: return str_replace(' ', '-', $this->slug);

1

Решение

Вы можете добавить следующее urlManager правило:

'article/<id:\d+>/<slug>' => 'article/view',

И создайте URL в ваших представлениях так:

\yii\helpers\Url::to(['article/view', 'id'=>$model->id, 'slug'=>$model->slug])

Вы также можете добавить помощников в свою модель:

public function getRoute()
{
return ['article/view', 'id'=>$this->id, 'slug'=>$this->slug];
}

public function getUrl()
{
return \yii\helpers\Url::to($this->getRoute());
}

А потом просто использовать $model->url в ваших взглядах.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]