SluggableBehavior

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Аватара пользователя
r3verser
Сообщения: 195
Зарегистрирован: 2012.04.01, 17:29
Откуда: Киев

Re: SluggableBehavior

Сообщение r3verser »

Можно сделать вот так, только переменная статическая, стало быть нет гарантии что кто-то (другой экстеншн) не изменит ее. :shock:

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

<?php
 
  namespace app\components;

  use yii\base\Application;
  use yii\base\BootstrapInterface;
  use yii\helpers\Inflector;

  class InflectorBootstrap implements BootstrapInterface
  {
      /**
       * @param Application $app
       */
      public function bootstrap($app)
      {
          Inflector::$transliterator = 'Russian-Latin/BGN; NFKD';
      }
  }
 
В конфиге

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

...
'bootstrap' => [
        'app\components\InflectorBootstrap',
    ],
 ...
 
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: SluggableBehavior

Сообщение slavcodev »

zelenin писал(а):везде свои базовые контроллеры пихаете) нету никакого базового контроллера.
У меня тоже нет его :) Но вроде часто используется, в том числе и в оф. шаблонах приложения, хотя могу ошибаться.
Жду Yii 3!
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: SluggableBehavior

Сообщение zelenin »

Loveorigami писал(а):работает )
но...

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

                'class' => 'Zelenin\yii\behaviors\Slug',
                'attribute'=>['id','title'],
                'ensureUnique' => false, // пробовал и true    
если я хочу задать свой slug (не пустой), после сохранения он заменяется на "автоматический"
---------
новая запись - сохраняю

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

id=>2
title => привет
slug => 2-privet
редактирую, меняю slug => hello
получаю все равно 2-privet

обновил. Протестируй плз
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: SluggableBehavior

Сообщение Loveorigami »

Для меня - работает как надо... Для одной модели я применяю [id, title], для другой просто уникальный [title].
В чистом виде все отрабатывает корректно по любой схеме.

Но раз потестировать, то смотри, заметил - следующая ситуация
------
Создал запись - 2-privet
Поменял вручную slug на privet

Добавляю новую запись "привет" (id=5). Должен получить 5-privet
а получаю - privet-2
------

Спасибо за behavior!
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: SluggableBehavior

Сообщение zelenin »

Loveorigami писал(а): Но раз потестировать, то смотри, заметил - следующая ситуация
------
Создал запись - 2-privet
Поменял вручную slug на privet

Добавляю новую запись "привет" (id=5). Должен получить 5-privet
а получаю - privet-2
------
не могу повторить.

Создал запись - 2-privet
Поменял вручную slug на privet.

Добавляю новую запись "привет". Получил 74-privet
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: SluggableBehavior

Сообщение Loveorigami »

zelenin писал(а): Добавляю новую запись "привет". Получил 74-privet
С утра запустил локалку - потестил. У меня тоже теперь добавляется, как надо...
Сижу и думаю, как я вчера получил privet-2 ? ))) Возможно - не досмотрел и privet вбил в slug. Только тогда получаю privet-2. Но так и должно быть.

Буду использовать у себя - если что найду - напишу.
Аватара пользователя
mihail_dev
Сообщения: 243
Зарегистрирован: 2013.07.17, 00:51
Откуда: Молдова
Контактная информация:

Re: SluggableBehavior

Сообщение mihail_dev »

я чёт читал читал сток проблем а так нельзя воспользоваться если проблема в количестве запросов

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

public function behaviors()
{
return [
    [
        'class' => yii\behaviors\SluggableBehavior::className(),
        'attribute' => 'title',
        'slugAttribute' => 'slug',
        'uniqueSlugGenerator' => function($baseSlug, $iteration, $owner){
            return $owner->find()->count().'-'.$baseSlug;
        },
    ],
];
}
Изображение
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: SluggableBehavior

Сообщение Loveorigami »

mihail_dev писал(а):я чёт читал читал сток проблем а так нельзя воспользоваться если проблема в количестве запросов

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

