Kategoria bezdomnych php. Budowa drzewa kategorii w PHP

I tak na początek opiszę, z czym będziemy pracować i czego będziemy potrzebować.
System: PHP 5 i nowsze, mySQL 4 i nowsze
Klasy pomocnicze: dbsql.class.php (klasa do pracy z bazą danych)
Klasa zagnieżdżonych kategorii: classTreeCategory.php (bezpośrednio klasa główna, poniżej znajduje się jej lista i objaśnienia.

Tworzymy tabelę w bazie danych o następującej strukturze:

Zobacz kod MYSQL

Tabela ta zawiera pole ID - numer seryjny kategorii, podcat - ma wartość zero dla kategorii pierwszego rzędu lub identyfikator kategorii nadrzędnej, nazwa - nazwa kategorii.

Przykład działania klasy, wyświetlającej kategorie na liście z podkategoriami:

Zobacz kod PHP

include("dbsql.class.php" ); include("classTreeCategory.php" ); $DB = nowy silnik DB_Engine("mysql" , $settings [ "dbHost"] , $settings [ "dbUser"] , $settings [ "dbPass"] , $settings [ "dbName"] ) ; // połącz się z bazą danych, wskazując dane dostępowe $category = new TreeCategory ($DB ) ; // przejście do klasy kategorii, obiektu do pracy z bazą danych $category -> table = "category" ; // nazwa tabeli w bazie danych zawierającej kategorie $array = $category -> getCategory() ; // pobierz wszystkie kategorie z bazy danych w postaci wielopoziomowej tablicy, posortowane i zagnieżdżone w takiej kolejności, w jakiej potrzebujemy $category -> outCategory ($array, "option" ); // przygotowanie wyniku kategorii (tworząc HTML), przekazanie tablicy z kategoriami echo $category -> html ; //wypisz kategorie jako nazwę HTML

Jak widać na powyższym przykładzie wszystko jest niezwykle proste, tworzymy nowy obiekt $category, ustalamy z jaką tabelą bazy danych będziemy pracować: 'kategoria', następnie pobieramy z tabeli listę wszystkich kategorii już sformatowanych jako tablicy i ułożone w sposób hierarchiczny, z uwzględnieniem wszystkich podkategorii. następnie przekazujemy tablicę do metody outCategory(), która generuje dla nas gotowy kod HTML, który wystarczy nam wyświetlić w przeglądarce.

Jak widzimy, metoda outCategory() przyjmuje dwa parametry @array i @string, w pierwszym parametrze tablicę ze wszystkimi kategoriami, a w drugim wiersz zawierający opcję lub wartość tabeli, wartość ta wskazuje, jaki typ kodu HTML jest potrzebny zostać wygenerowane.
Wartość opcji

Zobacz kod HTML

-kategoria 1 --podkategoria 1 ---podkategoria 1 -kategoria 2

Aby wstawić ten kod HTML do pola wyboru dowolnego formularza.

Wartość tabeli generuje następujący kod HTML:

Zobacz kod HTML

Ten kod HTML można wygodnie wstawić do tabeli wyświetlającej wszystkie nasze kategorie i podkategorie.

Klasa posiada również następujące metody:
usuńItem($id); — usuwa jedną kategorię, pomimo zagnieżdżonych
delCategory($tablica, $id); — usuwa kategorię ze wszystkimi zagnieżdżonymi podkategoriami, $array — tablica ze wszystkimi kategoriami przygotowana metodą $category->getCategory(), $id — numer kategorii do usunięcia
Dodaj Przedmiot(); — tę metodę należy wywołać, jeśli chcemy dodać kategorię i ta metoda odczytuje wartości z danych przesyłanych metodą POST, tj. z tablicy $_POST.
$name=$this->PHP_slashes(strip_tags($_POST[‚nazwa’])); // Nazwa Kategorii
$podcat=intval($_POST['podcat']); // Identyfikator kategorii nadrzędnej. Jeśli podano 0, kategoria będzie znajdować się w katalogu głównym.
aktualizacjaPozycji() ; — podobnie jak poprzednia metoda, z tą różnicą, że metoda ta aktualizuje kategorię, jej nazwę i poziom zagnieżdżenia.

tabela="kategoria"; // żądanie wybrania listy kategorii, nazwa tabeli * $category->outCategory($category->getCategory()); // przygotowanie wyniku kategorii (odpytywanie tablicy kategorii) * echo $category->html; // wyświetlenie kategorii w nazwie HTML * */ /** * Zrzuć tabelę, z którą pracujemy * * USUŃ TABELĘ JEŚLI ISTNIEJE `kategoria`; * UTWÓRZ TABELĘ `kategoria` (* `id` int(11) NIE NULL auto_inkrementacja, * `podcat` int(11) NIE NULL, * `name` varchar(255) NIE NULL, * KLUCZ PODSTAWOWY (`id`), * KLUCZ `id` (`id`) *) ENGINE=MyISAM DOMYŚLNY ZESTAW ZNAKÓW=utf8; * */ class TreeCategory ( /** * Ciąg zapytania w bazie danych */ var $table; /** * Interfejs do pracy z bazą danych */ var $DB; /** * Tablica kategorii z zagnieżdżonymi podkategoriami */ var $arrayCat; / ** * Automatyczne zliczanie liczby myślników przed nazwą kategorii podczas wyprowadzania */ var $countPodcat; /** * Kod HTML do wyświetlania kategorii z podkategoriami */ var $html; /** * Otrzymujemy interfejs do pracy z bazą danych i umieść ją w zmiennej lokalnej */ funkcja __construct($DB) ( $this->DB=$DB; $this->component=$_GET["component"]; ) /** * Pobiera listę kategorii, sortuje je i umieszcza w tablicy z zagnieżdżonymi tablicami itp. * @return tablica kategoria */ funkcja getCategory () ( $all = $this->DB->getAll("WYBIERZ * Z `( $this->table)` ORDER BY `id` ASC"); $ścieżka = array(); if(count($all)>0) ( foreach($all as $item): if($item["podcat "]==0)$sort[$item[ "id"]]=$item; if($item["podcat"]>0) ( if(isset($path[$item["podcat"]]) ) ( $str="$sort"; foreach( $path[$item["podcat"]] jako $pitem): $rep=$item["podcat"]; $str.="[$pitem]"; koniec; $str.="[($item["podcat"])]"; $str.="[($item["id"])]"; $str.="=$przedmiot;"; ewaluacja($str); foreach($ścieżka[$item["podcat"]] jako $pitem): $ścieżka[$item["id"]]=$pitem; koniec; $ścieżka[$item["id"]]=$item["podcat"]; ) else ( $sort[$item["podcat"]]["sub"][$item["id"]]=$item; $path[$item["id"]]=$item["podcat" ]; ) ) koniec; ) $this->arrayCat=$sort; zwróć $this->arrayCat; ) /** * Drukuje kategorie, umieszcza gotowy kod HTML w $this->html * @param array Tablica z kategoriami i zagnieżdżonymi podkategoriami * @param string Typ wygenerowanego kodu HTML dla wyniku, opcji lub tabeli */ funkcja outCategory(&$ arrayCat, $type="option", $idSel=0) ( foreach($arrayCat as $sub) ( $this->countPodcat++; $this->outItem($sub, $type); if(!empty($sub [" sub"]))$this->outCategory($sub["sub"], $type, $idSel); $this->countPodcat--; ) ) /** * Pomocnicza metoda przygotowania kodu HTML * @param array Tablica z kategorią * @param string Typ wygenerowanego kodu HTML dla wyjścia, opcji lub tabeli */ funkcja outItem($sub, $type="option", $idSel=0) ( for($i=0;$ icountPodcat;$i++) ( $out. ="-"; ) if($idSel==$sub["id"])$se="wybrane"; w przeciwnym razie $se=""; if($type=="opcja")$this->html.=" ($out) ($sub["name"]) "; if($type=="table")$this->html.= ($out) ($sub["name"]) HTML; ) funkcja delCategory(&$a_tree,&$id=0) ( foreach($a_tree as $sub) ( if($sub["id"]$id i isset($sub["sub"]))$this- >delCategory($sub["sub"],$id); if($sub["id"]==$id) ( $sql="USUŃ Z ($this->table) WHERE id = "$id" LIMIT 1"; $this->DB->execute($sql); if (isset($sub["sub"])) $this->delCategory_process($sub["sub"]); ) ) ) funkcja delCategory_process (&$a_tree) ( foreach($a_tree as $sub) ( $sql="USUŃ Z ($this->table) WHERE id = "($sub["id"])" LIMIT 1"; $this-> DB->execute($sql); if(isset($sub["sub"]))$this->delCategory_process($sub["sub"]); ) ) funkcja updateItem() ( $name=$this- >PHP_slashes(strip_tags($_POST["nazwa"])); $podcat=intval($_POST["podcat"]); $id=intval($_POST["id"]); $sql="AKTUALIZACJA `( $this->table)` SET `name` = "($name)", `podcat` = "($podcat)" WHERE `id`="($id)" LIMIT 1; "; $this->DB ->execute($sql); ) funkcja addItem() ( $name=$this->PHP_slashes(strip_tags($_POST["nazwa"])); $podcat=intval($_POST["podcat"]); $ id=intval($_POST["id"]); $sql="WSTAW DO `($this->table)` (`id`,`podcat`,`name`) WARTOŚCI ("", "$podcat" , "$nazwa");"; $this->DB->execute($sql); ) funkcja usuwaniaItem($id) ( $id=intval($id); $sql="USUŃ Z `($this->table)` WHERE `id` = "($id)" LIMIT 1"; $DB- >execute($sql); header("Lokalizacja: ?komponent=($ten->komponent)"); ) funkcja PHP_slashes($string,$type="add") ( if ($type == "add") ( if (get_magic_quotes_gpc()) (zwróć $string; ) else ( if (function_exists("addslashes")) (zwróć dodatkowe ukośniki($string); ) else (zwróć mysql_real_escape_string($string); ) ) ) else if ($typ == "strip") ( return stripslashes($string); ) else ( die("błąd w PHP_slashes (mieszane, dodaj | strip)"); ) ) )

Całość została napisana w ciągu godziny i oczywiście ma pewne niedociągnięcia, ale tę da się naprawić. Jego użycie jest wskazane w celach edukacyjnych, choć kończąc go trochę, możesz zintegrować go z dowolnym systemem i cieszyć się jego pracą)).

