Автоподбор тегов в середине списка тегов при добавлении/редактировании контента.
Пользователи часто хотят добавить тег не в конце списка, а в середине. И тогда автоподбор не работает, люди делают ошибки. Да я и сам хотел бы иметь такое удобство, так как сейчас много работаю с тегами. Поясню на примере:
Человек набрал теги под статьёй: "первый, второй, четвёртый"
Потом понял, что забыл написать "третий", поставил курсор после "второй", набрал "," (запятую). Получил: "первый, второй,(тут курсор), четвёртый"
Так вот, если перед курсором начало строки или запятая, и после него конец строки или запятая, всё набранное между ними можно использовать для автоподбора. То есть, человек набирает "тре", а ему уже подсказывается "третий", если он уже есть где-то в тегах. И после нажатия "Таб" слово автозавершается и подставляется в позицию курсора.
Та же правка будет полезна и при редактировании тегов в середине списка в той же форме добавления/редактирования записи.
Например, человек набрал теги под статьёй: "первый, вторй, третий". Заметил, что неправильно написал "второй", поставил после "р" курсор и нажал "о" — в выпадающем списке автоподбора появилось: "второй, второй тайм, второй шанс" и т.д.
Я понимаю, что сейчас последняя набранная в строке фраза выбирается для автоподбора регуляркой и пушем тут
github.com/instantsoft/icms2/blob/master/templates/default/assets/fields/string.tpl.php#L37
и потом выбранное из выпадающего списка значение тега подставляется вместо неё в конец списка тут
github.com/instantsoft/icms2/blob/master/templates/default/assets/fields/string.tpl.php#L57
Но моих знаний Явы не хватает, чтобы вытащить фразу из той части, где стоит курсор и потом туда подставить. Там всего то это и нужно сделать.
Кто сможет сделать такую правку?
$старый друг != $старий друг; //переменная справа на украинскомсей ещё весьма не старый друг
А что, таки есть особи человеческого происхождения, которые её знают?друг не знает Яву
В общем, сделал что хотел. Теперь автоподбор работает и для тегов в середине строки, а не только для последнего. Мне всё нравится, стало удобнее. Полную чистоту кода и его оптимальность не гарантирую ввиду незнания Явы, но ошибок в консоли не видел.
Все изменения тут github.com/WebManG/icms2/commit/0807700911c725f2a8c219c3e31f9f4bf7d13dd7
Если кому интересно для тестирования, можете просто сохранить из Гита изменённый файл templates/default/assets/fields/string.tpl.php и заменить им дефолтный.
Немного подожду ваших отзывов и, если не будет выявлено ошибок, сделаю реквест в "коробку" — может Fuze посчитает это полезным.
/* Выпадающий список автоподбора тегов */ .ui-autocomplete.ui-widget-content { background-color: #FFFFEE; } /* Активная строка в этом списке */ .ui-autocomplete.ui-widget-content .ui-menu-item.ui-state-focus { background-color: #FFFFCC; }
Придумал ещё одно улучшение — отбор подходящих тегов содержащих введённую строку не только с начала, а и в любом месте. При этом сортировка делается так, чтобы сначала показывались теги, где искомая строка идёт вначале, а потом остальные (в середине тега). В каждом из этих блоков сделана сортировка по алфавиту (две стрелки на скрине).
Кстати, в дефолтной версии сортировка делается по внутреннему номеру тега, то есть, для пользователя это выглядит, как будто теги в списке выводятся в случайном порядке, что очень неудобно, на мой взгляд.
Доработка очень проста, но является хаком — при обновлении движка слетит и нужно будет её повторять.
В файле \system\controllers\tags\actions\autocomplete.php меняем строку 13
$tags = $this->model->filterLike("tag", "{$term}%")->getTags();
// >> WebMan: // 1. фильтр по любой части тега, а не только начинающиеся с введённой строки, // 2. сортировка (по алфавиту + сначала теги, начинающиеся с введённой строки $tags = $this->model-> filterLike("tag", "%{$term}%")-> ))-> getTags(); // << WebMan
Тестирование показало, что на среднем сервере на таблице более тысячи тегов такой запрос работает очень быстро, занимая меньше 0,1 мс, что лично меня вполне устраивает.
Когда потратишь на оформление статьи минут 5, то конечно, ждать запрос в 0,1 мс покажется вечностьюзанимая меньше 0,1 м
Хорошее решение!
Последняя версия тут github.com/WebManG/icms2/commit/0807700911c725f2a8c219c3e31f9f4bf7d13dd7
Если у вас свой шаблон, можете просто скачать файл string.tpl.php с Гита и скопировать его в
templates/НАЗВАНИЕ_ВАШЕГО_ШАБЛОНА/assets/fields/string.tpl.php
Кстати, этот автоподбор будет работать везде, где используется дефолтное строковое поле, если указать нужные параметры поля (классы, атрибуты ['autocomplete'] / ['autocomplete']['multiple'] / ['autocomplete']['url']).
многие хотят, как вконтакте или facebook — ставить #тег #тег
может возможно обработчик поля доработать так, чтобы он воспринимал формат как с запятой так и с #
Теоретически, можно включить поддержку хештегов, отключить в нужном типе контента теги (чтобы вообще убрать поле ввода тегов) и написать свой хук, который при сохранении записей будет добавлять теги из её текстовых полей в таблицу тегов сайта.