public function behaviors()
{
return [
    [
        'class' => yii\behaviors\SluggableBehavior::className(),
        'attribute' => 'title',
        'slugAttribute' => 'slug',
        'uniqueSlugGenerator' => function($baseSlug, $iteration, $owner){
            return $owner->find()->count().'-'.$baseSlug;
        },
    ],
];
}
В моем случае (да и в практическом) - нет.
1.
поскольку в первом параметре мне нужен id записи.
Для того, чтобы построит роут

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

site.ru/post/(num:)-(any:) => post/actionView/id
например -

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

http://new.loveorigami.info/world/44572-samus-aran  
меняешь или номер, или slug - получаешь 404

2. В твоем варианте первый slug будет 0-slug, второй - 1-slug и т.п

3. нет возможности задать свой уникальный...
Pitonn
Сообщения: 41
Зарегистрирован: 2013.09.08, 17:35

Re: SluggableBehavior

Сообщение Pitonn »

Ув. zelenin, можете вынести в параметры "когда" вызывать бихэвиор?
Сейчас 45 строка Slug.php

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

$this->attributes[ActiveRecord::EVENT_AFTER_INSERT] = $this->slugAttribute; 
но возможно кому-нибудь понадобится в другом случае вызывать, мне вот например желательно вызывать

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

$this->attributes[ActiveRecord::EVENT_BEFORE_VALIDATION] = $this->slugAttribute; 
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: SluggableBehavior

Сообщение zelenin »

Pitonn писал(а):Ув. zelenin, можете вынести в параметры "когда" вызывать бихэвиор?
Сейчас 45 строка Slug.php

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

$this->attributes[ActiveRecord::EVENT_AFTER_INSERT] = $this->slugAttribute;
но возможно кому-нибудь понадобится в другом случае вызывать, мне вот например желательно вызывать

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

$this->attributes[ActiveRecord::EVENT_BEFORE_VALIDATION] = $this->slugAttribute;
с удовольствием, если объясните практическую ценность
Pitonn
Сообщения: 41
Зарегистрирован: 2013.09.08, 17:35

Re: SluggableBehavior

Сообщение Pitonn »

zelenin писал(а):
Pitonn писал(а):Ув. zelenin, можете вынести в параметры "когда" вызывать бихэвиор?
Сейчас 45 строка Slug.php

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

$this->attributes[ActiveRecord::EVENT_AFTER_INSERT] = $this->slugAttribute; 
но возможно кому-нибудь понадобится в другом случае вызывать, мне вот например желательно вызывать

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

$this->attributes[ActiveRecord::EVENT_BEFORE_VALIDATION] = $this->slugAttribute; 
с удовольствием, если объясните практическую ценность
Ну я не сохраняю в БД до тех пор, пока папка не создалась. Т.е. если вызвать бихэвиор до валидации, то можно получить slug, а получив его значение можно создать папку для хранения файлов /web/img/$slug, у меня это изображения для галереи. И получается в БД не будет вставлена запись до тех пор пока не будет создана эта самая папка. Может я конечно тут перемудрил да напутал, то интересно узнать как это действие грамотней организовать.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: SluggableBehavior

Сообщение zelenin »

невнимательно прочел - поведение изначально и запускается before_validation. after_insert - дополнительно, если в генерации слага участвует primary key.
Pitonn
Сообщения: 41
Зарегистрирован: 2013.09.08, 17:35

Re: SluggableBehavior

Сообщение Pitonn »

zelenin писал(а):невнимательно прочел - поведение изначально и запускается before_validation. after_insert - дополнительно, если в генерации слага участвует primary key.
О верно... Мой косяк :)
Аватара пользователя
mihail_dev
Сообщения: 243
Зарегистрирован: 2013.07.17, 00:51
Откуда: Молдова
Контактная информация:

Re: SluggableBehavior

Сообщение mihail_dev »

Loveorigami писал(а):
В моем случае (да и в практическом) - нет.
1.
поскольку в первом параметре мне нужен id записи.
Для того, чтобы построит роут

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

site.ru/post/(num:)-(any:) => post/actionView/id
например -

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

http://new.loveorigami.info/world/44572-samus-aran     
меняешь или номер, или slug - получаешь 404

