Знову хмара тегів. Тільки тепер не висновок - а введення!

В основному в неті скрізь є приклади виведення хмари тегів. Я б хотів показати як я зберігаю самі теги в базі і як взагалі відбувається робота з тегами.


Як я вже говорив, у нас є таблиця де зберігаються самі теги

CREATE TABLE `users_tags` (

`id` int(11) unsigned NOT NULL auto_increment,

`text` varchar(255) character set utf8 NOT NULL,

PRIMARY KEY (`id`),

UNIQUE KEY `txt` (`text`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;

Тамбліц зв'язку тегів

CREATE TABLE `users_fun_photos_tags_data` (

`photo_id` int(11) unsigned NOT NULL,

`tag_id` int(11) unsigned default NULL,

KEY `tag_id` (`tag_id`),

KEY `photo_id` (`photo_id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;

І таблиця де зберігаються записи про фотографії

CREATE TABLE `users_fun_photos` (

`id` int(11) unsigned NOT NULL auto_increment,

`title` varchar(255) default NULL,

'tags'varchar (255) default NULL ,/* Тут теги зберігаються у вигляді рядка виду тег1, тег2, тег3 */

`cat_id` int(11) unsigned NOT NULL default '1',

`file` varchar(30) default NULL,

`dir` varchar(3) default NULL,

`user_id` int(11) unsigned default '1',

`date` datetime NOT NULL default '0000-00-00 00:00:00',

`date_last_comment` datetime default NULL,

`comments` int(11) unsigned NOT NULL default '0',

`views` int(11) NOT NULL default '0',

`points` int(11) default '0',

PRIMARY KEY (`id`),

KEY `views` (`views`),

KEY `user_id` (`user_id`),

KEY `comments` (`comments`),

KEY `cat_id` (`cat_id`),

KEY `title` (`title`),

KEY `tags` (`tags`),

KEY `date` (`date`),

KEY `date_last_comment` (`date_last_comment`),

KEY `points` (`points`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;

Зверніть увагу на COLLATE = utf8 _ general _ ci - це означає, що порівняння для текстових полів буде регістронезалежним.

Тепер сам код. Йдете туди де у вас завантажується картинка на сервер.

/ * Отримуємо те, що юзер ввів у поле < input type = «text» value = «php, mysql, html, css» name = «tags» > */

$photo_tags = $cms->ValidatePostVar('tags');

/ * Далі (у мене) йде код додавання інформації в базу про завантажену картинку - тут нас цікавить тільки поле tags в яке теги додаються рядком як їх ввів юзер (перевірку на дозволені символи і т. д. це вже самі зробите */

sql_query(«INSERT INTO „.$prefix.“_users_fun_photos (id, title, tags, cat_id, file, user_id, date, comments, views) VALUES (NULL, '».$photo_title.""', '".$photo_tags.""', 1, '".$obj->GetNewFileName().""', '".$cms->user_id.""', NOW(), 0, 0)", $dbi);

/ * Отримуємо ІД записи про завантажену картинку */

$generated_id = mysql_insert_id();

/ * І викликаємо функцію обробки введених юзером тегів, з потрібними параметрами */

$fun->TagsDataInsert($photo_tags, $generated_id);

А ось сама магічна функція:

function TagsDataInsert($photo_tags, $photo_id)

{

global $prefix, $dbi, $section_folder, $cms;

/ * Вилучаємо старий зв'язок тегів до зображення - використовується у мене при редагуванні даних про картинку, тобто для обробки збереження змін у тегах для редагованої картинки використовується також ця функція */

sql_query(«DELETE FROM „.$prefix.“_users_fun_photos_tags_data WHERE photo_id='».$photo_id.""'", $dbi);

# Якщо користувач ввів теги - їдемо далі

if ($photo_tags)

{

/ * Створюємо масив введених тегів */

$tags_array = explode(',', $photo_tags);

/ * Вилучаємо пробіли */

array_walk($tags_array, array($this, 'trim_value'));

/ * Проходимо масивом, і вносимо теги в таблицю тегів - у разі якщо такий тег вже існує - просто оновлюємо текстове поле */

foreach ($tags_array as $value)

{

sql_query(«INSERT INTO „.$prefix.“_users_tags (id, text) VALUES (NULL, '».adsl($value).""') ON DUPLICATE KEY UPDATE text='".adsl($value).""'", $dbi);

/ * Функція mysql_insert_id хороша тим, що вона повертає id не тільки новоствореного ключа, але й обнаваного */

$generated_tag_id = mysql_insert_id();

/ * Пишемо дані до таблиці зв "язків */

sql_query(«INSERT INTO „.$prefix.“_users_fun_photos_tags_data (photo_id, tag_id) VALUES ('».$photo_id.""','".$generated_tag_id.""')", $dbi);

}

}

}

Додайте теги з поля

<input type=«text» value=«php,mysql,html,css» name=«tags»>

У підсумку в таблиці user_tags будуть у нас самі теги і їх id

У таблиці зв'язку users_fun_photos_tags_data будуть дані

Ну і в таблиці users_fun_photos в полі tags теги у нас у вигляді рядка php, mysql, html, css

Ну а тепер про те чому в таблиці users_fun_photos в полі tags ми зберігаємо дані у вигляді рядка -

php,mysql,html,css

1 - Хтось скаже що це не правильно - і певною мірою буде правий, але - мені просто легше виводити потім теги при показі картинки ось так, без заморочки з об'єднанням таблиць:

if (!empty($photo_tags)) $photo_tags = explode(',', $photo_tags);

$smarty->assign('photo_tags', $photo_tags);

<div class=«tags» style=«color:#777777;»>Теги → {foreach from=$photo_tags item=item}<a title=""{$item}" href=«index.php?section=Fun&file=search&tag={$item}»>{$item}</a>, {/foreach}</div>

2. Як видно з пункту 1 - пошук записів з тегом буде здійснюватися не за tag_id а за текстом теґу. Для чого? Просто в скрипті пошуку картинок за тегами є можливість шукати не тільки по tag_id коли ми натискаємо на тег в хмарі тегів - але і по тексту тега коли юзер вводить шуканий тег в поле input

/ * Тут ми просто беремо дані а том був введений id теґу або просто текст */

$tag = urldecode($cms->ValidateGetVar('tag'));

$get_tag_id = (int)$cms->ValidateGetVar('tag_id');

/ * Тут перевірка на те що було введено - і в кінцевому підсумку отримуємо id тега якщо введено id а не текст, і навпаки */

if ($tag && !$get_tag_id)

{

$res = sql_query(«SELECT id FROM „.$prefix.“_users_tags where text='».adsl($tag).""'", $dbi);

list($get_tag_id) = sql_fetch_row($res);

}

else if (!$tag && $get_tag_id)

{

$res = sql_query(«SELECT text FROM „.$prefix.“_users_tags where id='».$get_tag_id.""'", $dbi);

list($tag) = sql_fetch_row($res);

}

/ * У кінцевому підсумку все одно виведення картинки з шуканим тегом буде проводитися за tag_id */

$res = sql_query(«SELECT SQL_CALC_FOUND_ROWS a.user_id, a.user_nick, b.id, b.title, b.tags, b.cat_id, b.file, b.dir, DATE_FORMAT(b.date, '%d.%m.%Y? %H:%i:%s'), b.comments, b.views, b.points FROM „.$prefix.“_users a, „.$prefix.“_users_fun_photos b, „.$prefix.“_users_fun_photos_tags_data c where b.id=c.photo_id and a.user_id=b.user_id and c.tag_id='».$get_tag_id.""' order by b.id DESC limit ".$offset."", ".$on_page.""", $dbi);

Загалом щодо пункту 2 і зберігання даних у вигляді рядка в полі tags можна посперечатися:)

logo