Täna räägin teile, kuidas MySQL-is hierarhilist puud luua.

Selliseid puid kasutatakse dünaamilise saidi kategooriate koostamisel, näiteks veebipoes või postituse kommentaaride kuvamisel.

Üldiselt ehitatakse neid seal, kus vähegi võimalik. Peaasi on see õigesti ehitada ja rakendada.

Hierarhilise puu ehitamisel on kõige olulisem õige andmebaasi struktuur! Mõelge näiteks selle andmebaasi struktuurile, kus saidikategooriad on salvestatud. Lihtsa näite jaoks on tabelis 3 välja:

  • id - kategooria võti
  • parent_id — vanemkategooria ID
  • nimi – sektsiooni nimi
  • Loome tabeli, käivitades PHPMyAdminis SQL-päringu:

    CREATE TABLE `categories` (`id` INT NOT NULL AUTO_INCREMENT , `parent_id` INT NOT NULL , `nimi` VARCHAR(50) NOT NULL , PRIMARY KEY (`id`));

    Nüüd peame oma tabeli rekorditega täitma. Selle tulemusena peaksite saama umbes sellise tabeli:

    Saate täita testtabeli järgmise päringuga:

    INSERT INTO 'categories' ('id', 'parent_id', 'name) VÄÄRTUSTE (1, 0, "Jaotis 1"), (2, 0, "Jaotis 2"), (3, 0, "Jaotis 3") ), (4, 1, "Jaotis 1.1"), (5, 1, "Jaotis 1.2"), (6, 4, "Jaotis 1.1.1"), (7, 2, "Jaotis 2.1"), (8 , 2, "Jaotis 2.2"), (9, 3, "Jaotis 3.1");

    Ja nüüd tähelepanu! Järgmiseks tuleb loogiliselt võttes teha andmebaasist valikud tsüklina, et valida iga kategooria ja selle alamkategooria. AGA! See on okei, kui andmebaasis on mitu kategooriat, mis pole samuti põhimõtteliselt õige. Mis siis, kui sait on veebipood ja sellel on sada kategooriat ja sama palju alamkategooriaid? Siis häda! Tundmatu arv päringuid andmebaasi põhjustab saidi aeglustumise või mysql-serveri täieliku krahhi.

    Kõigi kategooriate ja nende alamkategooriate valimiseks saate kasutada ainult ühte andmebaasipäringut.

    Teeme päringu ja loome edasiseks tööks mugava massiivi.

    //Andmete valimine andmebaasist $result=mysql_query("SELECT * FROM kategooriad"); //Kui andmebaasis on kirjeid, moodustame massiivi if (mysql_num_rows($result) > 0)( $cats = array(); //Singluses moodustame sektsioonide massiivi, võtmeks on id vanemkategooria ja ka jaotiste massiivi puhul on võtmeks kategooria ID while($cat = mysql_fetch_assoc($result))( $cats_ID[$cat["id"]] = $kass; $cats[$ kass["vanema_id"]][$kass["id"]] = $kass; ) )

    Valime kategooriate tabelist kõik andmed ja moodustame assotsiatiivse massiivi $cats , võtmeks saab vanemkategooriate id.

    Nüüd ehitame puu. Ehitamiseks kasutame rekursiivset funktsiooni.

    Hierarhilisel puul on järgmine struktuur:

    • 1. jagu
      • Jaotis 1.1
        • Jaotis 1.1.1
      • Punkt 1.2
    • 2. jagu
      • Jaotis 1.1
      • Punkt 1.2
    • 3. jagu
      • Punkt 3.1

    Loome rekursiivse funktsiooni build_tree(). See loob meie hierarhilise puu absoluutselt kõigist pesadest.

    Funktsioon build_tree($cats,$parent_id,$only_parent = false)( if(is_massiiv($cats) ja isset($cats[$parent_id]))( $tree = "

      "; if($only_parent==false)( foreach($kassid[$vanema_id] $kassina)( $puu .= ""; ) )elseif(on_numeric($only_parent))( $kass = $kassid[$vanema_id ][$only_parent]; $puu .= "
    • ".$cat["nimi"]." #".$kass["id"]; $puu .= build_tree($cats,$cat["id"]); $puu .= "
    • "; ) $puu .= "
    "; ) muidu tagasta null; tagasta $puu;)

    Funktsioon võtab sektsioonide massiivi ja jaotise ID. Tingis käime läbi alamkategooriad ja kui neil on rohkem sektsioone, siis käivitatakse funktsioon uuesti uute parameetritega (uus sektsioonide massiiv ja ehitamist vajava sektsiooni id). Nii moodustub iga pesa puu!

    Puu ehitamiseks kirjutame koodi:

    Echo build_tree($cats,0);

    Seega lõime kahes etapis veebisaidi jaotiste hierarhilise puu ja pole vahet, kui palju jaotisi seal on!

    UPD Kui vajate kategooriapuud vastupidises järjekorras, teades kategooria ID-d, siis peate kasutama funktsiooni:

    Funktsioon 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"]; )

    See funktsioon võtab kategooriate massiivi, mille võti on kategooria ID ja selle kategooria ID, millest peate üles minema.

    Sellise puu koostamiseks käivitage funktsioon build_tree järgmiste parameetritega:

    Echo build_tree($kassid,0,leida_vanem($kasside_ID,TEIE_KATEGOORIA_ID));

    Kas teil on küsimusi? Küsi kommentaarides

    28. mai 2016

    Veebirakendusi arendades puutume sageli kokku vajadusega esitada andmed puu kujul. Sama veebipoe loomisel sobib lineaarne tootekategooriate struktuur ainult väikeste projektide jaoks. Enamasti soovite kategooriaid üksteise sees pesastada. Muudel juhtudel, näiteks failihalduri loomisel, on ilma kategooriateta veelgi keerulisem hakkama saada.
    Selles artiklis räägin teile, kuidas saate hõlpsalt luua oma veebisaidile kena andmepuu, alustades tabeli loomisest mysql-is ja lõpetades puu kuvamisega brauseris. Kasutame kliendil jstree teeki ja kirjutame ise lihtsa serveri koodi.

    Mida me teeme ja mida me selle tulemusel saame?

    Võtame näiteks korduvalt mainitud veebipoe ja loome selle jaoks tootekategooriate puu. Traditsiooniliselt hakkame kauplema arvutitehnikaga. Kõigepealt koostame mysql-is kategooriate tabeli, seejärel koostame kataloogilehe märgistuse, kirjutame js koodi ja lõpuks php skripti, mis läheb andmebaasi ja saadab kategooriad kliendile vajalikus formaadis. Ja kohe link

    Loo kategooriatabel

    Suvaliselt hargnenud kategooriastruktuuri loomiseks vajame ainult ühte tabelit. Nimetame seda kategooriateks ja loome sinna 4 välja: id, kategooria, vanemate_id ja number. id on primaarvõti ja automaatne juurdekasv, kategooria on kategooria nimi, vanemate_id on ülemkategooria id, number on kategooria seerianumber vanemas.

    Lubage mul selgitada: näiteks on meil 3 tootekategooriat, millest peamine on sülearvutid ja see sisaldab veel 2 - Acer ja Lenovo. Tabelis näeb see välja järgmine:
    id, kategooria, vanema_id, number
    1, sülearvutid, 0, 1
    2, Acer, 1, 1
    3, Lenovo, 1, 2
    Lepime kokku, et juurkategooriate väärtus on parent_id = 0. Numbriväli on vajalik kategooriate kuvamise korraldamiseks soovitud järjekorras; me ei garanteeri, et Acer on alati esikohal, seega peate saama muuta kuvamise järjekord. Igal alamkategoorial on oma numeratsioon alates 1.

    Hierarhia ülesehituse paremaks nägemiseks looge mysql-is tabel ja täitke see testandmetega. Allpool on mõlema sql-kood. Nagu tavaliselt, kutsume andmebaasi webdevkiniks.

    Kategooriatabeli struktuuri kasutamine webdevkin; loo tabelikategooriad (id int(10) unsigned not null auto_increment, kategooria varchar(255) not null, parent_id int(10) unsigned not null, number int(11) unsigned not null, primaarvõti (id)) mootor = innodb auto_increment = 18 avg_row_length = 963 märgistik utf8 võrdlemine utf8_general_ci; Testiandmed kasutavad webdevkini; MÄÄRATA NIMED "utf8"; INSERT INTO kategooriad (`id`, `category`, `parent_id`, `number) VÄÄRTUSED (1, "Sülearvutid", 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, "Nutitelefonid", 0, 2), (9, "iPhone", 8, 1), (10, "Samsung", 8, 2), (11, "LG" , 8, 3), (12, "Vertu", 8, 4), (13, "komponendid", 0, 3), (14, "Protsessorid", 13, 1), (15, "Mälu", 13 , 2), (16, "Videokaardid", 13, 3), (17, "Kõvakettad", 13, 4);

    Nüüd saate vaadata tavalise phpMyAdmin-e või dbForgeStudio kategooriate tabelit ja jätkata meie minirakenduse loomist.

    Projekti struktuur

    Projekti juurtes on indeks.html ja 4 lihtsat kausta: img, css, js ja php. Pilt sisaldab ühte pilti loading.gif. Seda näidatakse saidi külastajatele, kui kategooriapuu serverist laaditakse. Css-kaust sisaldab meie lehe stiilidega faili main.css ja kausta jstree, mis sisaldab jstree teegi stiile ja pilte.

    Vanade aegade huvides jagame js-kausta tarnijateks ja mooduliteks. Esimene kaust sisaldab jquery ja jstree teeke. Täpsustan – jquery pole vajalik mitte ainult meie jaoks, vaid ka jstree sõltuvusena. Moodulite kaustas on ainus fail main.js - rakenduse peamine js-skript. Saadame index.php php kausta, mis teeb ära kogu serveritöö.

    Seekord on mugavam rääkida esmalt asja serveri poolest ja seejärel liikuda edasi kliendi poolele. Seetõttu vaatame, kuidas kategooriatabelist andmeid vajalikus vormingus välja võtta – fail php/index.php

    Serveri kood - index.php

    Mida me tegema peame?

    • 1. Ühendage andmebaasiga
    • 2. Tõmmake välja kategooriate loend
    • 3. Saatke teave brauserisse

    Loetelu on lihtne ja rakendamisega ei tohiks probleeme tekkida. Faili alguses deklareerime andmebaasiga ühenduse loomiseks vajalikud konstandid.

    // Deklareerib vajalikud konstandid define("DB_HOST", "localhost"); define("DB_USER", "kasutaja"); define("DB_PASSWORD", "parool"); define("DB_NAME", "webdevkin");

    Seejärel kirjutame funktsiooni mysqli abil andmebaasiga ühenduse loomiseks.

    // Ühendage andmebaasi funktsiooniga connectDB() ( $errorMessage = "Andmebaasiserveriga ei saa ühendust luua"; $conn = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); if (!$conn) viska uus erand($ errorMessage ); else ( $query = $conn->query("nimede määramine utf8"); if (!$query) viska uus erand($errorMessage); muidu tagastab $conn; ) )

    Järgmisena peame tabelist tõmbama kategooriate loendi. Siin peame endast veidi ette jõudma. Jstree teek aktsepteerib sisendina jsoni. Vastuvõetavaid vorminguid kirjeldatakse raamatukogu veebisaidil jstree.com. Võtame endale sobivaima ja saadame ettevalmistatud andmed kohe serverist. See formaat näeb välja selline:

    [ ( "id" : "ajson1", "parent" : "#", "text" : "Lihtne juursõlm" ), ( "id" : "ajson2", "parent" : "#", "text" : "Juursõlm 2" ), ( "id" : "ajson3", "parent" : "ajson2", "text" : "Laps 1" ), ( "id" : "ajson4", "parent" : "ajson2" , "tekst" : "Laps 2" ), ]

    Näide on võetud dokumentatsioonist, kuid mugavuse huvides kasutame id-na lihtsalt oma andmebaasi ID-d - numbrit ilma ajsoni eesliiteta. Liigume edasi andmebaasi tabelist kategooriate hankimise funktsiooni juurde

    // Kategooriate toomine andmebaasi funktsioonist getCategories($db) ( $query = " SELECT id AS `id`, IF (parent_id = 0, "#", parent_id) AS `parent`, kategooria kui `tekst` kategooriatest ORDER BY `parent`, `number` "; $andmed = $db->query($query); $categories = array(); while ($rida = $andmed->fetch_assoc()) ( array_push($categories, massiiv ( "id" => $rida["id"], "parent" => $rida["vanem"], "tekst" => $rida["tekst"])); ) tagastab $kategooriad; )

    Siin käivitame kategooriate tabelis tavalise valikupäringu, tõmbame välja 3 nõutavat välja ja samal ajal muudame need veidi nõutavasse vormingusse. Edastame id ilma muudatusteta, tagastame parameeter_id vanemana ja juurkategooriate puhul tagastame #. Ja kategooriaväli edastatakse tekstina. Andmed on vastu võetud, jääb üle vaid massiivi panna, mille teisendame json-vormingusse ja saadame brauserisse. See on nähtav põhiskripti lõimes

    Proovi ( // Ühendage andmebaasiga $conn = connectDB(); // Hangi andmed massiivist GET $action = $_GET["action"]; switch ($action) ( juhtum "get_categories": $result = getCategories( $ conn); break; vaikimisi: $result = "tundmatu toiming"; break; ) // Tagastab kliendile eduka vastuse echo json_encode(array("code" => "edu", "result" => $result) ); ) catch (Erand $e) ( // Tagastab kliendile vea vastuse echo json_encode(array("code" => "error", "message" => $e->getMessage())); )

    Millele peate tähelepanu pöörama. Meie konkreetsel juhul näib parameetri get tegevusele edastamine ebavajalik, kuid see on nii kaua, kui fail index.php täidab ainult ühte ülesannet - kategooriate loendi tagastamist. Peagi ilmub artikkel puu funktsionaalsuse arendusest, eelkõige drag-and-drop juurutamisest kliendis ja vastavate andmete uuendamisest serveris. Sellest näeme, et parameetri get edastamine nõutava toimingu indikaatorina on üsna mugav teema.

    Ja vastusest kliendile. Koodiväli näitab alati päringu olekut – õnnestumine või viga. Edu korral tagastatakse kategooriate massiiv tulemusväljale, probleemide korral saadetakse sõnumiväljale veateade.

    Meie rakenduse serveriosaga on kõik, liigume edasi kliendi juurde.

    Meie kataloogilehe märgistus on index.html

    Kui olete juba rakenduse demot vaadanud, näete, et märgistus on äärmiselt lihtne. Põhikonteinereid on 2: vasakul - kategooriapuu jaoks, paremal - tooteloendi kohatäide. Peaosa sisaldab järgmist koodi:

    Webdevkin. Kategooriapuu javascriptis, php-s ja mysql-is

    Toodete loetelu

    Ja lisage saidile main.css veidi märgistust

    Body ( fondiperekond: Ubuntu; fondi suurus: 16 pikslit; fondi kaal: 400; ) .container ( asukoht: suhteline; laius: 960 pikslit; veeris: 0 auto; ) .column ( kuva: inline-block; vertikaalne joondus : ülemine; ) .categories ( laius: 30%; )

    Oleme html/css-iga valmis ja liigume nüüd kõige huvitavama osa juurde – puu loomise javasctipt-koodi juurde. Siin paneme kokku kõik kavandatud funktsioonid.

    main.js – rakenduse lähtestamine

    Kui olete lugenud varasemaid artikleid, näiteks esiküljel oleva veebipoe ostukorvi loomise kohta või natiivse JavaScripti abil manustatud vidinate kohta, siis võite meeles pidada, et minu js-koodiskeem on kõigil juhtudel ligikaudu sama.

    Rakendame seda ka siin: looge js-moodul sulgemise alusel, salvestage vahemällu vajalikud dom-elemendid, kirjutage mitu privaatmeetodit ja üks avalik - rakenduse initsialiseerimise meetod.

    Mooduliraamistik "kasuta ranget"; // Rakenduse moodul var app = (function($) ( // Initsialiseeri vajalikud muutujad var ajaxUrl = "/php", ui = ( $categories: $("#categories"), $goods: $("#kaubad" ) ); // Kategooriapuu lähtestamine jstree funktsiooniga _initTree(data) ( // ... ) // Kategooriate laadimine serverifunktsioonist _loadData() ( // ... ) // Rakenduse funktsiooni init() lähtestamine ( _loadData( ); ) // Ekspordi väljapoole return ( init: init ) ))(jQuery); jQuery(document).ready(app.init);

    Nagu viimasel real näha, kutsume peale dokumendi laadimist meetodi app.init(), mis omakorda laadib andmed serverist ja edastab need puu loomise meetodile. AjaxUrlis kirjutame oma serveri skripti aadressi; UI-objekti vahemällu salvestatakse kaks dom-elementi.

    Andmete vastuvõtmine serverist - meetod _loadData() // Kategooriate laadimine serverifunktsioonist _loadData() ( var params = ( action: "get_categories" ); $.ajax(( url: ajaxUrl, meetod: "GET", andmed: params, dataType: "json", success: function(resp) ( // Initsialiseeri kategooriapuu if (resp.code === "success") ( _initTree(resp.result); ) else ( console.error("Viga andmete saamine serverist: ", resp.message); ) ), error: function(error) ( console.error("Viga: ", viga); ) )); )

    Siin kirjutame kõige tavalisema Ajaxi päringu serveri skripti, võtame vastu andmed kategooriatega ja kui see õnnestub, edastame need puu lähtestamisfunktsioonile _initTree(). Peame meeles, et saame serverist andmeid json-vormingus, seega näitame kohe dataType'i: "json". Ja vajalik teave tuleb tulemuste väljale, seega edastame _initTree'le täpselt resp.result. Saate vigu käsitleda mis tahes viisil; näiteks viskame need lihtsalt konsooli.

    Puu ehitamine funktsioonis _initTree, kasutades jstree // Kategooriapuu lähtestamine funktsiooni jstree abil _initTree(data) ( ui.$categories.jstree(( core: ( check_callback: true, multiple: false, data: data ), pluginad: [" dnd"] )).bind("changed.jstree", function(e, data) ( var category = data.node.text; ui.$goods.html("Kategooriast " + kategooria tooted); konsool. log( "sõlme andmed: ", andmed); )); )

    Ja see on kõik, mida vajate! Visuaalselt tundub rakenduse kõige keerulisem osa ennekuulmatult lihtne. Peate lihtsalt rakendama jstree meetodit teatud parameetritega konkreetsele dom-elemendile. Meie puhul edastame andmeväljale andmed ise, multiple: false näitab, et me ei vaja mitmekordset valikut ja check_callback: true näitab, et tahame pärast puu muutmist midagi muud teha.

    Pluginate väljal loetleme massiivina soovitud kuklid. Keskendume dnd-le – drag-and-drop – lisame võimaluse puustruktuuri hiirega muuta. See on väga mugav asi, kuid mitte veel funktsionaalne. Saate brauseris puuga mängida nii palju kui soovite, kuid pärast lehe värskendamist näeme vana kataloogi struktuuri. See on mõttekas, kuna andmed võetakse serverist ja me pole kirjutanud ühtegi koodi, mis võimaldaks kliendi sündmustel mysql-i värskendada. Üks järgmistest artiklitest on pühendatud sellele, kuid praegu mängime ringi, liigutades kategooriaid brauseris hiirega.

    Ja lõpuks, kasutades sidumismeetodit, seostame puu muudatussündmuse mõne kasuliku toiminguga. Meie näites kuvame lihtsalt pealdise kategooria nimega, kuid päris rakenduses tasuks toodete loend serverist tõmmata. Kust kategooria = data.node.text tuli? Avage oma brauseri konsool ja vaadake, millised muud andmed valitud sõlme kohta meile saadaval on.

    Kokku

    Selles artiklis ei koostanud me veebipoe pidamiseks täisväärtuslikku kataloogi – see polnud idee. Tahtsin keskenduda sellele, kuidas ehitada nii kasulik struktuur nagu puu võimalikult lihtsalt algusest lõpuni. Mõned punktid jäeti teadlikult välja, nimelt tihedam töö puu endaga ja kliendi toimingute sünkroonimine serveriga, samuti toodete loendi koostamine, kui kategoorial klõpsate. Esimese variandi kohta avaldan eraldi artikli.

    VÄRSKENDATUD: postitasin artikli, mis näitab, kuidas üksikuid puuelemente hiirega liigutada, kasutades pukseerimismeetodit, ja neid andmeid serveriga sünkroonida. Väike kood kliendil ja serveril – ja voila! Link asub allpool numbri 4 juures.

    Alustuseks kirjeldan, millega me töötame ja mida vajame.
    Süsteem: PHP 5 ja uuem, mySQL 4 ja uuem
    Abiklassid: dbsql.class.php (klass andmebaasiga töötamiseks)
    Pesastatud kategooriate klass: classTreeCategory.php (otse põhiklass, allpool on selle loetelu ja selgitused.

    Loome andmebaasis järgmise struktuuriga tabeli:

    Kuva kood MYSQL

    See tabel sisaldab ID-välja – kategooria, taskukoti seerianumbril – esmajärgu kategooriate puhul on väärtus null või põhikategooria ID, nimi – kategooria nimi.

    Näide selle kohta, kuidas klass töötab, kuvades kategooriad alamkategooriatega loendis:

    Kuva kood PHP

    include ("dbsql.class.php" ); include ("classTreeCategory.php" ) ; $DB = new DB_Engine("mysql" , $settings [ "dbHost" ] , $settings [ "dbUser" ] , $settings [ "dbPass" ] , $settings [ "dbName" ] ) ; // ühendumine andmebaasiga, näidates ligipääsuandmeid $category = new TreeCategory ($DB ) ; // edasi kategooriaklassi, objekti andmebaasiga töötamiseks $category -> table = "category" ; // tabeli nimi andmebaasis kategooriatega $array = $category -> getCategory () ; // hankige andmebaasist kõik kategooriad mitmetasandilise massiivi kujul, sorteerituna ja pesastades vajalikus järjekorras $category -> outCategory ($massiiv, "valik" ) ; // kategooriate väljundi ettevalmistamine (HTML-i moodustamine), massiivi edastamine kategooriatega echo $category -> html ; // väljundkategooriad HTML-nimena

    Nagu ülaltoodud näitest näha, on kõik äärmiselt lihtne, loome uue $category objekti, määrame millise andmebaasi tabeliga töötame: 'category', seejärel saame tabelist nimekirja kõigist kategooriatest, mis on juba vormindatud kategooriana. massiivi ja paigutatud hierarhilises järjekorras, võttes arvesse kõiki alamkategooriaid. seejärel edastame massiivi outCategory() meetodile, mis genereerib meie jaoks valmis HTML-koodi, mida peame vaid brauseris kuvama.

    Meetod outCategory(), nagu näeme, võtab esimeses parameetris kaks parameetrit @massiiv ja @string kõigi kategooriatega massiivi ja teises rea, mis sisaldab valikut või tabeli väärtust, see väärtus näitab, millist tüüpi HTML-koodi vajab genereerida.
    optsiooni väärtus

    Kuva kood HTML

    -kategooria 1 --alamkategooria 1 ---alamkategooria 1 - kategooria 2

    Selle HTML-koodi sisestamiseks mis tahes vormi valikuväljale.

    Tabeli väärtus genereerib järgmise HTML-koodi:

    Kuva kood HTML

    Seda HTML-koodi on mugav sisestada tabelisse, mis kuvab kõik meie kategooriad ja alamkategooriad.

    Klassil on ka järgmised meetodid:
    deleteItem($id); — kustutab ühe kategooria, hoolimata pesastatud kategooriatest
    delCategory($massiiv, $id); — kustutab kategooria kõigi pesastatud alamkategooriatega, $massiiv — kõigi kategooriatega massiiv, mis on koostatud meetodiga $category->getCategory(), $id — kustutatava kategooria number
    addItem(); - seda meetodit tuleks kutsuda, kui soovite kategooriat lisada ja see meetod loeb väärtused POST-meetodil edastatud andmetest, st. massiivist $_POST.
    $nimi=$see->PHP_kaldkriipsud(riba_sildid($_POST['nimi'])); // kategooria nimi
    $podcat=intval($_POST['podcat']); // Vanemkategooria ID, kui on määratud 0, on kategooria juur.
    updateItem() ; — sarnane eelmisele meetodile, välja arvatud see, et see meetod värskendab kategooriat, selle nime ja pesastustaset.

    tabel="kategooria"; // kategooriate loendi valimise taotlus, tabeli nimi * $category->outCategory($category->getCategory()); // kategooriate väljundi ettevalmistamine (kategooriate massiivi päringu tegemine) * echo $category->html; // väljundkategooriad HTML-i nimes * */ /** * Tühjenda tabel, millega töötame * * TABLE TABEL, KUI ON OLEMAS `kategooria`; * 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; * */ klass TreeCategory ( /** * Päringu string andmebaasis */ var $table; /** * Liides andmebaasiga töötamiseks */ var $DB; /** * Pesastatud alamkategooriatega kategooriate massiiv */ var $arrayCat; / ** * Loendab automaatselt kategooria nime ees olevate kriipsude arvu väljastamisel */ var $countPodcat; /** * HTML-kood alamkategooriatega kategooriate väljastamiseks */ var $html; /** * Saame liides andmebaasiga töötamiseks ja asetage see kohalikku muutujasse */ function __construct($DB) ( $this->DB=$DB; $this->component=$_GET["komponent"]; ) /** * Hangib kategooriate loendi, sorteerib need ja paigutab pesastatud massiividega massiivi jne. * @return massiivi kategooria */ funktsioon getCategory () ( $all = $this->DB->getAll("SELECT * FROM `( $this->table)` ORDER BY `id` ASC"); $tee = array(); if(count($all)>0) ( foreach($all kui $üks): if($item["podcat "]==0)$sort[$item[ "id"]]=$item; if($item["podcat"]>0) ( if(isset($tee[$item["podcat"]]) ) ( $str="$sort"; foreach( $path[$item["podcat"]] as $pitem): $rep=$item["podcat"]; $str.="[$pitem]"; endforeach; $str.="[($item["podcat"])]"; $str.="[($item["id"])]"; $str.="=$item;"; eval($str); foreach($tee[$item["podcat"]] as $pitem): $tee[$item["id"]]=$pitem; endforeach; $tee[$item["id"]]=$item["podcat"]; ) else ( $sort[$item["podcat"]]["sub"][$item["id"]]=$item; $tee[$item["id"]]=$item["podcat" ]; ) ) endforeach; ) $this->arrayCat=$sorteeri; return $this->arrayCat; ) /** * Prindib kategooriad, asetab valmis HTML-i $this->html * @param massiiv Massiiv kategooriate ja pesastatud alamkategooriatega * @param string Väljundi, valiku või tabeli genereeritud HTML-koodi tüüp */ funktsioon 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--; ) ) /** * Abimeetod HTML-koodi ettevalmistamiseks * @param massiiv Kategooriaga massiiv * @param string Väljundi, valiku või tabeli genereeritud HTML-koodi tüüp */ funktsioon outItem($sub, $type="option", $idSel=0) ( for($i=0;$ icountPodcat;$i++) ( $out. ="-"; ) if($idSel==$sub["id"])$se="valitud"; else $se=""; if($type=="option")$this->html.=" ($out) ($sub["nimi"]) "; if($type=="table")$this->html.= ($out) ($sub["nimi"]) HTML; ) funktsioon delCategory(&$a_tree,&$id=0) ( foreach($a_tree as $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"]); ) ) ) funktsioon delCategory_process (&$a_tree) ( foreach($a_tree as $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"]); ) ) funktsioon updateItem() ( $nimi=$this- >PHP_kaldkriipsud(riba_sildid($_POST["nimi"])); $podcat=intval($_POST["podcat"]); $id=intval($_POST["id"]); $sql="UPDATE `( $this->table)` SET `name` = "($nimi)", `podcat` = "($podcat)" WHERE `id`="($id)" LIMIT 1; "; $this->DB ->execute($sql); ) funktsioon addItem() ( $nimi=$this->PHP_slashes(riba_sildid($_POST["nimi"])); $podcat=intval($_POST["podcat"]); $ id=intval($_POST["id"]); $sql="INSERT INTO `($this->table)` (`id`,`podcat`,`name`) VÄÄRTUSED ("", "$podcat" , "$nimi");"; $see->DB->käivita($sql); ) funktsioon deleteItem($id) ( $id=intval($id); $sql="DELETE FROM `($this->table)` WHERE `id` = "($id)" LIMIT 1"; $DB- >execute($sql); header("Asukoht: ?component=($this->component)"); ) funktsioon PHP_slashes($string,$type="add") (if ($type == "add") ( if (get_magic_quotes_gpc()) ( return $string; ) else ( if (function_exists("addslashes")) ( return addslashes($string); ) else ( return mysql_real_escape_string($string); ) ) ) else if ($type == "riba") ( tagastab ribakriipsud($string); ) else ( die("viga PHP_kaldkriipsudes (mixed,add | strip)"); ) ) )

    Kogu klass kirjutati tunni jooksul ja loomulikult on sellel mõned puudused, kuid see on kõik parandatav. Seda on soovitatav kasutada hariduslikel eesmärkidel, kuigi selle veidi viimistledes saate selle integreerida mis tahes süsteemi ja nautida selle tööd)).

    Oleksin tänulik, kui pakuksite kommentaarides sellele probleemile omapoolseid lahendusi - korraldades lõpmatu tasemega pesitsuskategooriaid.

    Järgmine ülesanne on luua PHP abil lõpmatu pesastuse kategooriad. Pärast mitmel saidil surfamist leidsin palju lahendusi, kuid mitte kõik pole minu jaoks kättesaadavad, sest... Sealne programmeerimise tase on minu omast kõrgem. Seetõttu leidsin kõige lihtsama, võib-olla mitte kõige elegantsema, kuid toimiva lahenduse.

    Kõigepealt vaatame, mis mul andmebaasis on

    • id - meie kategooria identifikaator
    • kategooria — kategooria nimi
    • Kategooria_id — põhikategooria identifikaator. Võiksite seda nimetada parent_id-ks, kuid see on mulle tuttavam
    • lvl — kategooria pesastustase. Vajalik moodustamiseks...
    • Kõigest, mida varjatakse, pole sulle kasu, sest... Seal on mulle isiklikult vajalik teave ja et teid mitte eksitada, kustutasin selle ebavajaliku teabe.
    Kategooriate kuvamine

    Siin pole palju öelda, kui teil on küsimusi, kirjutage kommentaaridesse ja neile, kes siin kirjutatu ei huvita, soovitan kohe tulemust vaadata

    Kui te ei saa aru, siis vajame andmebaasis lihtsalt välja lvl, et teada saada, mitu "-" kategooria nimede ette panna. Muidugi on ilma lvl-ita keerukam meetod, kuid hetkel on see ainus lahendus, mis mul on. Niipea kui asjad muutuvad, värskendan artiklit.

    Kategooriate kuvamine
    • Kuid siin on teile veel üks lahendus, kui peate seda kuvama mitte vormis, vaid loendis.

      Siin ei vaja me enam lvl-i, seega on vähem koodi. Ja allpool on tulemus

      See luuakse, lisades mudelile välja ematüübi "parent", mis salvestab praeguse kirje vanema ID. Juurkirjete puhul on selle välja väärtus "-1".

      Tähelepanu! Mudelis võib olla ainult üks väli tüüpi "vanem".

      Näide puu lihtsast kasutamisest alamlehtede menüü loomisel.

      Seotud puu

      Sellise struktuuri loomiseks nagu „kataloog -> kataloog -> kataloog -> toode” või „album -> album -> pilt”, peate linkima väljaga „ema” mudeli mõne teise mudeliga, nii et esimese mudeli viimane ülem mudel on võõrvõti teiste mudelite kirjete jaoks.

      Näide lingitud puu loomisest mitmetasandilise tootekataloogi jaoks.

      Klassi kataloogid laiendab mudelit ( kaitstud $nimi = "Kataloogi sektsioonid"; protected $model_elements = array(array("Active", "bool", "active", array("on_create" => true)), array("Nimi" , "char", "name", array("required" => true)), array("Kataloog", "parent", "parent", array("parent_for" => "Tooted")), array(" Link", "url", "url"), array("Position", "order", "order")); ) klass Tooted laiendab Mudel ( kaitstud $nimi = "Kataloogitooted"; kaitstud $mudeli_elemendid = array(massiiv) ("Active", "bool", "active", array("on_create" => true)), array("Name", "char", "name", array("required" => true)), array ("Kataloogi sektsioon", "enum", "parent", array("foreign_key" => "Kataloogid", "is_parent" => true)), array("Price", "int", "price", array( "required" => true)), array("Pildid", "multi_images","images"), array("Kirjeldus", "tekst", "desc", array("rikas_tekst" => true)), array ("Positsioon", "tellimus", "tellimus")); )

      Spetsiaalsed puumeetodid

      Vanematele ja lastele kiireks juurdepääsuks on puus ette nähtud spetsiaalsed meetodid.

      • getParents($id) – tagastab emakirjete massiivi (kuni kirjeni, mille lähtevälja väärtus on -1). Saadud massiivis on võtmeteks kirjete ID-d, väärtusteks on kirjete nimed vastavalt jaotise Mudeli seadistamine parameetrile "$name_field".
      • getChildren($id) – tagastab kõigi alamkirjete massiivi, läbides rekursiivselt kõik puu harud. Saadud massiiv konstrueeritakse sarnaselt eelmisele meetodile.
      • displayBreadcrumbs($id, $url_first [, $url_field]) – kuvab edastatud ID-ga kirje viitetee. Tagastab vormil olevate html-märgendite jada
        "link -> link -> link -> span". Sisestusparameetrid: praeguse postituse id, $url_first - URL-i esimene osa,
        valikuline parameeter $url_field – selle välja nimi, kuhu selle kirje tekstilink on salvestatud (URL-i loomiseks nagu "catalog/toys/"). Eelinstallitud "Pages" mudeli puhul luuakse lingid automaatselt kujul "/page/4/" ja "/contacts/" (ilma esimese osata).
      $kataloog = $mv -> kataloogid -> findRecordById(43); //Vanemkirjed $parents = $mv -> kataloogid -> getParents($catalog -> id); //Lastekirjed $lapsed = $mv -> kataloogid -> getChildren($catalog -> id); //Kataloogijaotise viitetee echo $mv -> catalogs -> displayBreadcrumbs($catalog -> id, "category", "url"); //Kataloogitoote viitetee echo $mv -> tooted -> displayBreadcrumbs($product -> id, "category"); //Võttetee on Toys Balls Ball red kujul