2. В твоем варианте первый slug будет 0-slug, второй - 1-slug и т.п

3. нет возможности задать свой уникальный...
и так теперь всё встало на свои места

во первых если тебе нужно чтоб присутствовал йди в ссылке то тогда нужно именно с ним и работать! запросы по йди будут по идее быстрее работать! а слуг чисто как сеошная штука будет и доп проверка!

делай слуг не уникальным

в модель добавим следующее

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

public function behaviors()
{
    return [
        [
            'class' => yii\behaviors\SluggableBehavior::className(),
            'slugAttribute' => 'slug',
            'value' => function($event){
                if(!empty($event->sender->slug))
                    return $event->sender->slug;
                return Inflector::slug($event->sender->title);
            },
        ],
    ];
}
в urlManager добавим правило чтоб было так как ты хочешь

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

[
    'components' => [
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
               'post/<id:\d+>-<slug:\w>' => 'post/view'
            ],
        ],
    ],
]
 
ссылка формируется

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

Url::to(['post/view', 'id'=>$model->id, 'slug' => $model->slug])
и будет тебе счастье!
Изображение
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: SluggableBehavior

Сообщение Loveorigami »

Решение хорошее, спасибо, но для одной конкретной задачи без вариантов.
На CI оно у меня так и работает ).

Тут опять сталкиваемся с рядом проблем:
1. Russian Inflector (решение в теме было - но неочевидно)
2. Для некоторых записей сделать slug без id
3. Постоянно писать везде Url::to(['post/view', 'slug' => $model->slug]) проще и гибче
- допустим захочу переделать slug к типу some-1, some-2...
и придется во всем проекте заменять Url::to(['post/view', 'id'=>$model->id, 'slug' => $model->slug]) на Url::to(['post/view', 'slug' => $model->slug])
- а так, когда полный slug хранится в одном столбце - написал алгоритм в консоли и привел к одному типу
- не надо делать две проверки в контроллере (если есть id, получить запись, а потом равен ли slug в базе slug-у из url)
4. Одно поведение на все случаи - намного удобнее и практичнее
wpd
Сообщения: 161
Зарегистрирован: 2014.08.22, 12:34
Контактная информация:

Re: SluggableBehavior

Сообщение wpd »

В моделе
use yii\behaviors\SluggableBehavior;

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

public function attributeLabels()
{
return [
'slug' => 'Slug',
'name' => 'Name',

Добавляю запись, но слуг пустой. Что я не так делаю? Объясните пожалуйста.
Download TV Series in HD http://serialsfree.net/
wpd
Сообщения: 161
Зарегистрирован: 2014.08.22, 12:34
Контактная информация:

Re: SluggableBehavior

Сообщение wpd »

кто нибудь подскажет?
Download TV Series in HD http://serialsfree.net/
Аватара пользователя
Insolita
Сообщения: 788
Зарегистрирован: 2011.06.06, 01:39
Контактная информация:

Re: SluggableBehavior

Сообщение Insolita »

wpd писал(а):В моделе
use yii\behaviors\SluggableBehavior;

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

public function attributeLabels()
{
return [
'slug' => 'Slug',
'name' => 'Name',

Добавляю запись, но слуг пустой. Что я не так делаю? Объясните пожалуйста.

в rules/сценариях атрибут slug описан/разрешен ?
wpd
Сообщения: 161
Зарегистрирован: 2014.08.22, 12:34
Контактная информация:

Re: SluggableBehavior

Сообщение wpd »

Не был включен intl. По этому не работало.
Download TV Series in HD http://serialsfree.net/
Аватара пользователя
Akulenok
Сообщения: 437
Зарегистрирован: 2014.05.05, 18:32
Откуда: localhost

Re: SluggableBehavior

Сообщение Akulenok »

Подскажите а можно сделать чтоб slug заполнялся сразу при написание титла, ну или при фокусе.
и как заменить - на _ ?
зы: я использую это https://github.com/r3verser/yii2-SluggableBehavior
ភាសាខ្មែរ Yii2 - это кайф!
Ответить