форум Реклама в интернете

Форум eBanners.Ru: Реклама в интернете и раскрутка сайтов - форум по интернет-рекламе 
Как сделать облако тегов для своего сайта - Веб-дизайн, разработка сайтов и создание баннеров - интернет-реклама
 РегистрацияРегистрация   ВходВход 
У вас есть вопрос по рекламе в интернете и раскрутке сайтов? Задайте его здесь и вам ответят.
Вы уже всё знаете? Помогите тем, кто знает пока не всё. Правила форума| Сделать стартовой|Добавить в избранное.

Реклама SU: продвижение сайта (ОПЛАТА за РЕЗУЛЬТАТ) и контекстная реклама на Яндексе без наценки.

Как сделать облако тегов для своего сайта

 
   Список форумов Реклама в интернете -> Веб-дизайн, разработка сайтов и создание баннеров
Форум Раскрутка сайтов  
Автор Сообщение
Николай ПопковОффлайн
Admin
Зарегистрирован: 16.11.2004
Всего сообщений: 1052
Откуда: Волгоград
Возраст: 50
Пол: Мужской
31 Май 2008 Сб 20:07   Как сделать облако тегов для своего сайта

7 мая, 2008

В этой статье я расскажу и, естественно, покажу пример создания облака тегов для сайта (блога). Основные инструменты – PHP и фреймворк CodeIgniter (подойдет любой другой).

Но, прежде всего, хочу поблагодарить Delchyve за идею.

Итак, переходим к делу.

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

Чтобы сфокусировать внимание посетителя на наиболее актуальных темах, размер шрифта тегов в облаке меняют в зависимости от количества постов, которые к нему относятся.

Если ваш сайт (блог) использует какую-нибудь CMS, например, WordPress, Joomla и т.п., то вы без труда найдете плагины, которые сами создадут облако тегов на основе ваших данных, а вам останется только разместить его в шаблоне сайта.

Но мы рассмотрим ситуацию, когда сайт пишется «с нуля» и вам нужно сформировать облако ручками .

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

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

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

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

Поэтому гораздо удобнее хранить посты и теги в разных таблицах.

Допустим, наша таблица с постами (назовем ее posts) содержит такие поля:

1) id – первичный ключ;
2) title – заголовок;
3) text – текст поста;
4) date – дата;
и др.

А таблица с тегами (tags):

1) id – первичный ключ;
2) tag – имя тега.

Теперь нужно связать таблицы между собой. Т.к. в данном случае мы имеем отношение «многие-ко-многим» (один пост и тот же пост может иметь несколько тегов, а один и тот же тег можно присвоить нескольким постам), то для его реализации нам потребуется еще одна таблица. Она будет называться posts_tags и иметь следующие поля:

1) id – первичный ключ;
2) postid – внешний ключ (связывает запись с таблицей posts);
3) tagid – внешний ключ (связывает запись с таблицей tags).

Каждая запись в таблице posts_tags определяет одну взаимосвязь между таблицами posts и tags.

На рисунке изображены связи между таблицами

http://www.simplecoding.org/wp-content/uploads/2008/05/tag_cloud_db.png


Рассмотрим, как она заполняется.

Допустим в таблицах posts и tags уже есть какие-то данные.

posts

id text title date
1 post 1 title 1 2008-05-01 19:40:08
2 post 2 title 2 2008-05-01 19:40:39
3 post 3 title 3 2008-05-01 19:41:08

tags

id tag
1 php
2 html
3 java
4 ajax
5 JavaScript

Чтобы присвоить тег html второму посту (post 2), то в таблице posts_tags нужно создать запись:

postid = 2
tagid = 2

Хотим к этому же посту добавить еще тег JavaScript? Не проблема. Добавляем в posts_tags еще одну запись:

postid = 2
tagid = 5

Таким образом, используя эту таблицу, мы может создать любое количество взаимосвязей между постами и тегами.

Теперь переходим к реализации.

Как я и обещал, в качестве фреймворка мы будем использовать CodeIgniter. Но это совершенно не обязательно. Вы сможете легко переписать пример, используя только стандартные функции PHP.

Начнем с контроллера (main.php).

Code (php)
Код:
class Main extends Controller {
    function Main() {
        parent::Controller();
        $this->load->database();
    }
    function index() {
        $this->load->model(‘tagcloudmodel’);
        $pageData[‘tagcloud’] = $this->tagcloudmodel->getTagCloudData();
 
        $this->load->view(‘header’);
        $this->load->view(‘tagcloud’, $pageData);
        $this->load->view(‘footer’);
    }
}

Как видите, он имеет всего один метод – index(), который будет создавать страницу с облаком.

В конструкторе мы загрузили библиотеку для работы с базой данных (строка 4), а в начале метода index() – модель tagcloudmodel (о ней чуть позже).

После этого мы вызываем метод getTagCloudData() модели, который возвращает нам массив со всей информацией, необходимой для построения облака. И затем показываем страницу (строки 10-13).

Отдельно хочу отметить, что для отображения облака нам нужны.

1) Перечень всех тегов. Не проблема, просто читаем содержимое таблицы tags.

2) Количество постов, которым присвоен каждый тег. Тут чуть сложнее. Нужно посчитать сколько раз встречаются одинаковые цифры в поле tagsid (таблица posts_tags).

Теперь рассмотрим модель (tagcloudmodel.php)

Code (php)
Код:
class TagCloudModel extends Model {
    function TagCloudModel() {
        parent::Model();
    }
 
