SluggableBehavior

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
dmg
Сообщения: 685
Зарегистрирован: 2012.10.15, 03:09

SluggableBehavior

Сообщение dmg »

пробую yiisoft/yii2/behaviors/SluggableBehavior

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

 public function behaviors()
   {
       return [
           [
              'class' => SluggableBehavior::className(),
               'attribute' => 'name',
 //            'slugAttribute' => 'slug',
           ],
       ];
   }
 
не работает. не ругается. что то надо еще предпринять?
ps. подключал на пробу TimestampBehavior - работает.
dmg
Сообщения: 685
Зарегистрирован: 2012.10.15, 03:09

Re: SluggableBehavior

Сообщение dmg »

разобрался.
php должен быть с intl
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: SluggableBehavior

Сообщение Loveorigami »

У меня работает, но как то странно )

в name - тестовая новость
в slug получаю - testovaa novost.

т.е. русские йотованные транслитируются неверно.

Подскажите, как можно поправить?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: SluggableBehavior

Сообщение zelenin »

Loveorigami писал(а):т.е. русские йотованные транслитируются неверно.
для начала нужно понять, что по вашему правильно.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: SluggableBehavior

Сообщение zelenin »

Loveorigami писал(а):Подскажите, как можно поправить?
не использовать это поведение.
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: SluggableBehavior

Сообщение Loveorigami »

zelenin писал(а):
Loveorigami писал(а):т.е. русские йотованные транслитируются неверно.
для начала нужно понять, что по вашему правильно.
по виду, должно быть
я - ja
ю - ju и т.п.
==========
testovaja вместо testovaa
zelenin писал(а):
Loveorigami писал(а):Подскажите, как можно поправить?
не использовать это поведение.
Это понятно ;) , я бы и сам переопределил и поправил эти моменты.
Просто казалось - если из коробки, значит должно работать как надо.

А если "не как надо", значит или баг, или какие-то настройки нужны.
В доках пока только про timestamp написано...
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: SluggableBehavior

Сообщение zelenin »

Loveorigami писал(а): по виду, должно быть
я - ja
ю - ju и т.п.
==========
testovaja вместо testovaa
а мне вот кажется ya.
А разработчикам intl - a
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: SluggableBehavior

Сообщение zelenin »

Loveorigami писал(а): Просто казалось - если из коробки, значит должно работать как надо.
так я и говорю: надо определиться, что такое "как надо".
Если вам кажется, что какой-то вариант правильный, то это не значит, что он таким является на самом деле.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: SluggableBehavior

Сообщение zelenin »

Loveorigami писал(а): А если "не как надо", значит или баг, или какие-то настройки нужны.
В доках пока только про timestamp написано...
intl - отдельное расширение php.
Аватара пользователя
r3verser
Сообщения: 195
Зарегистрирован: 2012.04.01, 17:29
Откуда: Киев

Re: SluggableBehavior

Сообщение r3verser »

Loveorigami писал(а):У меня работает, но как то странно )

в name - тестовая новость
в slug получаю - testovaa novost.

т.е. русские йотованные транслитируются неверно.

Подскажите, как можно поправить?
Проблема в том что в Inflector'е, который используется в SluggableBehavior выставлен дефолтовый транслитератор как - Any-Latin; NFKD, с которым мы получаем не совсем то что нужно:

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

я сегодня выходил = a-segodna-vyhodil
Если выставить нужный нам транслитератор, например - Russian-Latin/BGN; NFKD, то результат будет следующим

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

я сегодня выходил = ya-segodnya-vykhodil
Изменить транслитератор через параметры к SluggableBehavior вроде как нельзя, так что нужно или наследоваться или заменить его на свой.
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: SluggableBehavior

Сообщение Loveorigami »

@r3verser - спасибо большое! То что нужно!
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: SluggableBehavior

Сообщение slavcodev »

Вот кажется можно настроить Inflector
https://github.com/yiisoft/yii2/blob/ma ... r.php#L239
Жду Yii 3!
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: SluggableBehavior

Сообщение samdark »

Умгу. Там довольно общее правило.
Аватара пользователя
r3verser
Сообщения: 195
Зарегистрирован: 2012.04.01, 17:29
Откуда: Киев

Re: SluggableBehavior

Сообщение r3verser »

slavcodev писал(а):Вот кажется можно настроить Inflector
https://github.com/yiisoft/yii2/blob/ma ... r.php#L239
Сам инфлектор да, имелось ввиду из SluggableBehavior нельзя его настроить. Вот мой пример измененного поведения https://gist.github.com/r3verser/b7c7b0b2b64a3a4bd732, добавлена опция "transliterator". Использовать можно так:

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

public function behaviors()
    {
        return [
            [
                'class' => \app\components\SluggableBehavior::className(),
                'attribute' => 'name',
                'slugAttribute' => 'slug',
                'transliterator' => 'Russian-Latin/BGN; NFKD'
            ],
        ];
    }
 
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: SluggableBehavior

Сообщение Loveorigami »

Спасибо, поведение работает!
Есть нюанс - slug берется из атрибута и заменяется без всяких оговорок.

Думаю, правильнее было бы заменять slug в том случае, если он пустой.
Для сеошников крайне важно: название статьи поменял, а ссылку нужно оставить прежней.
Аватара пользователя
r3verser
Сообщения: 195
Зарегистрирован: 2012.04.01, 17:29
Откуда: Киев

Re: SluggableBehavior

Сообщение r3verser »

