Кастомизация облака тегов для DLE

Кастомизация облака тегов

Кастомизация облака тегов

Решил попробовать сделать симпатичные ссылки в облаке тегов и столкнулся с несколькими проблемами по части настройки шаблона.
В частности речь о полном отсутствии возможности настроить свой шаблон. Еще и эти обязательные "запятые" тоже не к месту, а чтобы что-то изменить или убрать - необходимо только вносить изменения в сами php файлы. Вот решением этих проблем мы и займемся. И в качестве бонуса дам код и стили тегов как на картинке.
Установка
Открыть файл engine/modules/show.full.php
Найти строку:
			$tpl->set( '{tags}', implode( ", ", $tags ) );

После нее вставить:
////////////////////////////////////////////////////////////////////////////////////////////////
			if(preg_match("#{tags=['\"]([^'\"]*)['\"]}#i",$tpl->copy_template,$sep)) $tpl->set($sep[0],implode($sep[1],$tags));
////////////////////////////////////////////////////////////////////////////////////////////////

Теперь в шаблоне fullstory.tpl можно выводить теги тегом:
{tags=""}

где в кавычках указывается символ или текст разделитель между тегами. Вот так можно повторить вывод стандартного тега:
{tags} 
{tags=", "}



Теперь сама страница облака тегов:
Открыть файл engine/modules/tagscloud.php
Найти строку:
		} else $sql_select = "SELECT tag, COUNT(*) AS count FROM " . PREFIX . "_tags GROUP BY tag";

После нее вставить:
////////////////////////////////////////////////////////////////////////////////////////////////
		$tagsort = 'tag';
		if(preg_match("#\\[list([^\]]*)\\](.+?)\\[/list\\]#is",$tpl->copy_template,$tpl_list)){
			$limit = false;
			$sep = '';
			if(preg_match("#limit=['\"](\d+)['\"]#i",$tpl_list[1],$lm)){
				$lm = intval($lm[1]);
				if($lm>0){
					$limit = true;
					$sql_select = "SELECT tag, COUNT(*) AS count FROM " . PREFIX . "_tags GROUP BY tag ORDER BY count DESC LIMIT 0,$lm";
				}
			}
			if(preg_match("#sep=['\"]([^'\"]*)['\"]#i",$tpl_list[1],$sp)) $sep = $sp[1];
			if(preg_match("#sort=['\"](count|tag)['\"]#i",$tpl_list[1],$tgsr)) $tagsort = $tgsr[1];
		}
		if(!$limit) $sql_select = "SELECT tag, COUNT(*) AS count FROM " . PREFIX . "_tags GROUP BY tag ORDER BY count DESC";
////////////////////////////////////////////////////////////////////////////////////////////////


Найти строку:
		usort ($list, "compare_tags");

ПЕРЕД ней вставить:
////////////////////////////////////////////////////////////////////////////////////////////////
		if($tagsort=='tag')
////////////////////////////////////////////////////////////////////////////////////////////////


Найти код:
				if ($config['allow_alt_url'] )
					$tags[] = "<a href=\"".$config['http_home_url']."tags/".urlencode($value['tag'])."/\" class=\"{$value['size']}\" title=\"".$lang['tags_count']." ".$value['count']."\">".$value['tag']."</a>";
				else
					$tags[] = "<a href=\"$PHP_SELF?do=tags&amp;tag=".urlencode($value['tag'])."\" class=\"{$value['size']}\" title=\"".$lang['tags_count']." ".$value['count']."\">".$value['tag']."</a>";

Заменить на:
////////////////////////////////////////////////////////////////////////////////////////////////
				if($tpl_list[2]){
					if ($config['allow_alt_url'] ) $link = $config['http_home_url']."tags/".urlencode($value['tag'])."/";
					else $link = $PHP_SELF."?do=tags&amp;tag=".urlencode($value['tag']);
					$temp = $tpl_list[2];
					$temp = str_ireplace("{link}",$link,$temp);
					$temp = str_ireplace("{tag}",$value['tag'],$temp);
					$temp = str_ireplace("{count}",$value['count'],$temp);
					$tags[] = $temp;
				}else{
					if ($config['allow_alt_url'] )
						$tags[] = "<a href=\"".$config['http_home_url']."tags/".urlencode($value['tag'])."/\" class=\"{$value['size']}\" title=\"".$lang['tags_count']." ".$value['count']."\">".$value['tag']."</a>";
					else
						$tags[] = "<a href=\"$PHP_SELF?do=tags&amp;tag=".urlencode($value['tag'])."\" class=\"{$value['size']}\" title=\"".$lang['tags_count']." ".$value['count']."\">".$value['tag']."</a>";
				}
