Автоматическая генерация алиаса и ключевых слов для статьи

18.11.2015

Небольшой пример того, как можно организовать у себя на сайте генерацию алиаса (alias) и ключевых слов (keywords) при написании статей. В большинстве случаев используется в административной части сайта для упрощения написания статей.

И так, для генерации алиасов я перевожу написанный заголовок статьи на английский, делаю нижний регистр символов, убираю все знаки кроме букв, цифр и тире. Генерация происходит после того, как написан заголовок.

В модели нашей статьи, например backend\models\Article\Article.php описываем правило проверки алиаса (alias):

 public function rules()
    {
        return [
            [['title', 'text', 'alias', 'publish', 'catid', 'created'], 'required'],
            [['text'], 'string'],
            [['metadatajson', 'image'], 'safe'],
            [['publish', 'catid'], 'integer'],
            [['title', 'alias',], 'string', 'max' => 255],
            [['alias'], 'match', 'pattern' => '/^[a-zA-Z0-9-]+$/', 'message' => 'Только латинские буквы, цифры и тире'],
            ['image', 'file', 'extensions' => 'jpeg, jpg, png'],
        ];
    }

 

Обратим внимание на:

            [[........, 'alias',.........], 'required'],
            ...
            [...., 'alias',], 'string', 'max' => 255],
            [['alias'], 'match', 'pattern' => '/^[a-zA-Z0-9-]+$/', 'message' => 'Только латинские буквы, цифры и тире']
            ...

Исходя из вышеописанного, alias у нас обязателен для заполнения. Максимальная длинна его будет не больше 255 символов и регуляркой проверяем, чтобы он содержал только буквы английского алфавита, цифры и тире.

Ключевые слова (keywords), может быть обычным полем, для которого проверки не нужны.

[[....,'keywords',....], 'string'],

Дальше создаем javascript файл где-нибудь в backend\web\js\auto_generate.js c содержимым:

function getAlias(alias,text){
    if(!alias.val() && text.length > 5) {
        $.ajax({
            url: 'https://translate.yandex.net/api/v1.5/tr.json/translate',
            data: {
                key: 'ВАШ API КЛЮЧ',
                text: text.trim(),
                lang: 'ru-en',
                format: 'plain'
            },
            success: function (data) {
                var result = data.text[0].toLowerCase().replace(/\s/ig, '-').replace(/[^a-z-0-9]/g, '');
                alias.val(result);
            }
        });
    }
}

function getKeywords(input_keywords,text){
    if(!input_keywords.val() && text.length > 5) {
        var words = text.replace(/[^А-яA-z-0-9\s]/g, '').toLowerCase().split(' ');
        for (var i = 0; i < words.length; i++) {
            if (words[i].length <= 3) {
                words.splice(i, 1);
                i--;
            }
        }
        input_keywords.val(words.join(','));
    }
}

Вместо "ВАШ API КЛЮЧ" подставляем ключ с генерированный здесь. Скорее всего нужно будет зарегистрироваться (не забудьте почитать правила использования api переводчика).

Осталось дело за малым, а именно добавляем к полю title (заголовок) функцию onchange и подключаем наш файл js. Все делаем в форме нашей модели, например backend\views\article\_form.php:

$this->registerJsFile('/js/auto_generate.js', ['depends' => ['yii\web\JqueryAsset']]);

...
<?= $form->field($model, 'title')->textInput(['maxlength' => true, 'onchange' => '
            getAlias($("#article-alias"),$(this).val());
            getKeywords($("#article-keywords"),$(this).val());
        ']) ?>
...

В описанном выше коде мы подключили файл auto_generate.js после библиотеки jquery и определили действие которое будет происходить при изменении заголовка (а именно после снятия фокуса с поля title).

getAlias - генерация заголовка.  (можно убрать строчку, тогда алиас генерироваться не будет)

getKeywords - генерация ключевых слов. (можно убрать строчку, тогда ключевые слова генерироваться не будут)

Т.о. после написания заголовка для статьи мы переходим например к написанию самой статьи и в этот момент автоматически генерируется алиас и ключевые слова.

Обратите внимание#article-alias и #article-keywords нужно подставить свои значения (id полей alias и keywords).

Алиас и ключевые слова генерируются только один раз, после чего дополнять или изменять придется вручную. Если же нужно еще раз с генерировать, очищаем поле alias и/или keywords, после чего правим заголовок.

 

Данный код может работать и без yii2. Достаточно подключить на страницу файл auto_generate.js и добавить на js что-то вроде:

$(function() {

    $('#title').change(function(){

        getAlias($("#alias"),$(this).val());
        getKeywords($("#keywords"),$(this).val());

    });

});

Где нужно будет подставить свои id элементов на странице.

Вот и все.

comments powered by HyperComments