zelenin/yii2-slug-behavior Как правильно ограничивать количество символов?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
yura1976
Сообщения: 134
Зарегистрирован: 2012.08.06, 13:24

zelenin/yii2-slug-behavior Как правильно ограничивать количество символов?

Сообщение yura1976 »

Здравствуйте!
Использую zelenin/yii2-slug-behavior.
В модели:

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

    public function rules()
    {
        return [
        .....
        [['slug'], 'filter', 'filter' => function ($value) {
                if (empty($value)) {
                    return Inflector::slug(TransliteratorHelper::process(substr($this->name,0,70)));
                } else {
                    return Inflector::slug(substr($value,0,70));
                }
            }],
            [['slug'], 'unique'],
            [['slug'], 'string', 'max' => 68],
            [['slug'], 'required', 'enableClientValidation' => false],
          ]
     }
        
        
    public function behaviors()
    {
        return [
            ...
            'slug' => [
                'class' => 'Zelenin\yii\behaviors\Slug',
                'slugAttribute' => 'slug',
                'attribute' => 'name',
                'ensureUnique' => true,
                'replacement' => '-',
                'lowercase' => true,
                'immutable' => false,
                'transliterateOptions' => 'Russian-Latin/BGN; Any-Latin; Latin-ASCII; NFD; [:Nonspacing Mark:] Remove; NFC;'
            ],

        ];
    }
Пользователь добавляет несколько статей с похожими названиями. Отличие только в концовке. Напр., первая статья имеет название "Моя какая-то статья. Ч.1", вторая статья имеет название "Моя какая-то статья. Ч.2". Если эти названия содержат более 70 символов, то формируется slug такой же. Похоже, что сначала формируется уникальное значение slug, и после этого происходит обрезка до 70 символов с помощью substr(), т.е., обрезается именно уникальная часть slug'a. Поэтому и получаются одинаковые значения slug. И в итоге при сохранении: SQLSTATE [23000]: Нарушение ограничения целостности: 1062 Повторяющаяся запись....
Как сделать так, чтобы обрезка происходила и при этом формировались уникальные значения slug?
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: zelenin/yii2-slug-behavior Как правильно ограничивать количество символов?

Сообщение yiiliveext »

В этом поведении нет ограничения длины слага, обрезание у вас происходит уже при валидации.
Рекомендую воспользоваться https://github.com/skeeks-semenov/yii2-slug-behavior
yura1976
Сообщения: 134
Зарегистрирован: 2012.08.06, 13:24

Re: zelenin/yii2-slug-behavior Как правильно ограничивать количество символов?

Сообщение yura1976 »

yiiliveext писал(а): 2019.11.26, 13:40 В этом поведении нет ограничения длины слага, обрезание у вас происходит уже при валидации.
Рекомендую воспользоваться https://github.com/skeeks-semenov/yii2-slug-behavior
Ограничение - в таблице mysql. Я, конечно, могу его снять, но тогда получится, что, если название статьи большое, то url будет длинным. Я думаю, это не очень хорошо.
Да и в случае использования zelenin/yii2-slug-behavior, предполагаю, можно убрать ограничение на длину и в правилах валидации и в БД. Т.е., проблема та же
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: zelenin/yii2-slug-behavior Как правильно ограничивать количество символов?

Сообщение yiiliveext »

Я вам написал каким поведением воспользоваться, чтобы решить вашу проблему. Там в его настройках можно указать максимальную длину слага и он будет возвращать уникальный слаг указанной максимальной длины, в правилах ничего при этом указывать не нужно. С тем, что вы используете так просто сделать не получиться, вам надо реализовывать проверку уникальности в фильтре.
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: zelenin/yii2-slug-behavior Как правильно ограничивать количество символов?

Сообщение unknownby »

Не совсем понятно, зачем ты столько всего прописываешь для значения slug.
Есть же более простой способ.

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

use yii\behaviors\SluggableBehavior;

//внутри модели
public function behaviors()
    {
        return [
            [
                'class' => SluggableBehavior::className(),
                'attribute' => 'name',
                'slugAttribute' => 'slug',
                'ensureUnique' => true,
            ],
        ];
    }
    
    public function rules()
    {
        return [
            [['name', ], 'required'],
            [['slug'], 'string', 'max' => 70],
            [['name', ], 'string', 'max' => 68],
        ];
    }
У тебя поле name имеет длину 68, а поле slug 70, чтобы 2 места еще было для формирования цифры, а лучше бы сделал name 70 и slug 75. Тебе не холодно и не жарко от +5 символов к slug
yura1976
Сообщения: 134
Зарегистрирован: 2012.08.06, 13:24

Re: zelenin/yii2-slug-behavior Как правильно ограничивать количество символов?

Сообщение yura1976 »

yiiliveext писал(а): 2019.11.26, 15:08 Я вам написал каким поведением воспользоваться, чтобы решить вашу проблему. Там в его настройках можно указать максимальную длину слага и он будет возвращать уникальный слаг указанной максимальной длины, в правилах ничего при этом указывать не нужно. С тем, что вы используете так просто сделать не получиться, вам надо реализовывать проверку уникальности в фильтре.
Да, действительно. Извините, невнимательно посмотрел сразу. Сейчас все получилось, работает как нужно.
Спасибо!
Ответить