Loveorigami писал(а):Спасибо, поведение работает!
Есть нюанс - slug берется из атрибута и заменяется без всяких оговорок.

Думаю, правильнее было бы заменять slug в том случае, если он пустой.
Для сеошников крайне важно: название статьи поменял, а ссылку нужно оставить прежней.
Вообщем создал репо, куда добавил и эту идею, проверяй ;) - https://github.com/r3verser/yii2-SluggableBehavior
Теперь чтобы отключить автоапдейт slug'a если старый уже есть, в опциях укажи forceUpdate => false.

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

  public function behaviors()
  {
  return [
       [
           'class' => \app\components\SluggableBehavior::className(),
           'attribute' => 'name',
           'slugAttribute' => 'slug',
           'transliterator' => 'Russian-Latin/BGN; NFKD',
           //Set this to true, if you want to update a slug when source attribute has been changed
           'forceUpdate' => false
       ],
   ];
  }
kotchuprik
Сообщения: 75
Зарегистрирован: 2012.02.06, 19:33
Контактная информация:

Re: SluggableBehavior

Сообщение kotchuprik »

@r3verser может стоит кинуть пулл реквест в yii2-core?
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: SluggableBehavior

Сообщение Loveorigami »

Спасибо. Теперь все работает, как надо!

У меня есть еще один интересный момент. В codeIgniter я реализовывал через составной alias. А именно:
- Имеется база с более 40 000 записей (rss новости с фликра по оригами).
- При добавлении новой очень большая вероятность, что похожая уже есть, причем не одна. (например "origami heart" встречается более 50 раз)
- Это означает, что при добавлении следующей записи "origami heart", поведение, как я понял, будет генерировать уникальный slug, поочередно перебирая свободные от origami-heart1 до origami-heart50, т.е. делать 50 запросов в базу...

- есть идея, для такого случая генерировать slug вида id-записи + slug.
- т.е. в данное поведение добавить следующий функционал (suffix и prefix)...

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

  public function behaviors()
  {
  return [
       [
           'class' => \app\components\SluggableBehavior::className(),
           'attribute' => 'name',
           'slugAttribute' => 'slug',
           'transliterator' => 'Russian-Latin/BGN; NFKD',
           //Set this to true, if you want to update a slug when source attribute has been changed
           'forceUpdate' => false,
           // для id=145
      'suffix' => 'id'    // получим slug-145
      //или
      'prefix' => 'id' // // получим 145-slug
       ],
   ];
  }
т.е окончательно уникальный slug видимо придется получить в методе AfterSave (если указаны 'suffix' или 'prefix' ) и дополнительно обновить slug при операции insert.

---------
p.s. Как я писал, в CI я делал составной alias (в разных полях). Приходилось мне делать доп. роутинг, проверять существование записи по id а также сопоставлять с его alias-ом... И это для каждого модуля.

Словом, хранение aliasa в виде id+slug в одном поле намного облегчит работу с таблицей, где title может встречаться многократно.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: SluggableBehavior

Сообщение zelenin »

Loveorigami писал(а):Спасибо. Теперь все работает, как надо!

У меня есть еще один интересный момент. В codeIgniter я реализовывал через составной alias. А именно:
- Имеется база с более 40 000 записей (rss новости с фликра по оригами).
- При добавлении новой очень большая вероятность, что похожая уже есть, причем не одна. (например "origami heart" встречается более 50 раз)
- Это означает, что при добавлении следующей записи "origami heart", поведение, как я понял, будет генерировать уникальный slug, поочередно перебирая свободные от origami-heart1 до origami-heart50, т.е. делать 50 запросов в базу...

- есть идея, для такого случая генерировать slug вида id-записи + slug.
- т.е. в данное поведение добавить следующий функционал (suffix и prefix)...

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

  public function behaviors()
  {
  return [
       [
           'class' => \app\components\SluggableBehavior::className(),
           'attribute' => 'name',
           'slugAttribute' => 'slug',
           'transliterator' => 'Russian-Latin/BGN; NFKD',
           //Set this to true, if you want to update a slug when source attribute has been changed
           'forceUpdate' => false,
           // для id=145
      'suffix' => 'id'    // получим slug-145
      //или
      'prefix' => 'id' // // получим 145-slug
       ],
   ];
  }
т.е окончательно уникальный slug видимо придется получить в методе AfterSave (если указаны 'suffix' или 'prefix' ) и дополнительно обновить slug при операции insert.

---------
p.s. Как я писал, в CI я делал составной alias (в разных полях). Приходилось мне делать доп. роутинг, проверять существование записи по id а также сопоставлять с его alias-ом... И это для каждого модуля.

Словом, хранение aliasa в виде id+slug в одном поле намного облегчит работу с таблицей, где title может встречаться многократно.
мое расширение поддерживает составные слаги, в том числе и через связи https://github.com/zelenin/yii2-slug-behavior
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: SluggableBehavior

Сообщение Loveorigami »

zelenin писал(а):
мое расширение поддерживает составные слаги, в том числе и через связи https://github.com/zelenin/yii2-slug-behavior
спасибо. посмотрел код, настройки, но так и не понял каким образом могу получить, скажем, для 30250 записи slug
30250-origami-heart.

дело в том, что я буду переводить свою базу из CI в Yii2, slug сделаю в одном поле, где префикс буду брать из id.
пример - http://new.loveorigami.info/world/42107 ... hi-mukerji

И дальше на yii хочу, чтобы она работала по такой же схеме, как я описал выше.
Ответить