Выбор тегов из набора при создании поста в блоге

+10
2.14K
Возможно кому то пригодится.
При создании поста в блоге, под полем для ввода тегов к данной записи, вывод тегов, которые использовались на сайте ранее. При нажатии на тег в списке, он перелетает в список тегов для этой записи.

Для чего это может понадобиться.
Что бы было меньше разнобоя в тегах. Со временем забываешь, какие теги использовал для подобной темы в прошлый раз или просто забываешь как их формулировал: фильм или фильмы, картошка или картофель. Возможно, имея перед глазами подобную панельку, удастся более унифицировать набор используемых тегов.
Сам только применил для одного сайта, посмотрю, насколько это полезно позже.

Шаг 1

В core/lib_tags.php
в самый конец добавить это

  1. function cmsPopTagsList(){
  2. $inDB = cmsDatabase::getInstance();
  3. $html = '';
  4. $sql = "SELECT t.tag, COUNT(t.tag) as num
  5. FROM cms_tags t
  6. GROUP BY t.tag
  7. ORDER BY t.tag";
  8. $result = $inDB->query($sql) ;
  9. if ($inDB->num_rows($result)>0){
  10. while($tag = $inDB->fetch_assoc($result)){
  11. if ($tag['tag']){
  12. $html .= '<a class="addtag" param=", '.$tag['tag'].'">'.$tag['tag'].'</a><a target="_blank" href="/search/tag/'.urlencode($tag['tag']).'">('.$tag['num'].')</a>';
  13. }
  14. }
  15. }
  16. return $html;
  17. }
Выше мы создаём список тегов по аналогии с уже имеющийся в том же файле функцией создания списка тегов. Но здесь мы по другому обрабатываем вывод html тегов, делаем так, что бы при клике по тегу, не открывался поиск по тегам, (хотя рядом с тегом есть счетчик его упоминаний, если кликнуть на него, откроется поиск по этому тегу в новой вкладке).

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

Если их сотни или тысячи) можно вывести 100 самых популярных тегов.

  1. function cmsPopTagsList(){
  2. $inDB = cmsDatabase::getInstance();
  3. $html = '';
  4. $sql = "SELECT t.tag, COUNT(t.tag) as num
  5. FROM cms_tags t
  6. GROUP BY t.tag
  7. ORDER BY num
  8. LIMIT 100";
  9. $result = $inDB->query($sql) ;
  10. if ($inDB->num_rows($result)>0){
  11. while($tag = $inDB->fetch_assoc($result)){
  12. if ($tag['tag']){
  13. $html .= '<a class="addtag" param=", '.$tag['tag'].'">'.$tag['tag'].'</a><a target="_blank" href="/search/tag/'.urlencode($tag['tag']).'">('.$tag['num'].')</a>';
  14. }
  15. }
  16. }
  17. return $html;
  18. }

Шаг 2

components/blogs/fronted.php

в двух местах

после

  1. $post['tags'] = cmsTagLine('blogpost', $post['id'], false);
и после

  1. $post = cmsUser::sessionGet('mod');
вставить строку

  1. $post['poptags'] = cmsPopTagsList();

Шаг 3

в шаблоне /components/com_blog_edit_post.tpl

после

  1. <input name="tags" class="text-input" type="text" id="tags" style="width:400px" value="{$mod.tags|escape:'html'}"/>
вставить это

  1. <div style="width:400px; height:100px; overflow:scroll;">{$mod.poptags}</div>
  2.  
  3. <script>
  4. $('a.addtag').click(function(e){
  5. $('#tags').val($('#tags').val() + this.getAttribute('param'));
  6. e.preventDefault();
  7. });
  8. </script>
Теперь, при создании, редактировании поста появляется вот такой бар с тегами.

Иллюстрация

При нажатии на тег в баре, он добавляется с список тегов этого материала.
Единственное неудобство, если редактировать старую запись, где уже были теги и добавлять новые, то перед первым добавляемым тегом придётся в ручную поставить запятую.