Byłbym wdzięczny, gdybyście w komentarzach zaproponowali własne rozwiązania tego problemu - uporządkowanie kategorii o nieskończonym poziomie zagnieżdżenia.

Widok drzewa podkategorii kategorii zapewnia przyjazny dla użytkownika sposób wyświetlania kategorii nadrzędnych i podrzędnych. Kategorię i jej podkategorię można łatwo oddzielić za pomocą struktury drzewiastej. Zawsze zaleca się widok drzewa kategorii, aby wyświetlić nieskończony poziom kategorii i podkategorii.

W tym samouczku pokażemy, jak utworzyć dynamiczne drzewo podkategorii kategorii przy użyciu PHP i MySQL. Rekurencyjne drzewo kategorii jest bardzo przydatne do wyświetlania kategorii n poziomów na liście rozwijanej. Przykładowy kod pomaga zbudować listę rozwijaną podkategorii kategorii na poziomie n w PHP. Dane kategorii dynamicznych zostaną pobrane z bazy danych MySQL i wyświetlone w formacie drzewa kategorii nadrzędny-podrzędny.

Utwórz tabelę bazy danych

Aby zapisać kategorie i podkategorie należy w bazie danych utworzyć tabelę. Poniższy kod SQL tworzy tabelę kategorii w bazie danych MySQL.

