Haran 9 Опубликовано: 20 октября 2011 Рассказать Опубликовано: 20 октября 2011 (изменено) Скриншот: http://img839.images...69/alltagsa.png http://i31.fastpic.r...a15a2701593.png Описание: По-умолчанию размер шрифта в облаке тэгов выставляется классами .clouds_XX, которых всего 5. При обилии тэгов, пять ступеней изменения размера шрифта для меня было маловато и я решил сделать более плавное изменение размера. Этот хак добавляется посредством надругательства над исходным кодом движка (engine/modules/tagscloud.php). Для ознакомления я покажу, как добавить логарифмическое распределение размера шрифта в тэгах в полном просмотре облака тэгов (т.е. в модуле, а не в блоке). Поэтому находим блок alltags и меняем всё, что находится между ним (для экономии места убраны переносы строк и откорректировано форматирование): if ($do == "alltags") { $tpl->result['content'] = dle_cache("alltagscloud", $config['skin']); if (!$tpl->result['content']) { $tpl->load_template('tagscloud.tpl'); <<... всё, что находится тут, подлежит замене ...>> $tags = implode(", ", $res); if ( $limit ) $tpl->set( $matches[0], $tags); else $tpl->set('{tags}', $tags); $tpl->compile('content'); $tpl->clear(); create_cache ("alltagscloud", $tpl->result['content'], $config['skin']); } } Для плавного изменения размера шрифта используем логарифм и округление: // $fsize - окончательный размер шрифта текущего тэга в пикселях // $amount - сколько раз встретился данный тэг // $base - основание логарифма // $fmin - минимальный размер шрифта в пикселях $fsize = ceil( log( abs( intval( $amount ) ) + 1, $base ) ) + $fmin; Существенных критериев два - минимальный размер шрифта и основание логарифма. Вспоминаем школьный курс математики и то, как выглядит график логарифма и приходим к выводу, что оптимальное значение $base лежит в пределах от 1.3 до 2 включительно. Если поставить меньше 1.3 - наиболее часто встречающиеся тэги будут слишком большими, а если больше 2 - разница между частыми и редкими тэгами будет почти не видна. Для меня оптимальным получился $base равный 1.5 или 1.6. Удобное значение следует подбирать в зависимости от количества тэгов и разницы между наиболее частым и наиболее редким тэгом в выборке. Скачать:Сокращённый вариант: http://pastebin.com/hMYKzKpQ, только блок if ($do == "alltags") {}. Немного съехало форматирование, но это не смертельно.Полный вариант не уверен, что могу выкладывать, чтобы не нарушить лицензию. Отмазки:Блок и модуль точно так же будут кэшироваться, к тому же я рекомендую делать {tags limit=N}, ограничивая выборку тэгов определенным количеством самых употребимых тэгов. При таком подходе и кэшировании, нагрузка на сервер не изменится из-за использования "страшного" логарифма.По-хорошему надо было не использовать функцию рандомной сортировки ассоциативного массива в теле if($do == "alltags"){ }, а выносить ее в functions.php или свой api, но из соображений экономии места в этом посте я поставил функцию в тело. Изменено 20 октября 2011 пользователем Haran Цитата Ссылка на сообщение Поделиться на других сайтах
Рекомендованные сообщения
Присоединяйтесь к обсуждению
Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.