////////////////////////////////////////////////////////////////////////////////////////////////


Найти строку:
		$tags = implode(", ", $tags);

ПЕРЕД ней вставить:
////////////////////////////////////////////////////////////////////////////////////////////////
		if($tpl_list[0]) $tpl->copy_template = str_replace($tpl_list[0],implode($sep,$tags),$tpl->copy_template);
////////////////////////////////////////////////////////////////////////////////////////////////


Теперь в шаблоне tagscloud.tpl можно вместо просто тега {tags} использовать конструкцию:
[list limit="100" sep="" sort="count"]<a href="{link}"><span class="tagname">{tag}</span><span class="tagcount">{count}</span></a>[/list]

где
limit - количество тегов
sep - в кавычках указывается разделитель между тегами, можно не указывать
sort - tag или count, соответственно сортировка по имени тега или по количеству
Все вышеперечисленные параметры не являются обязательными. Можно писать просто:
[list]<a href="{link}">{tag} ({count})</a>[/list]
{link} - адрес страницы тега
{tag} - имя тега
{count} - количество новостей с тегом


Бонус:
В шаблоне tagscloud.tpl использовать код:
		<div class="numbertag">
			[list limit="100" sort="count"]<a href="{link}"><span class="tagname">{tag}</span><span class="tagcount">{count}</span></a>[/list]
		</div>


В шаблоне fullstory.tpl код:
<div class="finetags">{tags=''}</div>




Пример работы можно посмотреть на сайте http://color.sandev.pro/tags/

