Šodien es jums pastāstīšu, kā MySQL izveidot hierarhisku koku.

Šādi koki tiek izmantoti, veidojot dinamiskas vietnes kategorijas, piemēram, tiešsaistes veikalā vai parādot komentārus pie ziņas.

Kopumā tās tiek būvētas visur, kur iespējams. Galvenais ir pareizi uzbūvēt un pielietot.

Vissvarīgākais, veidojot hierarhisku koku, ir pareiza datu bāzes struktūra! Piemēram, apsveriet datu bāzes struktūru, kurā tiek glabātas vietņu kategorijas. Vienkāršam piemēram tabulā būs 3 lauki:

  • id - kategorijas atslēga
  • parent_id — vecākkategorijas ID
  • nosaukums – sadaļas nosaukums
  • Izveidosim tabulu, palaižot SQL vaicājumu programmā PHPMyAdmin:

    IZVEIDOT TABULU "kategorijas" ("id" INT NOT NULL AUTO_INCREMENT , "parent_id" INT NOT NULL , "name" VARCHAR(50) NOT NULL , PRIMARY KEY ("id"));

    Tagad mums ir jāaizpilda sava tabula ar ierakstiem. Rezultātā jums vajadzētu iegūt šādu tabulu:

    Testa tabulu var aizpildīt ar šādu vaicājumu:

    INSERT INTO `categories' (`id`, `parent_id`, `name) VĒRTĪBAS (1, 0, "1. sadaļa"), (2, 0, "2. sadaļa"), (3, 0, "3. sadaļa" ), (4, 1, "1.1. sadaļa"), (5, 1, "1.2. sadaļa"), (6, 4, "1.1.1. sadaļa"), (7, 2, "2.1. sadaļa"), (8 , 2, "2.2. sadaļa"), (9, 3, "3.1. sadaļa");

    Un tagad uzmanību! Tālāk, loģiski, jums ir jāveic atlase no datu bāzes cilpā, lai atlasītu katru kategoriju un tās apakškategoriju. BET! Tas ir labi, ja datu bāzē ir vairākas kategorijas, kas arī principā nav pareizi. Ko darīt, ja vietne ir tiešsaistes veikals un tajā ir simts kategoriju un tikpat daudz apakškategoriju? Tad nepatikšanas! Nezināms datubāzes vaicājumu skaits izraisīs vietnes palēnināšanos vai pilnīgu mysql servera avāriju.

    Varat izmantot tikai vienu datu bāzes vaicājumu, lai atlasītu visas kategorijas un to apakškategorijas.

    Noformēsim pieprasījumu un izveidosim ērtu masīvu turpmākajam darbam.

    //Atlasīt datus no datu bāzes $result=mysql_query("SELECT * FROM kategorijas"); //Ja datu bāzē ir ieraksti, veidojam masīvu if (mysql_num_rows($result) > 0)( $cats = array(); //Cilpā veidojam sadaļu masīvu, atslēga būs id no vecākkategorijas, kā arī sadaļu masīva, atslēga būs kategorijas id while($cat = mysql_fetch_assoc($result))( $cats_ID[$cat["id"]] = $cat; $cats[$ kaķis["vecāku_id"]][$kaķis["id"]] = $kaķis; ) )

    Mēs atlasām visus datus no kategoriju tabulas un veidojam asociatīvu masīvu $cats , atslēga būs vecāku kategoriju id.

    Tagad mēs uzcelsim koku. Lai izveidotu, mēs izmantosim rekursīvu funkciju.

    Hierarhiskajam kokam būs šāda struktūra:

    • 1. sadaļa
      • 1.1. sadaļa
        • 1.1.1
      • Sadaļa 1.2
    • 2. sadaļa
      • 1.1. sadaļa
      • Sadaļa 1.2
    • 3. sadaļa
      • 3.1. sadaļa

    Izveidosim rekursīvu funkciju build_tree(). Tas veidos mūsu hierarhisko koku absolūti jebkurai ligzdai.

    Funkcija build_tree($cats,$parent_id,$only_parent = false)( if(is_array($cats) and isset($cats[$parent_id]))( $tree = "

      Ja ][$only_parent]; $tree .= "
    • ".$cat["vārds"]." #".$cat["id"]; $tree .= build_tree($cats,$cat["id"]); $tree .= "
    • "; ) $koks .= "
    "; ) else return null; atgriež $koku;)

    Funkcija aizņem sadaļu masīvu un sadaļas ID. Ciklā mēs ejam cauri apakškategorijām un, ja tām ir vairāk sadaļu, tad funkcija tiek palaista vēlreiz ar jauniem parametriem (jauns sadaļu masīvs un veidojamās sadaļas id). Tā veidojas jebkuras ligzdas koks!

    Lai izveidotu koku, mēs ierakstām kodā:

    Echo build_tree($cats,0);

    Tātad divos soļos mēs izveidojām vietņu sadaļu hierarhisku koku, un nav nozīmes tam, cik sadaļu ir!

    UPD Ja jums ir nepieciešams kategoriju koks apgrieztā secībā, zinot kategorijas ID, tad jums ir jāizmanto funkcija:

    Funkcija find_parent ($tmp, $cur_id)( if($tmp[$cur_id]["parent_id"]!=0)( return find_parent($tmp,$tmp[$cur_id]["parent_id"]); ) return ( int)$tmp[$cur_id]["id"];)

    Šī funkcija ņem virkni kategoriju, kuru atslēga ir kategorijas ID un tās kategorijas ID, no kuras jums jādodas uz augšu.

    Lai izveidotu šādu koku, palaidiet funkciju build_tree ar šādiem parametriem:

    Echo build_tree($cats,0,find_parent($cats_ID,YOUR_CATEGORY_ID));

    Vai jums ir jautājumi? Jautājiet komentāros

    2016. gada 28. maijs

    Izstrādājot tīmekļa lietojumprogrammas, mēs bieži sastopamies ar nepieciešamību attēlot datus koka formā. Veidojot vienu un to pašu interneta veikalu, lineāra preču kategoriju struktūra ir piemērota tikai maziem projektiem. Visbiežāk jūs vēlaties, lai kategorijas varētu ligzdot viena otrai. Citos gadījumos, piemēram, veidojot failu pārvaldnieku, bez kategorijām iztikt ir vēl grūtāk.
    Šajā rakstā es jums pastāstīšu, kā jūs varat viegli izveidot skaistu datu koku savā vietnē, sākot no tabulas izveides mysql un beidzot ar koka parādīšanu pārlūkprogrammā. Mēs izmantosim jstree bibliotēku uz klienta, un mēs paši rakstīsim vienkāršu servera kodu.

    Ko mēs darīsim un ko mēs rezultātā iegūsim?

    Kā piemēru ņemsim vērā vairākkārt pieminēto interneta veikalu un izveidosim tam preču kategoriju koku. Tradicionāli tirgosimies ar datortehniku. Vispirms izveidosim mysql kategoriju tabulu, pēc tam uzzīmēsim kataloga lapas marķējumu, uzrakstīsim js kodu un, visbeidzot, php skriptu, kas nonāk datu bāzē un nosūta kategorijas klientam vajadzīgajā formātā. Un uzreiz saite uz

    Izveidojiet kategoriju tabulu

    Lai izveidotu patvaļīgi sazarotu kategoriju struktūru, mums ir nepieciešama tikai viena tabula. Sauksim to par kategorijām un izveidosim tajā 4 laukus: id, category, parent_id un number. id būs primārā atslēga un automātiskais palielinājums, kategorija ir kategorijas nosaukums, mātes_id ir vecākkategorijas ID, numurs ir kategorijas sērijas numurs vecākajā.

    Ļaujiet man paskaidrot: piemēram, mums ir 3 produktu kategorijas, no kurām galvenā ir klēpjdatori, un tajā ir vēl 2 — Acer un Lenovo. Tabulā tas izskatīsies šādi:
    id, kategorija, vecāku_id, numurs
    1, klēpjdatori, 0, 1
    2, Acer, 1, 1
    3, Lenovo, 1, 2
    Vienosimies, ka saknes kategorijām būs parent_id = 0. Skaitļa lauks ir nepieciešams, lai sakārtotu kategoriju attēlošanu vēlamajā secībā, mēs negarantējam, ka Acer vienmēr būs pirmajā vietā, tāpēc jums ir jāspēj mainīt displeja secība. Katrai apakškategorijai ir sava numerācija, sākot no 1.

    Lai labāk redzētu, kā tiek veidota hierarhija, izveidojiet tabulu programmā mysql un aizpildiet to ar testa datiem. Zemāk ir sql kods abiem. Kā parasti, datubāzi sauksim par webdevkin.

    Kategoriju tabulas struktūra izmantot webdevkin; izveidot tabulas kategorijas (id int(10) unsigned not null auto_increment, kategorija varchar(255) not null, parent_id int(10) unsigned not null, numurs int(11) unsigned nav null, primārā atslēga (id)) motors = innodb auto_increment = 18 avg_row_length = 963 rakstzīmju kopa utf8 salīdzina utf8_general_ci; Testa dati izmanto webdevkin; IESTATĪT NOSAUKUMU "utf8"; INSERT INTO kategorijas(`id`, `kategorija`, `parent_id`, `skaitlis) VĒRTĪBAS (1, "Klēpjdatori", 0, 1), (2, "Acer", 1, 1), (3, "Lenovo" ", 1, 2), (4, "Apple", 1, 3), (5, "Macbook Air", 4, 1), (6, "Macbook Pro", 4, 2), (7, "Sony" Vaio", 1, 4), (8, "Viedtālruņi", 0, 2), (9, "iPhone", 8, 1), (10, "Samsung", 8, 2), (11, "LG" , 8, 3), (12, "Vertu", 8, 4), (13, "Komponentes", 0, 3), (14, "Procesori", 13, 1), (15, "Atmiņa", 13 , 2), (16, "Video kartes", 13, 3), (17, "Cietie diski", 13, 4);

    Tagad varat apskatīt kategoriju tabulu parastajā phpMyAdmin-e vai dbForgeStudio un turpināt izveidot mūsu mini lietojumprogrammu.

    Projekta struktūra

    Projekta saknē mums būs index.html un 4 vienkāršas mapes: img, css, js un php. Attēlā ir viens attēls loading.gif. Tas tiks rādīts vietnes apmeklētājiem, kamēr kategoriju koks tiks ielādēts no servera. CSS mapē ir fails main.css ar mūsu lapas stiliem un mape jstree, kurā ir jstree bibliotēkas stili un attēli.

    Veco laiku labad mēs sadalīsim js mapi piegādātājā un moduļos. Pirmajā mapē būs jquery un jstree bibliotēkas. Precizēšu - jquery ir vajadzīgs ne tikai mums, bet arī kā jstree atkarība. Moduļu mapē vienīgais fails ir main.js — lietojumprogrammas galvenais js skripts. Mēs nosūtīsim index.php uz php mapi, kas veiks visu servera darbu.

    Šoreiz ērtāk ir vispirms runāt par lietas servera pusi un pēc tam pāriet uz klienta pusi. Tāpēc apskatīsim, kā iegūt datus no kategoriju tabulas vajadzīgajā formātā - failā php/index.php

    Servera kods - index.php

    Kas mums jādara?

    • 1. Izveidojiet savienojumu ar datu bāzi
    • 2. Izvelciet kategoriju sarakstu
    • 3. Nosūtiet informāciju pārlūkprogrammai

    Saraksts ir vienkāršs, un ar ieviešanu nevajadzētu rasties problēmām. Faila sākumā mēs deklarēsim nepieciešamās konstantes, lai izveidotu savienojumu ar datu bāzi.

    // Deklarēt nepieciešamās konstantes define("DB_HOST", "localhost"); define("DB_LIETOTĀJS", "lietotājs"); define("DB_PASSWORD", "parole"); define("DB_NAME", "webdevkin");

    Pēc tam mēs rakstām funkciju, lai izveidotu savienojumu ar datu bāzi, izmantojot mysqli.

    // Izveidojiet savienojumu ar datu bāzes funkciju connectDB() ( $errorMessage = "Nevar izveidot savienojumu ar datu bāzes serveri"; $conn = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); if (!$conn) mest jaunu izņēmumu($ errorMessage ); else ( $query = $conn->query("iestatīt nosaukumus utf8"); if (!$query) mest jaunu izņēmumu($errorMessage); pretējā gadījumā atgriež $conn; ) )

    Tālāk mums ir jāizvelk kategoriju saraksts no tabulas. Šeit mums ir nedaudz jāpanāk priekšā. Jstree bibliotēka pieņem json kā ievadi. Pieņemamie formāti ir aprakstīti bibliotēkas vietnē jstree.com. Paņemsim sev ērtāko un uzreiz nosūtīsim sagatavotos datus no servera. Šis formāts izskatās šādi:

    [ ( "id" : "ajson1", "parent" : "#", "text" : "Vienkāršs saknes mezgls" ), ( "id" : "ajson2", "parent" : "#", "text" : "Saknes mezgls 2" ), ( "id" : "ajson3", "parent" : "ajson2", "text" : "Child 1" ), ( "id" : "ajson4", "parent" : "ajson2" , "teksts" : "2. bērns" ), ]

    Piemērs ir ņemts no dokumentācijas, taču ērtības labad mēs vienkārši izmantosim id no mūsu datu bāzes kā id — skaitli bez ajson prefiksa. Pāriesim pie kategoriju iegūšanas no datu bāzes tabulas funkcijas

    // Kategoriju izgūšana no datu bāzes funkcijas getCategories($db) ( $query = " SELECT id AS `id`, IF (parent_id = 0, "#", parent_id) AS `parent`, kategorija kā `teksts` NO kategorijām ORDER BY `parent`, `number` "; $dati = $db->query($query); $categories = masīvs(); while ($row = $data->fetch_assoc()) ( array_push($categories, masīvs ( "id" => $rinda["id"], "parent" => $rinda["vecāks"], "teksts" => $rinda["teksts"])); ) atgriež $kategorijas; )

    Šeit mēs izpildām parastu atlases vaicājumu kategoriju tabulā, izvelkam 3 obligātos laukus un tajā pašā laikā nedaudz pārveidojam tos vajadzīgajā formātā. Mēs nododam id bez izmaiņām, atgriežam vecāku_id kā vecāku, un saknes kategorijām atgriežam #. Un kategorijas lauks tiks nodots kā teksts. Dati ir saņemti, atliek vien tos ievietot masīvā, kuru konvertēsim uz json un nosūtīsim uz pārlūkprogrammu. Tas ir redzams galvenajā skripta pavedienā

    Mēģiniet ( // Izveidot savienojumu ar datu bāzi $conn = connectDB(); // Iegūt datus no masīva GET $action = $_GET["action"]; slēdzis ($action) ( case "get_categories": $result = getCategories( $ conn); break; noklusējuma: $result = "nezināma darbība"; break; ) // Atgriezt veiksmīgu atbildi klientam echo json_encode(array("code" => "veiksmi", "rezultāts" => $rezults) ); ) catch (Izņēmums $e) ( // Atgriezt kļūdas atbildi klientam echo json_encode(array("code" => "error", "message" => $e->getMessage())); )

    Kam jums jāpievērš uzmanība. Mūsu konkrētajā gadījumā parametra get nodošana darbībai šķiet nevajadzīga, taču tas ir tik ilgi, kamēr fails index.php kalpo tikai vienam uzdevumam - atgriezt kategoriju sarakstu. Drīzumā tiks publicēts raksts par koka funkcionalitātes attīstību, jo īpaši par vilkšanas un nomešanas ieviešanu klientā un atbilstošo datu atjaunināšanu serverī. Tajā mēs redzēsim, ka parametra get nodošana kā nepieciešamās darbības norāde ir diezgan ērta tēma.

    Un par atbildi klientam. Koda lauks vienmēr norāda pieprasījuma statusu - veiksmīgs vai kļūda. Ja tas ir veiksmīgs, kategoriju masīvs tiek atgriezts rezultātu laukā; ja rodas problēmas, ziņojuma laukā tiek nosūtīts kļūdas ziņojums.

    Tas ir viss ar mūsu lietojumprogrammas servera daļu, pāriesim pie klienta.

    Mūsu kataloga lapas marķējums ir index.html

    Ja esat jau apskatījis lietojumprogrammas demonstrāciju, redzēsit, ka iezīmēšana ir ārkārtīgi vienkārša. Ir 2 galvenie konteineri: kreisajā pusē - kategoriju kokam, labajā pusē - vietturis produktu sarakstam. Galvas sadaļā būs šāds kods:

    Webdevkin. Kategoriju koks javascript, php un mysql

    Produktu saraksts

    Un pievienojiet dažus marķējumus vietnei main.css

    Pamatteksts ( fontu saime: Ubuntu; fonta izmērs: 16 pikseļi; fonta svars: 400; ) .container ( pozīcija: relatīvā; platums: 960 pikseļi; mala: 0 auto; ) .column ( displejs: inline-block; vertikālā līdzināšana : top; ) .categories ( platums: 30%; )

    Mēs esam pabeiguši ar html/css, un tagad pāriesim pie interesantākās daļas - javasctipt koda koka izveidei. Šeit mēs apkoposim visu paredzēto funkcionalitāti.

    main.js — lietojumprogrammas inicializācija

    Ja esat lasījis iepriekšējos rakstus, piemēram, par groza izveidi tiešsaistes veikalam priekšpusē vai par iegultiem logrīkiem, izmantojot vietējo javascript, tad varat atcerēties, ka mana js koda shēma ir aptuveni vienāda visiem gadījumiem.

    Pielietosim to arī šeit: izveidosim js moduli, pamatojoties uz slēgšanu, saglabājiet nepieciešamos dom elementus kešatmiņā, uzrakstiet vairākas privātās metodes un vienu publisko - lietojumprogrammas inicializācijas metodi.

    Moduļu ietvars "izmantot stingru"; // Lietojumprogrammas modulis var app = (function($) ( // Inicializējiet nepieciešamos mainīgos var ajaxUrl = "/php", ui = ( $categories: $("#categories"), $goods: $("#preces" ) ); // Kategoriju koka inicializācija, izmantojot jstree funkciju _initTree(data) ( // ... ) // Kategoriju ielāde no servera funkcijas _loadData() ( // ... ) // Lietojumprogrammas funkcijas init() inicializācija ( _loadData( ); ) // Eksportēt ārpus atgriešanās ( init: init ) ))(jQuery); jQuery(dokuments).ready(app.init);

    Kā redzams pēdējā rindā, pēc dokumenta ielādes mēs izsaucam metodi app.init(), kas savukārt ielādē datus no servera un nodod koka izveides metodei. Vietnē ajaxUrl mēs rakstām sava servera skripta adresi; UI objekta kešatmiņā tiks saglabāti divi dom elementi.

    Datu saņemšana no servera — metode _loadData() // Notiek kategoriju ielāde no servera funkcijas _loadData() ( var params = ( darbība: "get_categories" ); $.ajax(( url: ajaxUrl, metode: "GET", dati: params, dataType: "json", panākumi: function(resp) ( // Inicializēt kategoriju koku if (resp.code === "success") ( _initTree(resp.result); ) else ( console.error("Kļūda datu saņemšana no servera: ", resp.message); ) ), kļūda: function(error) ( console.error("Kļūda: ", kļūda); ) )); )

    Šeit mēs rakstām visbiežāk sastopamo Ajax pieprasījumu servera skriptam, saņemam datus ar kategorijām un, ja tas izdodas, nododam tos koka inicializācijas funkcijai _initTree(). Mēs atceramies, ka mēs saņemam datus no servera json formātā, tāpēc mēs nekavējoties norādīsim dataType: "json". Un nepieciešamā informācija nonāks rezultātu laukā, tāpēc mēs nododam tieši resp.result uz _initTree. Jūs varat rīkoties ar kļūdām jebkurā veidā, piemēram, mēs tās vienkārši ievietosim konsolē.

    Koka izveide funkcijā _initTree, izmantojot jstree // Kategoriju koka inicializācija, izmantojot funkciju jstree _initTree(data) ( ui.$categories.jstree(( core: ( check_callback: true, multiple: false, data: data ), spraudņi): [" dnd"] )).bind("changed.jstree", function(e, data) ( var category = data.node.text; ui.$goods.html("Produkti no kategorijas " + kategorija); konsole. log("mezgla dati: ", dati); )); )

    Un tas ir viss, kas jums nepieciešams! Vizuāli vissarežģītākā lietojumprogrammas daļa izskatās satriecoši vienkārša. Jums vienkārši jāpielieto jstree metode ar dažiem parametriem konkrētam dom elementam. Mūsu gadījumā mēs nododam pašus datus datu laukā, multiple: false norāda, ka mums nav nepieciešama vairākkārtēja atlase, un check_callback: true norāda, ka pēc koka maiņas vēlamies darīt kaut ko citu.

    Spraudņu laukā mēs uzskaitām vēlamās maizītes masīvā. Koncentrēsimies uz dnd - drag-and-drop - pievienojiet iespēju mainīt koka struktūru ar peli. Šī ir ļoti ērta lieta, bet vēl nefunkcionāla. Ar koku pārlūkprogrammā var spēlēties, cik vien tīk, bet pēc lapas atsvaidzināšanas mēs redzēsim veco direktoriju struktūru. Tas ir loģiski, jo dati tiek ņemti no servera, un mēs neesam uzrakstījuši kodu, lai atjauninātu mysql klienta notikumos. Tam būs veltīts viens no šiem rakstiem, taču pagaidām mēs spēlēsim, pārvietojot kategorijas pārlūkprogrammā ar peli.

    Un visbeidzot, izmantojot saistīšanas metodi, mēs saistām izmaiņu notikumu kokā ar kādu noderīgu darbību. Mūsu piemērā mēs vienkārši parādīsim uzrakstu ar kategorijas nosaukumu, bet reālā lietojumprogrammā būtu vērts izvilkt produktu sarakstu no servera. No kurienes radās kategorija = data.node.text? Atveriet pārlūkprogrammas konsoli un skatiet, kādi citi dati par atlasīto mezglu mums ir pieejami.

    Kopā

    Šajā rakstā mēs neveidojām pilnvērtīgu katalogu tiešsaistes veikala vadīšanai - tā nebija ideja. Es gribēju koncentrēties uz to, kā no sākuma līdz beigām izveidot tik noderīgu struktūru kā koku pēc iespējas vienkāršāk. Daži punkti tika apzināti izlaisti, proti, ciešāks darbs ar pašu koku un klienta darbību sinhronizācija ar serveri, kā arī produktu saraksta veidošana, noklikšķinot uz kategorijas. Par pirmo variantu publicēšu atsevišķu rakstu.

    ATJAUNINĀTS: Esmu ievietojis rakstu, kurā parādīts, kā pārvietot atsevišķus koka elementus ar peli, izmantojot vilkšanas un nomešanas metodi, un sinhronizēt šos datus ar serveri. Nedaudz koda klienta un servera - un voila! Saite atrodas tieši zem numura 4.

    Un tā, sākumā es aprakstīšu, ar ko mēs strādāsim un kas mums būs vajadzīgs.
    Sistēma: PHP 5 un jaunāka versija, mySQL 4 un jaunāka versija
    Papildu klases: dbsql.class.php (klase darbam ar datu bāzi)
    Ligzdoto kategoriju klase: classTreeCategory.php (tieši galvenā klase, zemāk ir tās saraksts un paskaidrojumi.

    Mēs izveidojam tabulu datu bāzē ar šādu struktūru:

    Skatīt kodu MYSQL

    Šajā tabulā ir ID lauks - kategorijas sērijas numurs, podcat - ir nulle pirmās kārtas kategorijām vai galvenās kategorijas ID, nosaukums - kategorijas nosaukums.

    Klases darbības piemērs, kategoriju parādīšana sarakstā ar apakškategorijām:

    Skatīt kodu PHP

    include ("dbsql.class.php" ); include ("classTreeCategory.php" ) ; $DB = new DB_Engine("mysql" , $settings [ "dbHost" ], $settings [ "dbUser" ], $settings [ "dbPass" ] , $settings [ "dbName" ] ) ; // pieslēgties datu bāzei, norādot piekļuves datus $category = new TreeCategory ($DB ) ; // pāriet uz kategorijas klasi, objektu darbam ar datu bāzi $category -> table = "category" ; // tabulas nosaukums datu bāzē ar kategorijām $masīvs = $category -> getCategory () ; // iegūt visas kategorijas no datu bāzes daudzlīmeņu masīva veidā, sakārtotas un ligzdotas tādā secībā, kāda mums vajadzīga $category -> outCategory ($masīvs, "opcija" ) ; // kategoriju izvades sagatavošana (HTML formēšana), masīva nodošana ar kategorijām echo $category -> html ; // izvada kategorijas kā HTML nosaukumu

    Kā redzams no iepriekš minētā piemēra, viss ir ārkārtīgi vienkārši, mēs izveidojam jaunu $category objektu, iestatām, ar kuru datu bāzes tabulu strādājam: 'category', tad no tabulas iegūstam visu kategoriju sarakstu, kas jau ir formatētas kā masīvs un sakārtots hierarhiskā secībā, ņemot vērā visas apakškategorijas. tad masīvu nododam outCategory() metodei, kas mums ģenerē gatavu HTML kodu, kas mums tikai jāparāda pārlūkprogrammā.

    Metode outCategory(), kā mēs redzam, pirmajā parametrā ņem divus parametrus @masīvs un @string masīvu ar visām kategorijām, bet otrajā - rindu, kurā ir opcijas vai tabulas vērtība, šī vērtība norāda, kāda veida HTML kods ir nepieciešams. jāģenerē.
    opcijas vērtība

    Skatīt kodu HTML

    -1.kategorija -1.apakškategorija ---1.apakškategorija -2.kategorija

    Lai ievietotu šo HTML kodu jebkuras formas atlases laukā.

    Tabulas vērtība ģenerē šādu HTML kodu:

    Skatīt kodu HTML

    Šo HTML kodu var ērti ievietot tabulā, kurā ir redzamas visas mūsu kategorijas un apakškategorijas.

    Klasei ir arī šādas metodes:
    dzēst vienumu($id); — dzēš vienu kategoriju, neskatoties uz ligzdotajām
    delCategory($masīvs, $id); — dzēš kategoriju ar visām ligzdotajām apakškategorijām, $masīvs — masīvs ar visām kategorijām, kas sagatavots ar $category->getCategory() metodi, $id — dzēšamās kategorijas numurs
    addItem(); — šī metode ir jāizsauc, ja vēlaties pievienot kategoriju, un šī metode nolasa vērtības no datiem, kas pārsūtīti ar POST metodi, t.i. no $_POST masīva.
    $nosaukums=$this->PHP_slashes(sloksnes_tags($_POST['nosaukums'])); // kategorijas nosaukums
    $podcat=intval($_POST['podcat']); // Vecākās kategorijas ID, ja ir norādīts 0, kategorija būs saknē.
    updateItem() ; — līdzīga iepriekšējai metodei, izņemot to, ka šī metode atjaunina kategoriju, tās nosaukumu un ligzdošanas līmeni.

    tabula = "kategorija"; // pieprasījums atlasīt kategoriju sarakstu, tabulas nosaukums * $category->outCategory($category->getCategory()); // kategoriju izvades sagatavošana (kategoriju masīva vaicāšana) * echo $category->html; // izvada kategorijas HTML nosaukumā * */ /** * Izmest tabulu, ar kuru mēs strādājam * * DROP TABLE IF EXISTS `category`; * CREATE TABLE `category` (* `id` int(11) NOT NULL auto_increment, * `podcat` int(11) NOT NULL, * `name` varchar(255) NOT NULL, * PRIMARY KEY (`id`), * KEY `id` (`id`) *) ENGINE=MyISAM DEFAULT CHARSET=utf8; * */ class TreeCategory ( /** * Vaicājuma virkne datu bāzē */ var $table; /** * Interfeiss darbam ar datubāzi */ var $DB; /** * Kategoriju masīvs ar ligzdotām apakškategorijām */ var $arrayCat; / ** * Automātiski saskaita defisu skaitu pirms kategorijas nosaukuma, izvadot */ var $countPodcat; /** * HTML kods kategoriju izvadīšanai ar apakškategorijām */ var $html; /** * Mēs iegūstam interfeiss darbam ar datu bāzi un ievietot to lokālajā mainīgajā */ function __construct($DB) ( $this->DB=$DB; $this->component=$_GET["komponents"]; ) /** * Iegūst kategoriju sarakstu, sakārto tās un ievieto masīvā ar ligzdotiem masīviem utt. * @return masīva kategorija */ funkcija getCategory () ( $all = $this->DB->getAll("SELECT * FROM `( $this->table)` ORDER BY `id` ASC"); $path = masīvs(); if(count($all)>0) ( foreach($all kā $item): if($item["podcat "]==0)$kārtot[$item[ "id"]]=$prece; if($item["podcat"]>0) ( if(isset($path[$item["podcat"]]) ) ( $str="$kārtot"; foreach( $path[$item["podcat"]] kā $pitem): $rep=$item["podcat"]; $str.="[$pitem]"; endforeach; $str.="[($item["podcat"])]"; $str.="[($item["id"])]"; $str.="=$prece;"; eval($str); foreach($path[$item["podcat"]] kā $pitem): $path[$item["id"]]=$pitem; endforeach; $ceļš[$item["id"]]=$item["podcat"]; ) else ( $sort[$item["podcat"]]["sub"][$item["id"]]=$item; $path[$item["id"]]=$item["podcat" ]; ) ) endforeach; ) $this->arrayCat=$kārtot; return $this->arrayCat; ) /** * Drukā kategorijas, ievieto gatavo HTML mapē $this->html * @param masīvs Masīvs ar kategorijām un ligzdotām apakškategorijām * @param virkne Ģenerētā HTML koda veids izvadei, opcijai vai tabulai */ funkcija outCategory(&$ arrayCat, $type="option", $idSel=0) ( foreach($arrayCat kā $sub) ( $this->countPodcat++; $this->outItem($sub, $type); if(!empty($sub) [" sub"]))$this->outCategory($sub["sub"], $type, $idSel); $this->countPodcat--; ) ) /** * HTML koda sagatavošanas palīgmetode * @param masīvs Masīvs ar kategoriju * ​​@param virkne Izvades, opcijas vai tabulas ģenerētā HTML koda veids */ funkcija outItem($sub, $type="option", $idSel=0) ( for($i=0;$ icountPodcat;$i++) ($out. ="-"; ) if($idSel==$sub["id"])$se="atlasīts"; else $se=""; if($type=="opcija")$this->html.=" ($out) ($sub["nosaukums"]) "; if($type=="table")$this->html.= ($out) ($sub["name"]) HTML; ) funkcija delCategory(&$a_tree,&$id=0) ( foreach($a_tree kā $sub) ( if($sub["id"]$id and isset($sub["sub"]))$this- >delCategory($sub["sub"],$id); if($sub["id"]==$id) ( $sql="DELETE FROM ($this->table) WHERE id = "$id" LIMIT 1"; $this->DB->execute($sql); if (isset($sub["sub"])) $this->delCategory_process($sub["sub"]); ) ) ) funkcija delCategory_process (&$a_tree) ( foreach($a_tree kā $sub) ( $sql="DELETE FROM ($this->table) WHERE id = "($sub["id"])" LIMIT 1"; $this-> DB->execute($sql); if(isset($sub["sub"]))$this->delCategory_process($sub["sub"]); ) ) funkcija updateItem() ( $name=$this- >PHP_slashes(joslas_tags($_POST["nosaukums"])); $podcat=intval($_POST["podcat"]); $id=intval($_POST["id"]); $sql="ATJAUNINĀJUMS `( $this->table)` SET `name` = "($nosaukums)", `podcat` = "($podcat)" WHERE `id`="($id)" LIMIT 1; "; $this->DB ->izpildīt($sql); ) funkcija addItem() ($nosaukums=$this->PHP_slashes(strip_tags($_POST["nosaukums"])); $podcat=intval($_POST["podcat"]); $ id=intval($_POST["id"]); $sql="INSERT INTO `($this->table)` (`id`,`podcat`,`name`) VĒRTĪBAS ("", "$podcat" , "$nosaukums");"; $this->DB->izpildīt($sql); ) funkcija deleteItem($id) ( $id=intval($id); $sql="DELETE FROM `($this->table)` WHERE `id` = "($id)" LIMIT 1"; $DB- >execute($sql); header("Atrašanās vieta: ?component=($this->component)"); ) funkcija PHP_slashes($string,$type="add") (if ($type == "add") ( if (get_magic_quotes_gpc()) ( return $string; ) else ( if (function_exists("addslashes")) (atgriež addslashes($string); ) else (atgriež mysql_real_escape_string($string); ) ) ) else if ($type == "sloksne") (atgriež svītras svītras($string); ) else ( die("kļūda PHP_svītras (jaukts,pievienot | sloksne)"); ) )

    Visa klase tika uzrakstīta stundas laikā, un, protams, ir daži trūkumi, bet tas viss ir labojams. To ieteicams izmantot izglītības nolūkos, lai gan, to nedaudz pabeidzot, jūs varat to integrēt jebkurā sistēmā un baudīt tās darbu)).

    Būšu pateicīgs, ja komentāros ieteiksiet savus risinājumus šai problēmai - bezgala līmeņa ligzdošanas kategoriju organizēšanu.

    Nākamais uzdevums ir izveidot bezgalīgas ligzdošanas kategorijas, izmantojot PHP. Sērfojot vairākas vietnes, atradu daudzus risinājumus, taču ne visi manai izpratnei ir pieejami, jo... Programmēšanas līmenis tur ir augstāks nekā manējais. Tāpēc atradu vienkāršāko, varbūt ne elegantāko, bet strādājošo risinājumu.

    Vispirms redzēsim, kas man ir datu bāzē

    • id - mūsu kategorijas identifikators
    • kategorija — kategorijas nosaukums
    • category_id — vecākkategorijas identifikators. To varētu saukt par vecāku_id, bet tas man ir pazīstamāks
    • lvl — kategorijas ligzdošanas līmenis. Nepieciešams, lai izveidotu...
    • Viss, kas tiek piesegts, tev neder, jo... Tur ir informācija, kas ir nepieciešama man personīgi, un, lai jūs nemaldinātu, esmu izdzēsis šo nevajadzīgo informāciju.
    Tiek rādītas kategorijas

    Šeit nav daudz ko teikt, ja ir jautājumi, rakstiet komentāros, un tiem, kam ir vienalga, kas šeit rakstīts, iesaku nekavējoties apskatīt rezultātu

    Ja nesaprotat, tad mums datu bāzē ir nepieciešams tikai lauks lvl, lai zinātu, cik “-” jāliek pirms kategoriju nosaukumiem. Protams, ir arī sarežģītāka metode bez lvl, bet šobrīd tas ir vienīgais risinājums, kas man ir. Tiklīdz lietas mainīsies, es atjaunināšu rakstu.

    Tiek rādītas kategorijas
    • Bet šeit ir vēl viens risinājums jums, ja jums tas ir jāparāda nevis formā, bet gan sarakstā.

      Šeit mums vairs nevajag lvl, tāpēc ir mazāk koda. Un zemāk ir rezultāts

      Tas ir izveidots, pievienojot modelim vecāku tipa lauku "vecāks", kurā tiek saglabāts pašreizējā ieraksta vecāka ID. Saknes ierakstiem šī lauka vērtība ir "-1".

      Uzmanību! Modelī var būt tikai viens "parent" tipa lauks.

      Piemērs vienkāršai koka izmantošanai, veidojot apakšlapu izvēlni.

      Saistīts koks

      Lai izveidotu tādu struktūru kā “katalogs -> katalogs -> katalogs -> produkts” vai “albums -> albums -> attēls”, modelis ar lauku “parent” ir jāsaista ar citu modeli, lai pirmā modeļa galīgais vecāks. modelis ir sveša atslēga citu modeļu ierakstiem.

      Saistītā koka izveides piemērs daudzlīmeņu produktu katalogam.

      Klases katalogi paplašina modeli ( Protected $name = "Kataloga sadaļas"; Protected $model_elements = array(array("Active", "bool", "active", array("on_create" => true)), array("Nosaukums" , "char", "name", array("required" => true)), array("Katalogs", "parent", "parent", array("parent_for" => "Produkti")), array(" Saite", "url", "url"), masīvs("pozīcija", "pasūtījums", "pasūtījums")); ) klase Produkti paplašina modeli ( aizsargāts $nosaukums = "Kataloga produkti"; aizsargāts $model_elements = array(masīvs ("Active", "bool", "active", array("on_create" => true)), array("Name", "char", "name", array("required" => true)), masīvs ("Kataloga sadaļa", "enum", "parent", array("foreign_key" => "Katalogi", "is_parent" => true)), array("Cena", "int", "cena", array( "required" => true)), array("Attēli", "vairāki_attēli","attēli"), array("Apraksts", "teksts", "desc", array("bagātināts_teksts" => true)), masīvs ("Amats", "pasūtījums", "pasūtījums")); )

      Īpašas koka metodes

      Lai ātri piekļūtu vecākiem un bērniem, kokā ir paredzētas īpašas metodes.

      • getParents($id) — atgriež vecāku ierakstu masīvu (līdz ierakstam ar vecāklauka vērtību -1). Iegūtajā masīvā atslēgas ir ierakstu ID, vērtības ir ierakstu nosaukumi saskaņā ar parametru "$name_field" sadaļā Modeļa iestatīšana.
      • getChildren($id) — atgriež visu pakārtoto ierakstu masīvu, rekursīvi šķērsojot visus koka zarus. Iegūtais masīvs tiek veidots līdzīgi kā iepriekšējā metodē.
      • displayBreadcrumbs($id, $url_first [, $url_field]) — parāda atsauces ceļu uz ierakstu ar nodoto ID. Atgriež HTML tagu secību formā
        "saite -> saite -> saite -> span". Ievades parametri: pašreizējās ziņas id, $url_first - URL pirmā daļa,
        neobligāts parametrs $url_field — tā lauka nosaukums, kurā tiek saglabāta šī ieraksta teksta saite (lai izveidotu URL, piemēram, "catalog/toys/"). Iepriekš instalētajam modelim “Lapas” saites tiek automātiski izveidotas formātā “/page/4/” un “/contacts/” (bez pirmās daļas).
      $catalog = $mv -> katalogi -> findRecordById(43); //Vecāku ieraksti $vecāki = $mv -> katalogi -> getParents($catalog -> id); //Bērnu ieraksti $bērni = $mv -> katalogi -> getChildren($catalog -> id); //Atsauces ceļš kataloga sadaļai echo $mv -> catalogs -> displayBreadcrumbs($catalog -> id, "category", "url"); //Atsauces ceļš kataloga produktam echo $mv -> products -> displayBreadcrumbs($product -> id, "category"); //Atsauces ceļš būs Toys Balls Ball red formā