UTWÓRZ TABELĘ `kategorie` (`id` int (11 ) NIE NULL AUTO_INCREMENT, `parent_id` int (11 ) NIE NULL DOMYŚLNIE "0" , `name` varchar (100 ) COLLATE utf8_unicode_ci NOT NULL , `utworzono` datetime NIE NULL , `modified` datetime NOT NULL , `status` enum("1" "0" ) COLLATE utf8_unicode_ci NOT NULL DOMYŚLNY "1" KOMENTARZ "1:Aktywny, 0:Nieaktywny" , KLUCZ PODSTAWOWY (`id`)) SILNIK= InnoDB DOMYŚLNY ZESTAW ZNAKÓW= utf8 COLLATE= utf8_unicode_ci;

Kolumna parent_id określa, czy kategoria jest nadrzędna czy podrzędna. Jeśli parent_id wynosi 0, będzie to kategoria nadrzędna. W przeciwnym razie będzie to kategoria podrzędna, a identyfikator będzie elementem nadrzędnym tej kategorii.

Konfiguracja bazy danych (dbConfig.php)

Do połączenia i wyboru bazy danych służy plik dbConfig.php. Określ hosta bazy danych ($dbHost), nazwę użytkownika ($dbUsername), hasło ($dbPassword) i nazwę ($dbName) zgodnie z poświadczeniami MySQL.

Funkcja rekurencyjna PHP do generowania drzewa nadrzędnego/podrzędnego

Funkcja CategoryTree() generuje drzewo podkategorii n-poziomowej kategorii przy użyciu języka PHP. Spowoduje to utworzenie rozwijanych opcji drzewa kategorii.

  • $parent_id – opcjonalne. Określ identyfikator nadrzędny, aby uzyskać kategorie podrzędne tej kategorii nadrzędnej.
  • $sub_mark – Opcjonalne. Zaznacz, który zostanie dodany na początku nazwy kategorii podrzędnej.