В основному в неті скрізь є приклади виведення хмари тегів. Я б хотів показати як я зберігаю самі теги в базі і як взагалі відбувається робота з тегами.
Як я вже говорив, у нас є таблиця де зберігаються самі теги
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 можна посперечатися:)