    function getTagCloudData() {
        $qGetCloud = "SELECT tags.tag, COUNT(posts_tags.tagid) AS posts_count".
                    " FROM posts_tags LEFT JOIN tags ON posts_tags.tagid=tags.id".
                    " GROUP BY tags.id";
        $res = $this->db->query($qGetCloud);
        if ($res->num_rows() == 0) {
            return false;
        }
        else {
            return $res->result_array();
        }
    }
}

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

Т.к. запрос выполняет основную часть работы, рассмотрим его подробнее. Условно запрос можно разбить на три части.

1) После предложения SELECT мы указываем, какие данные хотим получить (строка 7). Это имя тега и количество постов, которым он присвоен. (Для подсчета постов используем агрегатную функцию COUNT).

2) Указываем, из каких таблиц брать данные. Здесь мы используем «левое объединение» таблицы posts_tags с таблицей tags, а в условии объединения указываем, что posts_tags.tagid должен быть равен tags.id. Таким образом, MySQL для каждой записи в таблице posts_tags найдет соответствующую запись в таблице tags и подставит соответствующее имя тега.

3) Группируем поля по первичному ключу тега (строка 9). После этой операции в результирующем массиве теги повторяться не будут, а функция COUNT подсчитает, сколько раз встретился каждый тег.

Примечание. Этот запрос вернет только те теги, которые присвоены хотя бы одному посту (т.е. существует запись в таблице posts_tags). Если по каким-то причинам вам нужно вывести все теги (включая те, для которых нет постов), измените порядок объединения таблиц в запросе: .....FROM tags LEFT JOIN posts_tags ON........

Данные мы получили, переходим к созданию представлений.

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

В заголовке и хвостовике ничего особенного нет, поэтому я только приведу их код.

header.php

Code (html4strict)
Код:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Облако тегов</title>
</head>
<body>
footer.php


Code (html4strict)
Код:
</body>
</html>

А вот на основной части (tagcloud.php) остановимся подробнее.

Code (php)
Код:
if ($tagcloud === FALSE) {
    echo "Данные не найдены";
}
else {
    $min = $tagcloud[0][‘posts_count’];
    $max = $tagcloud[0][‘posts_count’];
    for ($i = 1; $i < count($tagcloud); $i++) {
        if ($tagcloud[$i][‘posts_count’] > $max) {
            $max = $tagcloud[$i][‘posts_count’];
        }
        if ($tagcloud[$i][‘posts_count’] < $min) {
            $min = $tagcloud[$i][‘posts_count’];
        }
    }
    $minSize = 70;
    $maxSize = 150;
    foreach ($tagcloud as $item) {
        if ($min == $max) {
            $fontSize = round(($maxSize - $minSize) / 2 + $minSize);
        }
        else {
            $fontSize = round((($item[‘posts_count’] - $min)/($max - $min)) * ($maxSize - $minSize) + $minSize);
        }
        echo "<span style=\"font-size:".$fontSize."%\">".$item[‘tag’]." (".$item[‘posts_count’].") </span>";
    }
}


Здесь мы проверяем, найдены ли данные (строки 1-3) и если найдены, начинаем формировать облако.

Прежде всего, находим теги, которые присвоены минимальному и максимальному количеству постов (строки 5-14).

После этого задаем минимальный и максимальный размер шрифта (в данном случае я задал 70% и 150%).

Теперь формируем цикл, который будет выводить теги (строки 17-26). Внутри цикла мы рассчитываем размер шрифта текущего тега (строки 18-23). Тег, для которого найдено минимальное число постов, будет иметь размер 70%, а тег с максимальным числом постов – 150%. Для остальных тегов будут рассчитаны промежуточные значения в зависимости от количества постов.


Естественно, для реального блога, каждый тег будет представлять собой ссылку, которая ведет на соответствующую страницу. Но это отдельная тема.



Автор Стаценко Владимир
http://www.simplecoding.org/kak-sozdat-oblako-tegov-dlya-svoego-sajta.html
Вернуться к началу
View user's profile Посетить сайт автора 
Артем КожекинОффлайн
Зарегистрирован: 14.06.2009
Всего сообщений: 5
Откуда: Кемерово
Пол: Мужской
27 Июн 2009 Сб 12:05   Как сделать облако тегов для своего сайта

при создании сайта используются разные движки. и не всегда пригоден этот способ. я нашел флэшку для облака тегов. там отлично все в 3д крутится. теги берутся из xml файла
Вернуться к началу
View user's profile Посетить сайт автора 
Сергей КуприОффлайн
Зарегистрирован: 30.06.2015
Всего сообщений: 5
Откуда: Великий Новгород
Возраст: 27
Пол: Мужской
30 Июн 2015 Вт 00:15   Как сделать облако тегов для своего сайта

на wordpress проще ставлю простейший виджет и 0 проблем)
Вернуться к началу
View user's profile Посетить сайт автора 
Показать сообщения:   
Форум Маркетинг и реклама
Бесплатный обмен ссылками
Лучшие партнерские программы
Партнерка по играм и бесплатные игры
Партнерская программа по знакомствам
Сайт знакомств и чат знакомств
Общение: форум и чат волчат
Куплю рекламу на вашем сайте
Программа раскрутки 1ps и Помощь в заполнении форм

Полезные сервисы: Мой ip адрес / My IP Address как узнать свой IP.
Бесплатная виртуальная клавиатура онлайн - русский, английский и другие языки.
Tранслит и перевод транслита.

агентство знакомств
ремонт фотоаппаратов

форум по интернет-рекламе