Что бы стилизовать теги в наборе можно в
styles.css добавить стили для него
типа

  1. .poptagsbar{
  2. padding:3px; background:#004080; border-radius:4px; border:1px solid silver; margin:2px; opacity:0.8; display:inline-block;}
  3. .poptagsbar:hover{
  4. opacity:1.0;}
  5. .poptagsbar a{
  6. color:#FFFFFF; text-decoration:none; cursor:pointer;}
То может выглядеть как то так.

Иллюстрация

Вроде всё работает.


Кто хочет улучшить, дополнить, развить, не стесняйтесь)

UPD

Для статей

Шаг 1 если уже делали пропустисть.

Потом /components/content/fronted.php
перед
Код PHP:
  1. cmsPage::initTemplate('components', $article['tpl'])->
вставить
Код PHP:
  1. $article['poptags'] = cmsPopTagsList();
Перед
Код PHP:
  1. cmsPage::initTemplate('components', 'com_content_edit')->
вставить
  1. $item['poptags'] = cmsPopTagsList();
В шаблон com_content_edit.tpl
после <input name="tags" type="text" class="text-input" id="tags...
Вставить
<div style="width:400px; height:100px; overflow:scroll;">{$mod.poptags}</div>
<script>
$('a.addtag').click(function(e){
$('#tags').val($('#tags').val() + this.getAttribute('param'));
e.preventDefault();
});
</script>
0
Василич Василич 5 лет назад #
Давай под двойку )
Полезно для узкоспециализированных ресурсов.
0
Нил™ Нил™ 5 лет назад #
Да, я тоже думаю, что это больше для тематических сайтов, где посты объединены одной мега-темой. Как раз работая над таким, подумал об этом.
Для двойки не смогу, но наверно, если это полезно, разработчики для двойки возьму на заметку)
Пока думаю, нужно нечто подобное сделать для профиля (первая ветка) пользователя для поля "интересы", убрать полностью возможность писать произвольные метки и попросить выбирать из тегов. А то сейчас пользователи пишут туда иногда целые поэмы, которые никак не полезны для поиска людей с теми же интересами, а так можно задать набор возможных интересов, типа: путешествия, пиво, сериалы, животные и т. п.
0
Василич Василич 5 лет назад #
Угу, на конт.вс помню такое, еще где-то встречал, удобно. На лайф.ру вся система на тегах держится, я думаю за тегами будущее, они хорошо заменяют категории. Переходи уже на двойку, все силы вбухиваются в нее, а за такое я даже денег дам, зеле полезно )
Касательно юзеров, посмотри вк, есть предустановки но жёстко на них останавливаться думаю не стоит.
0
Cleverking Cleverking 5 лет назад #
А для статей такой же выбор тегов сделать сложно?
0
Нил™ Нил™ 5 лет назад #
Нет не сложно.
Спойлер
0
Нил™ Нил™ 5 лет назад #
К сожалению сколько не проверяй текст перед отправкой, все равно потом придется исправлять ошибки. Не знаю какой по счёту закон Мерфи)
В предыдущем комментарии возникла ошибка, отредактировать его не могу, удалить тоже.
Исправил сам пост, исправленный ответ по поводу статей там.
0
allhyipmon allhyipmon 5 лет назад #
Потом /components/content/fronted.php
перед

Код PHP:
cmsPage::initTemplate('components', $article['tpl'])->

Нету такого кода :(
0
Нил™ Нил™ 5 лет назад #
Instantcms 1.10.7 components/content/fronted.php
строка 271

Еще от автора

Автопостинг с канала в Telegram в ленту активности сайта (Первая ветка)
В прошлом посте я демонстрировал схему автопостинга сообщений из ленты активности сайта на канале в Telegram.
Автопостинг из ленты активности сайта на канал в телеграм для первой ветки
Заметил на форуме вопрос про автопостинг в телеграм для второй ветки.
Изменения в компоненте «баннеры»: количество, внешний вид, формат ссылки
Немного изменил компонент баннеры. Вместо одного баннера, теперь выводится два подряд.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.