Теги - важная часть группировки информации в Интернете. На Medium вы помечаете свои сообщения категориями. В Facebook вы отмечаете свои фотографии. В Gmail вы можете пометить свои сообщения ярлыками. На GitHub вы можете добавлять теги в свои репозитории. В этом руководстве мы рассмотрим, как я использовал готовые пакеты Laravel и Vue.js для создания системы тегов для кандидатов на Employbl.com.
Если вы еще этого не сделали, не стесняйтесь протестировать эту функцию, подав заявку на присоединение к сети Employbl.
Конечный результат выглядит примерно так:
Я хотел добавить теги в форму профиля кандидата, чтобы работодатели могли искать и фильтровать соответствующие таланты в своей области. Что касается тегов, мне нужен предварительно заполненный список доступных тегов, чтобы кандидаты с похожими тегами использовали один и тот же тег. Я не хотел, чтобы кандидаты добавляли новые теги, такие как «Node», «Nodejs» и «Node.js», которые означают одно и то же.
Начнем с создания интерфейса, того, что на самом деле видит пользователь.
🔖 Интерфейс
Vue-multiselect создан Дамианом Дулишем, членом основной команды Vue.js. У него около 4000 звезд на GitHub. Поддержка основного члена команды, удобный веб-сайт документации и звезды GitHub - все это побудило меня выбрать эту библиотеку, а не потрясающе выглядящую vue-tags-input.
После того, как я выбрал библиотеку, было важно, чтобы компонент был частью формы, которую я мог отправить в серверную часть. Обычно я использую Blade для создания формы, которая будет выглядеть примерно так:
app/resources/views/mytemplate.blade.php<form method="POST" action="{{ route(task.create) }}"> @csrf
<input type="text" class="form-control" name="title"> <input type="submit" value="Submit"> </form>
Это хорошо, но не работает, когда вашей форме требуются функции Javascript. Например, посмотрите, имеет ли смысл этот код:
app/resources/views/mytemplate.blade.php<form method="POST" action="{{ route(task.create) }}"> @csrf
<input type="text" class="form-control" name="title"> <multiselect v-model="value" :options="options" :searchable="false" :close-on-select="false" :show-labels="false" placeholder="Add tags for this task"></multiselect>
<input type="submit" value="Submit"> </form>
Это уродливо и сломается. Лучше всего извлечь всю форму из Blade в компонент Vue. Я нашел приведенное ниже сообщение в блоге Марка Шерренберга очень полезным.
В этом посте он извлекает логику формы в удобный миксин Vue.js. Я не заходил так далеко, но если я создавал много форм или имел для работы других разработчиков, то, безусловно, было бы о чем подумать.
Вместо этого мой компонент лезвия выглядит так:
@extends('layouts.app') @section('content') <br> <br> <br> <div class="row"> <div class="col-sm-6 offset-sm-2"> <h3>✊ Complete your profile</h3> <span class="text-muted">This will only be shown to legit companies. We don't mess with headhunters, agency recruiters or third parties.</span> <hr> </div> </div> <candidate-profile-form candidate="{{ $candidate }}" tags="{{ $allTags }}" candidate-tags="{{ $candidateTags }}"></candidate-profile-form>
В приведенном выше коде мы визуализируем шаблон лезвия, который отображает компонент Vue. Мы передаем данные с сервера, используя синтаксис Blade и свойства Vue. Данные будут доступны компоненту в виде строки. Чтобы убедиться, что его можно использовать, мы вызовем JSON.parse для значения props.
Компонент <candidate-profile-form>
выглядит примерно так:
Внутри функции компонента data
мы анализируем объекты JS, которые мы передали через лезвие. Список доступных тегов, которые могут выбрать кандидаты, сообщения об ошибках и текущая информация о кандидате будут поступать из серверной части Laravel.
Защита Axios и CSRF доступна для нашего компонента Vue через файл по умолчанию bootstrap.js, который поставляется с Laravel 5.7.
🚀 Бэкэнд
Для добавления тегов в бэкэнд мы будем использовать пакет от агентства веб-разработчиков Spatie. Ведущими сопровождающими являются: Фрик Ван дер Хертен, Алекс Вандербист и drbyte. Спасибо! 🙏
Есть два метода контроллера. Измените, если для отображения блейд-формы, а обновление - для запроса PUT, когда кандидат нажимает «Сохранить». Второй файл - это сидер, который создает все доступные теги, из которых могут выбирать кандидаты.
Я сохраняю кандидатов в таблице пользователей.
Здесь происходит кое-что забавное с нетерпеливой загрузкой и анализом тегов при их возврате в форму. Таким образом, мы отображаем только имя тега вместо объекта тега. Цель этого на бэкэнде - сделать наш компонент Vue как можно более простым.
Спасибо за прочтение! Если у вас есть предложения по коду, оставьте комментарий или напишите мне в твиттере.
Не стесняйтесь создавать профиль кандидата на Employbl: https://employbl.com/candidates (в настоящее время доступно только кандидатам из США)
Ваше здоровье! 🍻