С уважением,
Олег Александрович a.k.a. Sander
Комментарии: (26)
  1. foto
    Посетитель 20 ноября 2016 13:55 #
    А будет ли работать limit в fullstory?
    0
    1. foto
      Администратор 20 ноября 2016 13:58 #
      Нет. А зачем он там?
      На странице тегов есть смысл ограничивать, если на сайте этих тегов несколько тысяч. В новости их и так не много. В крайнем случае можно просто скрывать лишнее в display: none
      0
      1. foto
        Посетитель 20 ноября 2016 14:20 #
        ну вот мне надо вывести только один, первый тег в новости.
        не совсем понимаю как скрыть лишнее дисплеем. стиль же у всех одинаковый.
        0
        1. foto
          Посетитель 5 октября 2018 23:55 #
          Ну например вот так:
           CSS
          0
      2. foto
        Посетитель 5 октября 2018 23:51 #
        Вспоминается игра (Что, Где, Когда) и её вопрос о Развесных сладостях. Или сравнение Пессимиста и Оптимиста. Короче не суть smile

        Суть в другом, а чего не сделать ограничение с другой стороны. Исключать теги которые еще не превысили заданное число.
        Очень много тегов, но чаще всего большинство тегов имеют очень малое количество статей. 100 тегов с параметром вывести Теги с 10 статьями и более уже значительно ограничит количество их на экране.

        P.S. Так же можно сделать формулу которая будет автоматически определять нижний порог в зависимости от количества. Я себе так в галерее сделал.
        0
        1. foto
          Администратор 6 октября 2018 13:25 #
          Вы описали работу тегов на странице облака тегов.
          В комментарии человек спросил именно про теги на странице полной новости, которые прописаны в самой новости.
          При этом выводе в теге не указывается количество публикаций по этому тегу.
          0
          1. foto
            Посетитель 6 октября 2018 19:59 #
            Ну для человека по поводу первого я дал простейшее решение (Спасибо за обновление комментария и удаления второго, странно, что редактировать своих же комментарии нельзя)

            Про порог тегов я писал как раз вам и как раз для тех разделов где выборка идёт из нужной таблици и теги подсчитываются.

            0
  2. foto
    VIP 17 декабря 2016 07:42 #
    Sander, у вас на демо-сайте есть интересный рейтинг и функция интернет-магазина, они продается где-то?
    0
    1. foto
      Администратор 17 декабря 2016 12:53 #
      Мультирейтинг продаваться будет. Пока не до него.

      Модуль корзины готов. В ближайшее время сделаю описание и выставлю на продажу.
      +1
  3. foto
    Посетитель 4 апреля 2017 11:00 #
    Все сделал по инструкции. На странице с тегами вместо них прописывается код:
    [list limit="100" sort="count"]{tag}{count}[/list]

    А в полной новости, теги выводятся нормально. Но без счетчика. DLE 11.2
    0
    1. foto
      Администратор 4 апреля 2017 14:50 #
      Так и должно быть. В полной новости не хранится и не выводится информация о количестве.
      0
      1. foto
        Клиент 1 сентября 2017 18:12 #
        Привет! Должно получится так? http://tvserial-online.biz/
        Чот никак неполучается, или тат там какой то модуль использовали?
        спс
        0
        1. foto
          Администратор 3 сентября 2017 13:59 #
          Должно получиться как на скриншоте.
          Что получилось или не получилось у вас на сайте я не нашел.
          0
          1. foto
            Клиент 7 сентября 2017 20:29 #
            мне ответили что дело в кодировке, 1251 у меня, а тут в теме какая?
            0
  4. foto
    Гость 1 ноября 2018 15:25 #
    А как удались в облаке тегов Показать все теги ? Версия DLE 13.1
    0
  5. foto
    Клиент 20 декабря 2018 22:03 #
    Нельзя ли {count} вывести в main.tpl для каждого тега, на страницу которого есть ссылка в меню?
    0
    1. foto
      Администратор 21 декабря 2018 12:28 #
      Если вы про работу тега {tags} в main.tpl, то тут есть 2 нюанса.
      1. У него нет шаблона, html код прописан в файле engine/modules/tagscloud.php
      2. Значение {count} есть и хранится оно в переменной $value['count']
      0
  6. foto
    Гость 11 декабря 2019 23:16 #
    А можно ли как-то сделать работу {tags limit="X"} в main.tpl?
    0
    1. foto
      Администратор 12 декабря 2019 01:02 #
      Довольно таки проблематично.
      Нужно будет полностью переписать работу вывода тегов.
      Ну или костыли писать.
      0
  7. foto
    Гость 31 января 2021 10:45 #
    Есть лишь одна большая проблема.
    Если установить этот хак и в теге будет два слова через пробел. То есть, все эти теги будут вести в никуда (вместо пробела подставляется "+") а это уже совсем другая страница.
    0
    1. foto
      Администратор 31 января 2021 12:39 #
      Раньше в качестве пробела использовался символ '+', теперь '%20'.
      Найти во вставляемом коде urlencode и заменить все на rawurlencode
      +1
      1. foto
        Гость 31 января 2021 13:01 #
        Как все просто оказалось.
        Огромное спасибо!
        0
  8. foto
    Клиент 27 января 2022 04:56 #
    $tpl->set( '{tags}', implode( ", ", $tags ) ); Увы уже нет в DLE 15 и 15.1 .
    0
  9. foto
    Клиент 7 июля 2022 03:06 #
    Версия движка 15.1 \ PHP 7.4.

    На странице вывода всех тегов, если в названии новости есть символ & тогда тег который отображает кол-во тегов ведет в никуда и показывает ошибку 404.
    tags/m.c. sar %26 the real mccoy/ - работает правильно
    tags/m.c. sar %26amp%3B the real mccoy/ - ошибка 404

    Как можно это исправить?
    0
  10. foto
    Гость 24 июня 2023 05:24 #
    Всегда пользовался этим хаком для тегов, но увы уже не работает на версии DLE 14.3.
    0
  11. foto
    Гость 24 июня 2023 05:38 #
    Дико извиняюсь! Я немного не так установил - всё работает на версии 14.3
    0
Добавить комментарий

Внимание! Все сообщения касающиеся техподдержки будут удалены или проигнорированы

Attention! All messages asking for technical support will be removed or ignored

  • Логин
  • E-mail (не обязательно)
Повторите рисунок:
antibot
© Sander-Development. 2009-2024.
При копировании, ссылка на источник обязательна.