Photo Tag

Facebookové fototagovanie - označovanie ľudí, vecí, objektov je pravdepodobne známe všetkým. V tomto článku si ukážeme, ako podobný systém vytvoriť a vysvetlíme si základný princíp fungovania.

Na začiatok je potrebné vytvoriť databázovú tabuľku:

Štruktúra MySQL tabuľky:

CREATE TABLE IF NOT EXISTS `tagged` (
  `id` mediumint(9) NOT NULL auto_increment,
  `photoID` mediumint(9) NOT NULL,
  `tagCounter` mediumint(9) NOT NULL,
  `tagValue` varchar(200) character set utf8 NOT NULL,
  `targetX` smallint(6) NOT NULL,
  `targetY` smallint(6) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Tabuľka obsahuje pre nás dôležité stĺpce:

id - jedinečný identifikátor
tagValue - popis k vytvorenému tagu, resp. jeho názov
targetX - poloha tagu na X súradnici
targetY - poloha tagu na Y súradnici
photoID - identifikátor obrázka - každý obrázok má svoj jedinečný identifikátor.

Vytvorením tabuľky sa naša práca s databázou skončila, ďalej s ňou už nebudeme pracovať.

Na začiatku musíme definovať nasledujúce premenné:

<?php 
// unikátne ID každej fotografie
$photoID = 1;
// najvyšší dočasný counter
$counter    = mysql_fetch_array(mysql_query("SELECT MAX(tagCounter) FROM tagged WHERE photoID = $photoID"));
$tagCounter = (int) $counter[0];
$tagCounter += 1;
?>

Samotný obrázok vkladáme do stránky nasledovne:

<div id="photoID" rel="<?php echo $photoID ?>"></div>
<img src="obrazok.jpg" style="width: 720px; height: 540px;">

Obrázku predchádza div, ktorý ma definované id a parameter rel. Parameter rel je premenná photoID obrázku, ktoré sme definovali na začiatku.

Do samotného tela stránky potrebujeme načítať aj súbor kaskádových štýlov style.css, ktorý vyzerá nasledovne:

#tag-wrapper
{
-webkit-box-shadow: 0px 0px 10px #bbb;
-moz-box-shadow: 0px 0px 10px #bbb;
box-shadow: 0px 0px 10px #bbb;
border: 1px solid #ccc;
position: relative;
display: block;
padding: 10px;
}
#tag-target, #tag-wrapper img {
cursor: crosshair;
}
#tag-wrapper img {
position: absolute;
}
#tag-target
{
-webkit-box-shadow: 0px 0px 20px #000;
-moz-box-shadow: 0px 0px 20px #000;
box-shadow: 0px 0px 20px #000;
border: 4px solid #fff;
position: absolute;
display: none;
height: 100px;
width: 100px;
top: 0px;
left: 0px;
z-index: 2;
}
#tag-input
{
background: #fff;
display: none;
padding: 5px;
position: absolute;
top: 0px;
left: 0px;
width: 137px;
z-index: 2;
}
#tag-input label
{
display: block;
font-weight: bold;
}
#tag-input input
{
border: 1px solid #ccc;
color: #888;
display: block;
margin: 5px 0px;
outline: 0px;
padding: 3px;
width: 124px;
}
.hotspot
{
border-width: 0px;
box-shadow: 0px 0px 0px #000;
-webkit-box-shadow: 0px 0px 0px #000;
-moz-box-shadow: 0px 0px 0px #000;
height: 100px;
width: 100px;
position: absolute;
}
.hotspot:hover, .hotspothover
{
border: 4px solid #fff;
box-shadow: 0px 0px 20px #000;
-webkit-box-shadow: 0px 0px 20px #000;
-moz-box-shadow: 0px 0px 20px #000;
z-index: 1;
}
.hotspot span
{
display: none;
}
.hotspot:hover span, .hotspothover span
{
background: #fff;
display: block;
font-weight: bold;
padding: 3px 0px;
text-align: center;
}
.remove
{
color: #748950;
cursor: pointer;
text-decoration: underline;
}

a súbory JQuerry pre korektné fungovanie aplikácie:

<script src="jquery.min.js" type="text/javascript"></script>

Zobrazovanie tagov, prípadne ich vymazanie zabezpečíme nasledovne:

<?php 
    // možnosť ukážky + zmazanie tagu
    $q = mysql_query("SELECT * FROM tagged WHERE photoID = $photoID");
    if (mysql_num_rows($q))
    {
        while ($r = mysql_fetch_object($q))
        {
            ?>
            <p id="hotspot-item-<? echo $r->tagCounter ?>"><? echo $r->tagValue ?> <span onmouseout="hideTag(<? echo $r->tagCounter ?>)" onmouseover="showTag(<? echo $r->tagCounter ?>)" onclick="removeTag(<? echo $r->tagCounter ?>)" class="remove">(Vymazať)</span></p>
            <?php
        }
    }
?>

Ďalej si vysvetlíme štruktúru súborov zabezpečujúcich ukladanie pozícií tagov, ich zobrazenie, prípadne vymazanie.

Súbor connection.php

Základné pripojenie k databáze:

<?php 
$server = 'localhost';
$user   = 'root';
$pwd    = 'heslo';
$db     = 'databaza';

$link = mysql_connect($server, $user, $pwd);    
$msdb = mysql_select_db($db);
?>

Súbor ajaxAdd.php

Pridanie nového tagu do MySQL databázy

<?php  
require 'connection.php';
    
$photoID    = (int) $_GET["photoID"];
$tagCounter = (int) $_GET["tagCounter"];
$tagValue   =  $_GET["tagValue"];
$targetX    = (int) $_GET["targetX"];
$targetY    = (int) $_GET["targetY"];
    
mysql_query("INSERT INTO tagged SET 
photoID    = '$photoID',
tagCounter = '$tagCounter',
tagValue   = '$tagValue',
targetX    = '$targetX',
targetY    = '$targetY'
");
?>

Súbor del.php

Vymazanie tagu

<?php 
require 'connection.php';
    
$photoID    = (int) $_GET["photoID"];
$tagCounter = (int) $_GET["tagCounter"];
    
mysql_query("DELETE FROM tagged WHERE photoID = $photoID AND tagCounter = $tagCounter"); 
?>

Súbor loadPosition.php

Simulácia a znázornenie tagov

<?php 
require 'connection.php';
    
$photoID = (int) $_GET["photoID"];
$q = mysql_query("SELECT * FROM tagged WHERE photoID = $photoID");
if (mysql_num_rows($q))
    {
        while ($r = mysql_fetch_object($q))
        {
            ?>
                <div style="left: <?= $r->targetX ?>px; top: <?= $r->targetY ?>px;" class="hotspot" id="hotspot-<?= $r->tagCounter ?>"><span><?= $r->tagValue ?></span></div>
            <?php
        }
    }
?>

Ukážka aplikácie Photo Tag. Pri akomkoľvek probléme ma prosím kontaktujte, aplikácia je stále vo vývoji.

Aplikácia Photo Tag bola otestovaná a funguje v prehliadačoch: Opera, Mozilla, MSIE 7, MSIE 8, Google Chrome.

Kompletná ukážka v zip súbore: Stiahnuť Photo Tag

Poďakovanie patrí:

http://www.nealgrosskopf.com/tech/resources/62

http://www.rjwebdesign.net

Pridať komentár k článku