Перейти к публикации

Плавное логарифмическое изменение размера шрифта в облаке тэгов


Рекомендованные сообщения

Скриншот:

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, но из соображений экономии места в этом посте я поставил функцию в тело.

Изменено пользователем Haran
Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

×
×
  • Создать...