Większość systemów internetowych projektowanych obecnie, umożliwia zmianę zawartości strony internetowej za pomocą panelu administratora. Użytkownik systemu może np.: zmieniać kolejność wyświetlania sekcji, kategorii, artykułów. W artykule przedstawiono metodę, która ma za zadanie po naciśnięciu odnośnika graficznego strzałki (rys. 1.), przesunąć wybrany wiersz tabeli o jedną pozycję do góry (rys. 2.). Do prawidłowego działania skryptu wykorzystano tablicę $_GET (Listing 1).
Fragment kodu przedstawiony na listingach korzysta z projektu bazy danych, który został opisany w artykule „Przykładowa baza danych prostego systemu CMS”. Połączenie z bazą danych wykonano za pomocą metody statycznej _getConnection(), przedstawionej w artykule „Dostęp do bazy danych MySQL z języka PHP” (Listing 2).
Rys. 1. Lista sekcji przed uruchomieniem metody upSection
Rys. 2. Lista sekcji po uruchomieniu metody upSection
Mechanizm odpowiedzialny za uruchomienie metody upSection (przesunięcie wiersza w tabeli o jedną pozycję do góry) przedstawiono na listingu 1. Do prawidłowego uruchomienia instrukcji warunkowej if potrzebny jest adres url (rys. 1.). Przykładowy adres strony internetowej zawiera klucz główny z bazy danych wybranego wiersza - zapisany w zmiennej up. Klucze główne z bazy danych przedstawiono w ostatniej kolumnie ID. Po wykonaniu metody upSection tabela na stronie internetowej powinna zostać uaktualniona (rys. 2.).
Listing 1. Fragment pliku section.php
<?php
/**
* W pliku PHP powinien znajdować się skrypt odpowiedzialny za wyświetlenie w tabeli wszystkich sekcji (rys. 1., rys. 2.),
* jak również instrukcja warunkowa if odpowiedzialna za zmianę kolejności wyświetlania wierszy w tabeli.
*/
require_once('class.sectionfactory.php');
...
# Sprawdzamy czy tablica $_GET jest pusta
if (!empty($_GET)) {
// Instrukcja if zostanie wykonana jeśli zmienną up przekazano do skryptu metodą GET
if (isset($_GET['up'])) {
// Wykonanie metody statycznej
SectionFactory::upSection(addslashes($_GET['up']));
}
// Inny kod dla zmiennych GET.
// Przesunięcie wiersza o jedną pozycję w tabeli do dołu.
...
// Skrypt odpowiedzialny za umieszczenie pobranych sekcji
// z bazy danych w tabeli
}
...
?>
Listing 2. Fragment klasy SectionFactory (class.sectionfactory.php)
<?php
/**
* Klasa SectionFactory pracuje na tabeli „sekcje” z bazy danych opisanej
* w artykule „Przykładowa baza danych prostego systemu CMS”
*/
// Klasę DataManager
// opisano w artykule „Dostęp do bazy danych MySQL z języka PHP”
require_once('class.datamanager.php');
class SectionFactory extends DataManager {
...
/**
* Metoda odpowiedzialna za zamianę miejscami sąsiadujących
* ze sobą sekcji - jeden wiersz w górę.
* $sectionID – klucz główny tabeli sekcje
*/
public static function upSection($sectionID) {
// Zapytanie SQL pobierające z bazy danych numer z pola kolejnosc,
// odpowiadający za kolejność wyświetlenia w tabeli.
$sql = "SELECT kolejnosc FROM sekcje WHERE id_sekcja = '$sectionID'";
$result = mysqli_query(DataManager::_getConnection(), $sql);
if (! ($result && mysqli_num_rows($result))) {
return false;
}
$data = mysqli_fetch_assoc($result);
$sort_order1 = $data['kolejnosc'];
// Pobieramy klucz główny (id) największy z mniejszych
// od wybranej "$sort_order1".
$sql = "SELECT id_sekcja, kolejnosc FROM sekcje WHERE kolejnosc < '$sort_order1' ";
$sql .= "ORDER BY kolejnosc DESC LIMIT 1";
$result = mysqli_query(DataManager::_getConnection(), $sql);
if (! ($result && mysqli_num_rows($result))) {
return false;
}
$data1 = mysqli_fetch_assoc($result);
// Przekazujemy do zmiennej klucz główny sekcji
// wybranej w zapytaniu select
$id2 = $data1['id_sekcja'];
// Przekazujemy liczbę całkowitą z pola kolejnosc tabeli sekcje
// wybranej w zapytaniu select
$sort_order2 = $data1['kolejnosc'];
// Przestawiamy wybrane wiersza miejscami.
$sql = "UPDATE sekcje SET kolejnosc = '$sort_order2' WHERE id_sekcja = '$sectionID'";
$result = mysqli_query(DataManager::_getConnection(), $sql);
if (!$result) {
return false;
}
$sql = "UPDATE sekcje SET kolejnosc = '$sort_order1' WHERE id_sekcja = '$id2'";
$result = mysqli_query(DataManager::_getConnection(), $sql);
if (!$result) {
return false;
}
}
...
}
?>
Metoda upSection została dostosowana do tabeli sekcje (Listing 2), jednak po drobnych modyfikacjach możemy również korzystać z tej samej metody w różnych tabelach (Listing 3). Bazę danych z artykułu należałoby w takiej sytuacji zmodyfikować.
Listing 3. Fragment poprawionej metoda upSection
…
/**
* Metoda odpowiedzialna za zamianę miejscami sąsiadujących
* ze sobą wierszy - jeden wiersz w górę.
* $id – klucz główny wybranej tabeli
* $tableName – nazwa tabeli z bazy danych
*/
public static function upSection($id, $tableName) {
// Kod do poprawy
…
}
…
Nazwę metody statycznej należałoby zmienić na bardziej odpowiednią po przystosowaniu metody do wielu tabel (Listing 3).
Dodatkowe zadania:
- Zaprojektuj metodę, która będzie przesuwała wiersz w tabeli do dołu o jedną pozycję
Warto przeczytać również:
Wybrane książki:
- Książki poświęcone językowi PHP
- Książki poświęcone bazie danych MySQL
- Książki poświęcone językowi HTML
- Książki poświęcone kaskadowym arkuszom stylów (CSS)