Пишу блог. Использую zabachok\behaviors\SluggableBehavior
Модель:
use zabachok\behaviors\SluggableBehavior;
public function behaviors()
{
return [
[
'class' => SluggableBehavior::className(),
'attribute' => 'title'
]
];
}
В rules нет слага.
Контроллер:
public function actionView($slug)
{
return $this->render('view', [
'model' => $this->findModelBySlug($slug),
]);
}
public function actionCreate()
{
$model = new Article();
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', 'slug' => $model->slug]);
}
return $this->render('create', [
'model' => $model,
]);
}
protected function findModelBySlug($slug)
{
if (($model = Article::findOne(['slug' => $slug])) !== null) {
return $model;
}
throw new NotFoundHttpException('The requested page does not exist.');
}
config/web:
'urlManager' => [
...
'rules' => [
'<alias:\w+>' => 'site/<alias>',
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
'article/view/<slug:\w+>' => 'article/view',
'category/view/<slug:\w+>' => 'category/view'
],
],
...
view:
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'id',
'title',
'description:ntext',
'created_by',
'created_at:relativeTime',
[
'attribute' => 'status',
'format' => 'raw',
'value' => function ($data) {
return $data->status
? '<span class="text-success">Опубликовано</span>'
: '<span class="text-danger">Удалено</span>';
}
],
'category_id',
['class' => 'yii\grid\ActionColumn',
'template'=>'{view} {update} {delete}',
'buttons'=>[
'view' => function ($url, $model) {
return Html::a('<span class="glyphicon glyphicon-eye-open"></span>', 'view/'.$model->slug);
}
]
]
]
]); ?>
При попытке сохранить изменения в статье - выдаёт ошибку и ссылка содержит только id 'http://yiiblog.dev/article/view?id=1'
Эта ошибка возникает не при сохранении, а при попытке перейти на роут /article/view?id=1, так как actionView($slug) ожидает slug, а не id.
Проверь базу данных на наличие новой статьи и, если она там есть, скопируй её slug и перейди по роуту /article/view/{your_slug}.
Для построения корректного маршрута в view нужно построить маршрут таким образом:
<?= GridView::widget([
...
return Html::a('<span class="glyphicon glyphicon-eye-open"></span>', 'view/?slug='.$model->slug);
}
]
]
]
]); ?>
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости