Next Generation CMS :: Форум поддержки

Заинтересовала наша система? Тогда этот форум для Вас!

Вы не зашли.

#1 2009-01-07 17:29:32

d7p4x
Модератор
Зарегистрирован: 2008-10-13
Сообщений: 199
Рейтинг :   
Сайт

Облако тегов [php]

Всем привет. Появился вопросик относительно создания обалка тегов на php. Можно ли его как-то реализовать, не выделяя сами теги в отдельную таблицу. Тоесть есть просто таблица с данными, в ней есть столбец "теги" через запятую, и необходимо реализовать нормальное облако тегов.

Понимаю, что это несколько геморней чем просто вынести теги в отдельную таблицу. Но вот надо )

Был бы благодарен прямо куску кода ) Какой-то тупняк напал просто.

Не в сети

#2 2009-01-07 17:59:09

d7p4x
Модератор
Зарегистрирован: 2008-10-13
Сообщений: 199
Рейтинг :   
Сайт

Re: Облако тегов [php]

Сделал отдельный скрипт для подсчета всех доступных тегов в статьях, вынес в отдельную таблицу, все работает.

Тему можно закрыть )

Не в сети

#3 2009-01-07 23:24:25

bestxp
Участник
Откуда Россия
Зарегистрирован: 2008-10-13
Сообщений: 133
Рейтинг :   
Сайт

Re: Облако тегов [php]

можешь поделться если не сложно? smile


senior php and js developer

Не в сети

#4 2009-01-08 00:53:48

d7p4x
Модератор
Зарегистрирован: 2008-10-13
Сообщений: 199
Рейтинг :   
Сайт

Re: Облако тегов [php]

Конечно, только врядли это можно считать образцом для подражания, наверно все можно было сделать намного проще )

Создал файл который будет через некоторое время, или в ручную обновлять таблицу с индексами тегов (это значит, что мне все-таки пришлось создать отдельную таблицу с индексами).

<?php
	// массив хранящий список доступных тегов
	$oldtags = array();
	$i=0;
	// делаем выборку всех воллпейперов
	$sql="select * from papers";
	// делаем запрос
	$res=mysql_query($sql) or die("Query failed : " . mysql_error());
	// проходим в цикле и заносим в массив каждый доступный тег
	while($row=mysql_fetch_array($res,MYSQL_ASSOC)) 
	{
		$onestring=$row['paper_tags'];
		$tags = array();
		foreach (explode(",", $onestring) as $tag) {
			$tag = trim($tag);
			$oldtags[$i]=$tag;
			$i++;
			if (!$tag) continue;
		}
	}
	$oldtags2 = array_unique($oldtags);
	//
	// Добавляем все доступные на данный момент теги в материалах
	// с количеством просмотров 0
	//
	$sql = "TRUNCATE TABLE tagindex";
	mysql_query($sql)or die("Query failed : " . mysql_error());
	for ($j=0;$j<sizeof($oldtags2);$j++)
	{
		if ($oldtags2[$j]!="")
		{
			$sql = "INSERT INTO `tagindex` (`id_tag`, `tag_name`, `tag_count`) VALUES('''','$oldtags2[$j]','0')";
			$res=mysql_query($sql) or die("Query failed : " . mysql_error());
		}
	}
	// теперьн еобходимо заполнить таблицу данными сколько раз встречается тот или иной тег
	// делаем выборку всех данных
	$sql1 = "SELECT * FROM `tagindex`";
	$res=mysql_query($sql1) or die("Query failed : " . mysql_error());
	// в цикле проходим по каждому тегу
	while($r=mysql_fetch_array($res)) 
	{
		$tag=$r['tag_name'];	// название тега
		$sel="SELECT count(*) FROM `papers` WHERE `paper_tags` LIKE '%$tag%'";	// считаем сколько данный тег встречается в статьях
		$result=mysql_query($sel) or die("Query failed : " . mysql_error());			// делаем запрос
		$rows=mysql_fetch_row($result);												// получаем значение	
		$counter=$rows[0];														// количество встреч этого тега в статьях
		// теперь необходимо это количество занести в базу, поэтому просто апдейтим по нашему тегу
		$sql2 = "UPDATE `tagindex` SET `tag_count`='$counter'  WHERE `tag_name` = '$tag' LIMIT 1";
		$result2=mysql_query($sql2) or die("Query failed : " . mysql_error());
		// проапдейтился
	}
?>

ну и сама функция

function tags_cloud(){
	$terms = array();
	$max = 0; // переменная для рассчёта максимального значения
	$sql = "SELECT tag_name, tag_count FROM `tagindex`";
	$query=mysql_query($sql) or die("Query failed : " . mysql_error());
	while ($row = mysql_fetch_array($query))
	{
	    $tag = $row['tag_name'];
	    $counter = $row['tag_count'];
	    if ($counter> $max) $max = $counter; 
	    $terms[] = array('tag' => $tag, 'counter' => $counter);
	}
	$cloud ="<div id='cloud'><div>";
	foreach ($terms as $kol)
	{
	    $per = floor(($kol['counter'] / $max) * 100);
	    if ($per <10)
	    {
	        $class = 'tag1';
	    } elseif ($per>= 10 && $per <30) {
	        $class = 'tag2';
	    } elseif ($per>= 30 && $per <50) {
	        $class = 'tag3';
	    } elseif ($per>= 50 && $per <60) {
	        $class = 'tag4';
		} elseif ($per>= 60 && $per <80) {
	        $class = 'tag5';
	    } elseif ($per>= 80 && $per <90) {
	        $class = 'tag6';
		} else {
			$class='tag7';
			}		

	    $cloud .="<a href='/?tag=" .$kol['tag']. "' title='" . $kol['tag'] . "'  class='$class'>" . $kol['tag'] . "</a> ";
	}
	$cloud .="</div></div>";
	return $cloud;
}

В общем-то вот так.

Не в сети

Подвал раздела

Работает на FluxBB