[PHP] Jak zrobić system tagów?
System tagów to przydatne rozwiązanie, które pozwala na kategoryzację i indeksowanie treści strony internetowej. Dzięki zastosowaniu systemu tagów, użytkownicy mogą łatwo znaleźć interesujące ich treści oraz przeglądać je według określonych kategorii. W tym artykule omówię, jak stworzyć prosty system tagów w PHP, który będzie skuteczny i łatwy w obsłudze. Na potrzeby tego wpisu załóżmy, że chcemy zrobić tagi do prostej strony z artykułami.
Baza danych
Pierwszym krokiem w tworzeniu systemu tagów jest zaprojektowanie odpowiedniej struktury bazy danych. Baza danych będzie przechowywać informacje o tagach oraz powiązania między tagami a artykułami. Schemat bazy powinien wyglądać np. tak:
Tabela "tags":
- - id (unikalny identyfikator)
- - name (nazwa tagu)
Tabela "articles":
- - id (unikalny identyfikator)
- - title (tytuł artykułu)
- - content (treść artykułu)
Tabela "article_tags":
- - article_id (klucz obcy do tabeli "articles")
- - tag_id (klucz obcy do tabeli "tags")
Utwórz powyższe tabele w bazie, następnie utwórz formularz dodawania artykułów i przejdź do następnej części.
Dodawanie tagów
Zakładam, że masz już formularz, przez który dodajesz artykuł. Trzeba będzie teraz dodać do niego dodatkowe pole tekstowe dla tagów. Następnie trzeba stworzyć kod dodający tagi do artykułu. Należy pamiętać, że musimy mieć ID dodawanego artykułu, więc musi on zostać zapisany w bazie przed tagami. Czyli tak: najpierw kod zapisujący artykuł w bazie, a następnie kod zapisujący tagi dla niego. Mniej więcej jak poniżej:
<?php
// Ta funkcja pobiera ID tagu poprzez jego nazwę
function get_tag_id_by_name($tag) {
global $dbh;
$sth = $dbh->prepare('SELECT id FROM tags WHERE name = :tag LIMIT 1');
$sth->bindParam(':tag', $tag, PDO::PARAM_STR);
if($sth->execute()) {
if($row = $sth->fetch(PDO::FETCH_ASSOC)) {
return $row['id'];
}
else return false;
}
else return false;
}
// Ta funkcja zapisuje nowy tag w bazie
function save_new_tag($tag) {
global $dbh;
$sth = $dbh->prepare('INSERT INTO tags (name) VALUES (:tag)');
$sth->bindParam(':tag', $tag, PDO::PARAM_STR);
return $sth->execute();
}
// Ta funkcja zapisuje relację artykuł - tag
function save_relationship($article_id, $tag_id) {
global $dbh;
$sth = $dbh->prepare('INSERT INTO article_tags (article_id, tag_id) VALUES (:article_id, :tag_id)');
$sth->bindParam(':article_id', $article_id, PDO::PARAM_INT);
$sth->bindParam(':tag_id', $tag_id, PDO::PARAM_INT);
return $sth->execute();
}
// Odbieramy tagi z formularza, czyścimy i zapisujemy nowy tag (jeśli nie istnieje) oraz relacje
$tags_str = trim($_POST['tags']);
$tags_str = htmlentities($tags_str);
$tags = explode(',', $tags_str);
foreach($tags as $tag) {
$tag = trim($tag);
if(!get_tag_id_by_name($tag)) {
save_new_tag($tag);
}
$article_id = 1; // ID artykułu
$tag_id = get_tag_id_by_name($tag);
save_relationship($article_id, $tag_id);
}
W powyższym przykładzie do operacji na bazie danych użyłem rozszerzenia PDO. Jeśli korzystasz z mysqli, zmodyfikuj odpowiednio ten kod. Pamiętaj, że powyższy kod wykonujemy dopiero po dodaniu artykułu, czyli jeśli mamy już jego ID. Najpierw sprawdzamy każdy tag, czy istnieje w bazie. Jeśli istnieje, przypisujemy jego ID do zmiennej $tag_id, w przeciwnym razie wykonujemy funkcję save_new_tag, która doda nowy tag do bazy. Jeśli mamy już ID tagu, możemy zapisać relację article_id = tag_id (funkcja save_relationship).
Wyświetlanie tagów
Aby wyświetlić tagi dla danego artykułu musimy znać jego ID oraz stworzyć funkcję pobierającą tagi z bazy:
<?php
function get_tags_by_id($article_id) {
global $dbh;
$sql = 'SELECT t.id, t.name
FROM tags t
JOIN article_tags r ON t.id = r.tag_id
WHERE r.article_id = :article_id';
$sth = $dbh->prepare($sql);
$stmt->bindParam(':article_id', $article_id, PDO::PARAM_INT);
$sth->execute();
$tags = $sth->fetchAll(PDO::FETCH_ASSOC);
return $tags;
}
// Pobieramy tagi dla danego artykułu
$tags = get_tags_by_id($article_id);
// Wyświetlamy tagi jako linki
foreach($tags as $tag) {
echo '<a href="/tags/'. $tag['name']. '">' . $tag['name'] . '</a>';
}
Kultowy mechanizm tagów :) Fajnie wyjaśnione, troche mam tylko uwag do pehapa ale zakładam, że to dopiero początek przygody. Trzymam kciuki za rozwój no i może sie kiedyś spotkamy na jakims evencie !
OdpowiedzUsuń