Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
tree: 0d62cc26ba
Fetching contributors…

Cannot retrieve contributors at this time

190 lines (152 sloc) 5.177 kb
<?php
/**
* Tags
*
* @package Propeller
*/
class Tags extends Entity {
# Какие случаются ошибки
private $errorMsg = array(
1001 => 'Переданы недопустимые значения',
1002 => 'Тег не найден'
);
protected $maxTagLength = 50;
/**
* Конструктор
*/
function __construct() {
parent::__construct('tags');
}
/**
* Создать тег
*
* @param string $tagName
* @return array
*/
function createTag($tagName) {
return $this->add(array('name'=>$tagName));
}
/**
* Получить тег по имени
*
* @param string $tagName
* @return array
*/
function getTag($tagName) {
return $this->getOne(array('name'=>$tagName));
}
/**
* Преобразовать некоторые символы тега для верной работы с коллацией
*
* @param string $tagName
* @return string
*/
function collate($tagName) {
return strtolower(preg_replace('/ё/iu', 'е', $tagName));
}
/**
* Устранение дубликатов из списка тегов
*
* @param array $tagsList исходный массив
*/
function normalize($tagsList) {
if(!is_array($tagsList)) {
throw new Exception($this->errorMsg[1001], 1001);
}
$checkHash = array();
$result = array();
# Ищем повторяющиеся теги
foreach($tagsList as $tag) {
$lTag = strtolower($tag);
if(!empty($checkHash[$lTag])) {
continue;
} elseif(strlen($tag) <= $this->maxTagLength) {
$checkHash[$lTag] = 1;
$result[] = $tag;
}
}
return $result;
}
/**
* Вернуть существующий тег если он есть, если нет вернуть вновь созданный
*/
function checkTagCreate($tagName) {
$tag = $this->getTag($tagName);
if(!$tag) $tag = $this->createTag($tagName);
return $tag;
}
/**
* Обновление счётчика у тего
*
* @param array $ids список идентификаторов обновляемых тегов
* @param int $increment изменение счётчика
*/
function updateCount($ids, $increment) {
if(!is_array($ids) || !count($ids)) throw new Exception($this->errorMsg[1001], 1000);
$idString = join(',', $ids);
Box::$db->query('UPDATE ' . $this->tableName . ' SET count = count + ' . $increment . ', active=IF(count=0,0,1) WHERE id IN (' . $idString . ')');
# Запуск "сборщика мусора" с вероятностью 2%
if(rand(0, 50) == 1) {
$this->deleteAll(array('count'=>0));
}
}
/**
* Получение глобального облака тегов
*
*/
function getCloud($maxItems = 50, $extra = null) {
if(empty($extra['showAll'])) $conditions = array('active'=>1, 'hidden'=>0); else $conditions = array('active'=>1);
$tagsList = $this->getList('*', $conditions, 'count DESC', $maxItems);
$this->fetchAll($tagsList);
return $tagsList;
}
/**
* Принимает список тегов и делает из него всё, что нужно для построения облака
*
* @param unknown_type $tagsList
*/
function makeCloud($tagsList) {
$result = array();
# Сортировка тегов по имени
if(count($tagsList)) usort($tagsList, array($this, "sortName"));
# Перебираем теги, чтобы узнать максимальное количество
$maxCount = 1;
foreach($tagsList as $tag) {
if(!empty($tag['count']) && $tag['count'] > $maxCount) $maxCount = $tag['count'];
}
# Собирает теги на выход
foreach($tagsList as $tag) {
$count = !empty($tag['count']) ? $tag['count'] : 1;
#$weight = log(round($count / $maxCount * 10));
$weight = round(log($count / $maxCount + 1) * 10);
$size = $weight / 3 + 1;
$countString = Box::countCase($tag['count'], 'записей', 'записи', 'запись');
if(strstr($tag['name'], ',') && substr($tag['name'], 0, 1) != '«' && substr($tag['name'], -1, 1) != '»') $tag['name'] = '«' . $tag['name'] . '»';
if(preg_match('/[:?]/i', $tag['name'])) $url = urlencode($tag['name']); else $url = $tag['name'];
$item = array('name'=>$tag['name'], 'url'=>$url, 'weight'=>$weight, 'size'=>$size, 'count'=>$tag['count'], 'countString'=>($tag['count'] . ' ' . $countString));
if(isset($tag['id'])) $item['id'] = $tag['id'];
if(isset($tag['hidden'])) $item['hidden'] = $tag['hidden'];
$result[] = $item;
}
return $result;
}
/**
* Сортировка массива постов по полю time_published
*/
function sortName($a, $b) {
return strcmp(strtolower($a['name']), strtolower($b['name']));
}
/**
* Скрыть/показать тег
*
* @param int $id идентификатор тега
*/
function showHide($id) {
$tag = $this->get($id);
if(!$tag) throw new Exception($this->errorMsg[1002], 1002);
$newStatus = $tag['hidden'] ^ 1;
$this->set(array('id'=>$id, 'hidden'=>$newStatus));
return $newStatus;
}
}
?>
Jump to Line
Something went wrong with that request. Please try again.