Gwiazdka nieaktywnaGwiazdka nieaktywnaGwiazdka nieaktywnaGwiazdka nieaktywnaGwiazdka nieaktywna
 

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).

 

Lista sekcji przed uruchomieniem metody upSection

Rys. 1. Lista sekcji przed uruchomieniem metody upSection

 

Lista sekcji po uruchomieniu 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:

  1. 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 Helion