Tänään kerron sinulle kuinka luoda hierarkkinen puu MySQL:ssä.

Tällaisia ​​puita käytetään luotaessa dynaamisen sivuston luokkia, esimerkiksi verkkokaupassa tai kun näytetään kommentteja julkaisuun.

Yleensä ne rakennetaan aina kun mahdollista. Tärkeintä on rakentaa ja soveltaa sitä oikein.

Tärkeintä hierarkkista puuta rakennettaessa on oikea tietokantarakenne! Harkitse esimerkiksi tietokannan rakennetta, johon sivustoluokat on tallennettu. Yksinkertaisen esimerkin vuoksi taulukossa on 3 kenttää:

  • id - luokkaavain
  • parent_id — pääluokan tunnus
  • nimi – osion nimi
  • Luodaan taulukko suorittamalla SQL-kysely PHPMyAdminissa:

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

    Nyt meidän on täytettävä pöytämme tietueilla. Tuloksena sinun pitäisi saada tällainen taulukko:

    Voit täyttää testitaulukon seuraavalla kyselyllä:

    INSERT `kategorioihin` (`id`, `parent_id`, `nimi`) ARVOT (1, 0, "Oso 1"), (2, 0, "Oso 2"), (3, 0, "Oso 3") ), (4, 1, "Oso 1.1"), (5, 1, "Oso 1.2"), (6, 4, "Osa 1.1.1"), (7, 2, "Oso 2.1"), (8 , 2, "Osa 2.2"), (9, 3, "Osa 3.1");

    Ja nyt huomio! Seuraavaksi loogisesti sinun on tehtävä valinnat tietokannasta silmukassa valitaksesi jokainen luokka ja sen alaluokka. MUTTA! Ei haittaa, jos tietokannassa on useita luokkia, mikä ei myöskään ole periaatteessa oikein. Entä jos sivusto on verkkokauppa ja sillä on sata luokkaa ja sama määrä alaluokkia? Sitten vaivaa! Tuntematon määrä kyselyitä tietokantaan johtaa sivuston hidastumiseen tai mysql-palvelimen täydelliseen kaatumiseen.

    Voit käyttää vain yhtä tietokantakyselyä valitaksesi kaikki luokat ja niiden alaluokat.

    Tehdään pyyntö ja luodaan kätevä taulukko jatkotyötä varten.

    //Valitse tiedot tietokannasta $result=mysql_query("SELECT * FROM luokat"); //Jos tietokannassa on tietueita, muodostamme taulukon if (mysql_num_rows($result) > 0)( $cats = array(); //Silmukassa muodostamme taulukon osioista, avain on id pääluokan sekä osien joukon avain on luokan tunnus while($cat = mysql_fetch_assoc($result))( $cats_ID[$cat["id"]] = $kissa; $cats[$ kissa["parent_id"]][$kissa["id"]] = $kissa; ) )

    Valitsemme kaikki tiedot luokkataulukosta ja muodostamme assosiatiivisen taulukon $cats , avain on pääkategorioiden id.

    Nyt rakennetaan puu. Käytämme rakentamiseen rekursiivista funktiota.

    Hierarkkisella puulla on seuraava rakenne:

    • Osa 1
      • Kohta 1.1
        • Kohta 1.1.1
      • Kohta 1.2
    • Osasto-2
      • Kohta 1.1
      • Kohta 1.2
    • Osa 3
      • Kohta 3.1

    Luodaan rekursiivinen funktio build_tree(). Se rakentaa hierarkkisen puumme täysin kaikista pesimäkohteista.

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

      "; if($only_parent==false)( foreach($kissat[$vanhemman_tunnus] $kissana)( $puu .= ""; ) )elseif(on_numeric($only_parent))( $kissa = $kissat[$vanhemman_tunnus ][$only_parent]; $puu .= "
    • ".$kissa["nimi"]." #".$kissa["id"]; $puu .= build_tree($cats,$cat["id"]); $tree .= "
    • "; ) $puu .= "
    "; ) muuten palauta null; palauta $puu; )

    Funktio ottaa joukon osia ja osion id:n. Silmukassa käydään läpi alakategoriat ja jos niillä on enemmän osioita, niin toiminto käynnistetään uudelleen uusilla parametreilla (uusi joukko osioita ja rakennettavan osan id). Näin muodostuu minkä tahansa pesimäpuu!

    Puun rakentamiseksi kirjoitamme koodiin:

    Echo build_tree($kissat,0);

    Joten loimme kahdessa vaiheessa hierarkkisen puun verkkosivuston osioista, eikä sillä ole väliä kuinka monta osiota siellä on!

    UPD Jos tarvitset luokkapuun käänteisessä järjestyksessä tietäen luokkatunnuksen, sinun on käytettävä toimintoa:

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

    Tämä toiminto ottaa joukon luokkia, joiden avain on luokan tunnus ja sen luokan tunnus, josta sinun on noustava.

    Luodaksesi tällaisen puun, suorita build_tree-funktio seuraavilla parametreilla:

    Echo build_tree($kissat,0,etsi_vanhempi($kissat_ID,SINUN_LUOKAN_ID));

    Onko sinulla kysyttävää? Kysy kommenteissa

    28. toukokuuta 2016

    Web-sovelluksia kehitettäessä kohtaamme usein tarpeen esittää tiedot puun muodossa. Samaa verkkokauppaa luotaessa lineaarinen tuotekategorioiden rakenne sopii vain pieniin projekteihin. Useimmiten haluat pystyä sisäkkäin luokat toisiinsa. Muissa tapauksissa, esimerkiksi jos olet luomassa tiedostonhallintaa, on vielä vaikeampaa tehdä ilman luokkia.
    Tässä artikkelissa kerron sinulle, kuinka voit helposti luoda mukavan tietopuun verkkosivustollesi, alkaen taulukon luomisesta mysqlissa ja päättyen puun näyttämiseen selaimessa. Käytämme asiakkaalla jstree-kirjastoa ja kirjoitamme itse yksinkertaisen palvelinkoodin.

    Mitä aiomme tehdä ja mitä saamme tuloksena?

    Otetaan esimerkkinä toistuvasti mainittu verkkokauppa ja luodaan sille tuoteluokkien puu. Käymme perinteisesti kauppaa tietokonelaitteilla. Ensin luodaan mysql:ssä luokkien taulukko, sitten piirretään merkinnät luettelosivulle, kirjoitetaan js-koodi ja lopuksi php-skripti, joka menee tietokantaan ja lähettää luokat asiakkaalle vaaditussa muodossa. Ja heti linkki

    Luo luokkataulukko

    Jotta voimme luoda mielivaltaisesti haarautuneen luokkarakenteen, tarvitsemme vain yhden taulukon. Kutsutaan sitä kategorioiksi ja luodaan siihen 4 kenttää: id, category, parent_id ja number. id on ensisijainen avain ja automaattinen lisäys, luokka on luokan nimi, vanhempi_id on pääluokan tunnus, numero on luokan sarjanumero ylätasossa.

    Selitän: meillä on esimerkiksi 3 tuoteluokkaa, joista pääluokka on kannettavat tietokoneet, ja se sisältää 2 muuta - Acerin ja Lenovon. Taulukossa se näyttää tältä:
    id, luokka, vanhempi_tunnus, numero
    1, kannettavat tietokoneet, 0, 1
    2, Acer, 1, 1
    3, Lenovo, 1, 2
    Sovitaan, että juuriluokilla on parent_id = 0. Numerokenttää tarvitaan luokkien näytön järjestämiseen haluttuun järjestykseen, emme takaa, että Acer on aina ensimmäisellä paikalla, joten sinun on voitava muuttaa näyttöjärjestys. Jokaisella alakategorialla on oma numerointinsa alkaen 1.

    Jotta näet paremmin, kuinka hierarkia rakennetaan, luo taulukko mysqlissa ja täytä se testitiedoilla. Alla on molempien sql-koodi. Kuten tavallista, kutsumme tietokantaa webdevkiniksi.

    Luokkataulukon rakenne käyttää webdevkin; luo taulukon luokat (id int(10) unsigned not null auto_increment, category varchar(255) not null, parent_id int(10) unsigned not null, number int(11) unsigned not null, ensisijainen avain (id)) engine = innodb auto_increment = 18 avg_row_length = 963 merkistöä utf8 lajitella utf8_general_ci; Testitiedot käyttävät webdevkiniä; SET NIMET "utf8"; INSERT INTO luokkiin (`id`, `category`, `parent_id`, `number) ARVOT (1, "Kannettavat", 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, "älypuhelimet", 0, 2), (9, "iPhone", 8, 1), (10, "Samsung", 8, 2), (11, "LG") , 8, 3), (12, "Vertu", 8, 4), (13, "Komponentit", 0, 3), (14, "Prosessorit", 13, 1), (15, "Muisti", 13 , 2), (16, "Videokortit", 13, 3), (17, "Kiintolevyt", 13, 4);

    Nyt voit katsoa luokkataulukkoa tavallisessa phpMyAdmin-e:ssä tai dbForgeStudiossa ja jatkaa minisovelluksemme luomista.

    Hankkeen rakenne

    Projektin juuressa meillä on index.html ja 4 yksinkertaista kansiota: img, css, js ja php. Kuva sisältää yhden kuvan loading.gif. Se näytetään sivuston vierailijoille, kun luokkapuu ladataan palvelimelta. css-kansio sisältää main.css-tiedoston sivumme tyyleineen ja jstree-kansion, joka sisältää tyylejä ja kuvia jstree-kirjastoon.

    Vanhojen aikojen vuoksi jaamme js-kansion toimittajaan ja moduuleihin. Ensimmäinen kansio sisältää jquery- ja jstree-kirjastot. Selvennetään - jqueryä ei vaadita vain meille, vaan myös jstreen riippuvuutena. Moduulit-kansiossa ainoa tiedosto on main.js - sovelluksen tärkein js-skripti. Lähetämme index.php:n php-kansioon, joka tekee kaiken palvelintyön.

    Tällä kertaa on helpompi puhua ensin asian palvelinpuolelta ja sitten siirtyä asiakaspuolelle. Siksi katsotaan kuinka poimitaan tiedot luokkataulukosta vaaditussa muodossa - tiedosto php/index.php

    Palvelinkoodi - index.php

    Mitä meidän pitää tehdä?

    • 1. Muodosta yhteys tietokantaan
    • 2. Vedä luettelo luokista
    • 3. Lähetä tiedot selaimeen

    Luettelo on yksinkertainen, eikä toteutuksessa pitäisi olla ongelmia. Tiedoston alussa ilmoitamme tarvittavat vakiot tietokantaan kytkeytymistä varten.

    // Ilmoita tarvittavat vakiot define("DB_HOST", "localhost"); define("DB_USER", "käyttäjä"); define("DB_PASSWORD", "salasana"); define("DB_NAME", "webdevkin");

    Sitten kirjoitamme funktion yhteyden muodostamiseksi tietokantaan käyttämällä mysqliä.

    // Yhdistä tietokantatoimintoon connectDB() ( $errorMessage = "Yhteyttä ei voida muodostaa tietokantapalvelimeen"; $conn = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); if (!$conn) heittää uusi poikkeus($ errorMessage ); else ( $query = $conn->query("set names utf8"); if (!$query) heittää uusi poikkeus($errorMessage); muuten palauttaa $conn; ) )

    Seuraavaksi meidän on vedettävä luokkien luettelo taulukosta. Tässä meidän on mentävä hieman itsemme edellä. Jstree-kirjasto hyväksyy jsonin syötteeksi. Hyväksytyt muodot on kuvattu kirjaston verkkosivuilla jstree.com. Otamme meille sopivimman ja lähetämme valmistetut tiedot välittömästi palvelimelta. Tämä muoto näyttää tältä:

    [ ( "id" : "ajson1", "parent" : "#", "text" : "Yksinkertainen juurisolmu" ), ( "id" : "ajson2", "parent" : "#", "text" : "Juurisolmu 2" ), ( "id" : "ajson3", "vanhempi" : "ajson2", "teksti" : "Lapsi 1" ), ( "id" : "ajson4", "vanhempi" : "ajson2" , "teksti" : "Lapsi 2" ), ]

    Esimerkki on otettu dokumentaatiosta, mutta käyttömukavuuden vuoksi käytämme tunnuksena tietokannastamme olevaa id -numeroa ilman ajson-etuliitettä. Siirrytään toimintoon saada luokkia tietokantataulukosta

    // Luokkien hakeminen tietokantafunktiosta getCategories($db) ( $query = " SELECT id AS `id`, IF (parent_id = 0, "#", parent_id) AS `parent`, luokka tekstinä LUOKISTA ORDER BY `parent`, `number` "; $data = $db->query($query); $categories = array(); while ($row = $data->fetch_assoc()) ( array_push($categories, array ( "id" => $rivi["tunnus"], "parent" => $rivi["emo"], "teksti" => $rivi["teksti"])); ) palauttaa $kategoriat; )

    Täällä suoritamme tavallisen valintakyselyn luokkataulukossa, vedämme 3 pakollista kenttää ja samalla muunnamme niitä hieman vaadittuun muotoon. Välitämme id ilman muutoksia, palautamme parent_id ylätasona ja juuriluokille palauttamme #. Ja luokkakenttä välitetään tekstinä. Tiedot on vastaanotettu, jäljellä on vain laittaa ne taulukkoon, jonka muunnamme jsoniksi ja lähetämme selaimeen. Tämä näkyy pääskriptin säikeessä

    Kokeile ( // Yhdistä tietokantaan $conn = connectDB(); // Hae tiedot taulukosta GET $action = $_GET["action"]; kytkin ($action) ( tapaus "get_categories": $result = getCategories( $ conn); break; oletus: $result = "tuntematon toiminto"; break; ) // Palauta onnistunut vastaus asiakkaalle echo json_encode(array("code" => "success", "result" => $result) ); ) catch (poikkeus $e) ( // Palauta virhevastaus asiakkaalle echo json_encode(array("code" => "error", "message" => $e->getMessage())); )

    Mihin sinun on kiinnitettävä huomiota. Meidän tapauksessamme get-parametrin välittäminen toimintoon näyttää tarpeettomalta, mutta niin kauan kuin index.php-tiedosto palvelee vain yhtä tehtävää - palauttaa luokkaluettelon. Pian julkaistaan ​​artikkeli puun toiminnallisuuden kehittämisestä, erityisesti vedä ja pudota -toiminnon toteutuksesta asiakaskoneeseen ja vastaavien tietojen päivittämisestä palvelimelle. Siinä näemme, että get-parametrin välittäminen osoituksena vaaditusta toimenpiteestä on melko kätevä aihe.

    Ja vastauksesta asiakkaalle. Koodikenttä ilmaisee aina pyynnön tilan - onnistuminen tai virhe. Jos onnistuu, luokkajoukko palautetaan tuloskenttään, jos ongelmia ilmenee, viestikenttään lähetetään virheilmoitus.

    Siinä se sovelluksemme palvelinosassa, siirrytään asiakkaaseen.

    Kuvastosivumme merkintä on index.html

    Jos olet jo katsonut sovelluksen demoa, huomaat, että merkintä on erittäin yksinkertaista. Pääsäiliöitä on 2: vasemmalla - luokkapuuta varten, oikealla - tuoteluettelon paikkamerkki. Pääosio sisältää seuraavan koodin:

    Webdevkin. Luokkapuu javascriptissä, php:ssä ja mysql:ssä

    Luettelo tuotteista

    Ja lisää merkintöjä main.css-tiedostoon

    Body ( font-family: Ubuntu; font-size: 16px; font-weight: 400; ) .container ( sijainti: suhteellinen; leveys: 960px; margin: 0 auto; ) .column ( näyttö: inline-block; vertikaalinen tasaus : alkuun; ) .categories ( leveys: 30 %; )

    Olemme tehneet html/css:n kanssa ja siirrytään nyt mielenkiintoisimpaan osaan - javasctipt-koodiin puun luomiseksi. Täällä kokoamme yhteen kaikki suunnitellut toiminnot.

    main.js - sovelluksen alustus

    Jos olet lukenut aiempia artikkeleita esimerkiksi ostoskorin luomisesta verkkokauppaan etupuolella tai upotetuista widgeteistä natiivi JavaScriptiä käyttämällä, saatat muistaa, että js-koodimallini on suunnilleen sama kaikissa tapauksissa.

    Käytetään sitä myös tässä: luodaan sulkemiseen perustuva js-moduuli, tallennetaan tarvittavat dom-elementit välimuistiin, kirjoitetaan useita yksityisiä tapoja ja yksi julkinen - sovelluksen alustusmenetelmä.

    Moduulikehys "käytä tiukkaa"; // Sovellusmoduuli var app = (function($) ( // Alusta tarvittavat muuttujat var ajaxUrl = "/php", ui = ( $categories: $("#categories"), $goods: $("#goods" ) ); // Luokkapuun alustaminen jstree-funktiolla _initTree(data) ( // ... ) // Luokkien lataaminen palvelinfunktiosta _loadData() ( // ... ) // Sovellusfunktion init() alustaminen ( _loadData( ); ) // Vie ulkopuolelta return ( init: init ) ))(jQuery); jQuery(asiakirja).ready(app.init);

    Kuten viimeisellä rivillä näkyy, kutsumme asiakirjan lataamisen jälkeen menetelmää app.init(), joka puolestaan ​​lataa tiedot palvelimelta ja välittää ne puun luontimenetelmälle. AjaxUrl:iin kirjoitamme palvelimemme komentosarjan osoitteen; kaksi dom-elementtiä tallennetaan välimuistiin ui-objektiin.

    Tietojen vastaanottaminen palvelimelta - menetelmä _loadData() // Ladataan luokkia palvelinfunktiosta _loadData() ( var params = ( toiminta: "get_categories" ); $.ajax(( url: ajaxUrl, menetelmä: "GET", tiedot: params, dataType: "json", success: function(resp) ( // Alusta luokkapuu if (resp.code === "success") ( _initTree(resp.result); ) else ( console.error("Virhe" tietojen vastaanottaminen palvelimelta: ", resp.message); ) ), error: function(error) ( console.error("Virhe: ", error); ) )); )

    Täällä kirjoitetaan yleisin Ajax-pyyntö palvelimen komentosarjaan, vastaanotetaan dataa luokkien kanssa ja, jos onnistuu, välitetään se puun alustusfunktiolle _initTree(). Muistamme, että saamme tiedot palvelimelta json-muodossa, joten ilmoitamme välittömästi datatyypin: "json". Ja tarvittavat tiedot tulevat tuloskenttään, joten välitämme täsmälleen resp.resultin _initTreelle. Voit käsitellä virheitä haluamallasi tavalla; esimerkiksi heitämme ne vain konsoliin.

    Puun rakentaminen _initTree-funktiossa jstree-funktiolla // Luokkapuun alustaminen jstree-funktiolla _initTree(data) ( ui.$categories.jstree(( core: ( check_callback: true, multiple: false, data: data ), lisäosat: [" dnd"] )).bind("changed.jstree", function(e, data) ( var kategoria = data.node.text; ui.$goods.html("Tuotteet kategoriasta " + kategoria); konsoli. loki( "solmun tiedot: ", data); )); )

    Ja siinä kaikki mitä tarvitset! Visuaalisesti sovelluksen monimutkaisin osa näyttää törkeän yksinkertaiselta. Sinun tarvitsee vain soveltaa jstree-menetelmää joillakin parametreilla tiettyyn dom-elementtiin. Meidän tapauksessamme välitämme itse datan tietokenttään, multiple: false tarkoittaa, että emme tarvitse monivalintaa, ja check_callback: true tarkoittaa, että haluamme tehdä jotain muuta puun muuttamisen jälkeen.

    Lisäosat-kentässä luetellaan haluamasi pullat taulukossa. Keskitytään dnd:hen - vedä ja pudota - lisää mahdollisuus muuttaa puurakennetta hiirellä. Tämä on erittäin kätevä asia, mutta ei vielä toimiva. Voit leikkiä puulla selaimessa niin paljon kuin haluat, mutta sivun päivityksen jälkeen näemme vanhan hakemistorakenteen. Tämä on järkevää, koska tiedot otetaan palvelimelta, emmekä ole kirjoittaneet koodia mysql:n päivittämiseksi asiakastapahtumiin. Yksi seuraavista artikkeleista on omistettu tälle, mutta toistaiseksi leikitään siirtämällä luokkia hiirellä selaimessa.

    Ja lopuksi sidosmenetelmää käyttämällä yhdistämme puun muutostapahtuman johonkin hyödylliseen toimintoon. Esimerkissämme näytämme yksinkertaisesti merkinnän kategorian nimellä, mutta todellisessa sovelluksessa kannattaa vetää tuotelista palvelimelta. Mistä kategoria = data.node.text tuli? Avaa selainkonsoli ja katso, mitä muuta tietoa valitusta solmusta on saatavilla.

    Kaikki yhteensä

    Tässä artikkelissa emme rakentaneet täysimittaista luetteloa verkkokaupan pitämiseen - se ei ollut idea. Halusin keskittyä siihen, kuinka rakentaa niin hyödyllinen rakenne kuin puu mahdollisimman yksinkertaisesti alusta loppuun. Jotkut kohdat jätettiin tarkoituksella pois, nimittäin tiiviimpi työ itse puun kanssa ja asiakastoimintojen synkronointi palvelimen kanssa sekä tuoteluettelon luominen, kun napsautat luokkaa. Julkaisen erillisen artikkelin ensimmäisestä vaihtoehdosta.

    PÄIVITETTY: Olen julkaissut artikkelin, joka näyttää, kuinka yksittäisiä puuelementtejä siirretään hiirellä vedä ja pudota -menetelmällä ja synkronoidaan nämä tiedot palvelimen kanssa. Pieni koodi asiakkaalle ja palvelimelle - ja voila! Linkki löytyy alapuolelta numerosta 4.

    Ja niin aluksi kuvailen, minkä kanssa työskentelemme ja mitä tarvitsemme.
    Järjestelmä: PHP 5 ja uudemmat, mySQL 4 ja uudemmat
    Apeluokat: dbsql.class.php (luokka tietokannan kanssa työskentelemiseen)
    Sisäkkäisten luokkien luokka: classTreeCategory.php (suoraan pääluokka, alla on sen luettelo ja selitykset.

    Luomme tietokantaan taulukon seuraavalla rakenteella:

    Katso koodi MYSQL

    Tämä taulukko sisältää ID-kentän - luokan sarjanumeron, podcat - arvo on nolla ensimmäisen asteen luokille tai pääluokan tunnus, nimi - luokan nimi.

    Esimerkki luokan toiminnasta, joka näyttää luokat luettelossa alakategorioiden kanssa:

    Katso koodi PHP

    include ("dbsql.class.php" ) ; include ("classTreeCategory.php" ) ; $DB = new DB_Engine("mysql" , $asetukset [ "dbHost" ] , $asetukset [ "dbUser" ] , $asetukset [ "dbPass" ] , $asetukset [ "dbName" ] ) ; // muodostaa yhteys tietokantaan, mikä osoittaa pääsytiedot $category = new TreeCategory ($DB ) ; // siirry luokkaluokkaan, tietokannan kanssa työskentelyyn tarkoitettu objekti $category -> table = "category" ; // taulukon nimi tietokannassa kategorioilla $array = $category -> getCategory () ; // saada kaikki luokat tietokannasta monitasoisen taulukon muodossa, lajiteltuna ja sisäkkäin siinä järjestyksessä kuin tarvitsemme $category -> outCategory ($array, "optio" ) ; // luokkien tulosteen valmistelu (HTML:n muodostaminen), taulukon välittäminen kategorioilla echo $category -> html ; // tulostaa luokat HTML-nimenä

    Kuten yllä olevasta esimerkistä näet, kaikki on erittäin yksinkertaista, luomme uuden $category-objektin, asetamme minkä tietokantataulukon kanssa työskentelemme: 'category', sitten saamme taulukosta luettelon kaikista luokista, jotka on jo muotoiltu taulukkoon ja järjestetty hierarkkiseen järjestykseen kaikki alaluokat huomioon ottaen. sitten välitämme taulukon outCategory()-metodille, joka luo meille valmiin HTML-koodin, joka meidän tarvitsee vain näyttää selaimessa.

    OutCategory()-menetelmä, kuten näemme, ottaa kaksi parametria @array ja @string ensimmäisessä parametrissa taulukon, jossa on kaikki luokat, ja toisessa rivin, joka sisältää vaihtoehdon tai taulukon arvon, tämä arvo osoittaa, minkä tyyppistä HTML-koodia tarvitaan. synnytettäväksi.
    vaihtoehdon arvo

    Katso koodi HTML

    -luokka 1 --alaluokka 1 ---alaluokka 1 -luokka 2

    Tämän HTML-koodin lisääminen minkä tahansa lomakkeen valintakenttään.

    Taulukon arvo luo seuraavan HTML-koodin:

    Katso koodi HTML

    Tämä HTML-koodi on kätevä lisätä taulukkoon, joka näyttää kaikki luokat ja alaluokat.

    Luokassa on myös seuraavat menetelmät:
    deleteItem($id); — poistaa yhden kategorian sisäkkäisistä huolimatta
    delCategory($array, $id); — poistaa luokan, jossa on kaikki sisäkkäiset alaluokat, $array — taulukko, jossa on kaikki luokat, joka on valmistettu $category->getCategory()-menetelmällä, $id — poistettavan luokan numero
    lisää tavara(); — tämä menetelmä tulee kutsua, jos haluat lisätä kategorian, ja tämä menetelmä lukee arvot POST-menetelmällä lähetetystä tiedosta, ts. $_POST-taulukosta.
    $nimi=$this->PHP_slashes(kaistaleet($_POST['nimi'])); // Kategorian nimi
    $podcat=intval($_POST['podcat']); // Pääluokan tunnus, jos 0 on määritetty, luokka on juuressa.
    updateItem() ; — samanlainen kuin edellinen menetelmä, paitsi että tämä menetelmä päivittää luokan, sen nimen ja sisäkkäisen tason.

    table="category"; // pyyntö valita luokkaluettelo, taulukon nimi * $category->outCategory($category->getCategory()); // luokkien tulosteen valmistelu (luokkien joukon kysely) * echo $category->html; // Tulosta kategoriat HTML-nimessä * */ /** * Tyhjennä käsittelemämme taulukko * * PUDOTA TABLE, JOS ON OLEMASSA `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 ( /** * Kyselymerkkijono tietokannassa */ var $table; /** * Käyttöliittymä tietokannan kanssa työskentelemiseen */ var $DB; /** * Joukko luokkia sisäkkäisillä alakategorioilla */ var $arrayCat; / ** * Laskee automaattisesti luokan nimeä edeltävien viivojen määrän tulostettaessa */ var $countPodcat; /** * HTML-koodi luokkien tulostamiseen alakategorioilla */ var $html; /** * Saamme käyttöliittymä tietokannan kanssa työskentelyä varten ja laita se paikalliseen muuttujaan */ function __construct($DB) ( $this->DB=$DB; $this->component=$_GET["komponentti"]; ) /** * Hakee luettelon luokista, lajittelee ne ja sijoittaa ne taulukkoon, jossa on sisäkkäisiä taulukoita jne. * @return array category */ funktio getCategory () ( $all = $this->DB->getAll("SELECT * FROM `( $this->table)` ORDER BY `id` ASC"); $polku = array(); if(count($all)>0) ( foreach($all as $item): if($item["podcat "]==0)$lajittelu[$item[ "id"]]=$tuote; if($item["podcat"]>0) (if(isset($polku[$item["podcat"]]) ) ( $str="$lajittelu"; foreach( $polku[$item["podcat"]] muodossa $pitem): $rep=$item["podcat"]; $str.="[$pitem]"; endforeach; $str.="[($item["podcat"])]"; $str.="[($item["id"])]"; $str.="=$tuote;"; eval($str); foreach($polku[$item["podcat"]] $pitemina): $polku[$item["id"]]=$pitem; endforeach; $polku[$item["id"]]=$item["podcat"]; ) else ( $sort[$item["podcat"]]["sub"][$item["id"]]=$item; $polku[$item["id"]]=$item["podcat" ]; ) ) endforeach; ) $this->arrayCat=$lajittele; return $this->arrayCat; ) /** * Tulostaa luokat, sijoittaa valmiin HTML-koodin $this->html:ään * @param array Joukko luokkien ja sisäkkäisten alikategorioiden kanssa * @param string Luodun HTML-koodin tyyppi tulosteelle, valinnalle tai taulukolle */ toiminto 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--; ) ) /** * Apumenetelmä HTML-koodin valmistukseen * @param array Matriisi, jossa on luokka * @param-merkkijono Tuotoksen, vaihtoehdon tai taulukon luodun HTML-koodin tyyppi */funktio outItem($sub, $type="option", $idSel=0) ( for($i=0;$ icountPodcat;$i++) ( $out. ="-"; ) if($idSel==$sub["id"])$se="valittu"; else $se=""; if($type=="optio")$this->html.=" ($out) ($sub["nimi"]) "; if($type=="table")$this->html.= ($out) ($sub["nimi"]) HTML; ) funktio delCategory(&$a_tree,&$id=0) ( foreach($a_tree as $sub) ( if($sub["id"]$id and isset($sub["sub"]))$this- >delCategory($sub["ala"],$id); if($sub["id"]==$id) ( $sql="POISTA FROM ($this->table) WHERE id = "$id" RAJA 1"; $this->DB->execute($sql); if (isset($sub["sub"])) $this->delCategory_process($sub["ala"]); ) ) ) funktio delCategory_process (&$a_tree) ( foreach($a_tree as $sub) ( $sql="DELETE FROM ($this->table) WHERE id = "($sub["id"])" RAJA 1"; $this-> DB->execute($sql); if(isset($sub["sub"]))$this->delCategory_process($sub["sub"]); ) ) function updateItem() ( $nimi=$this- >PHP_slashes(kaistaleet($_POST["nimi"])); $podcat=intval($_POST["podcat"]); $id=intval($_POST["id"]); $sql="PÄIVITYS `( $this->table)` SET `name` = "($nimi)", `podcat` = "($podcat)" WHERE `id`="($id)" RAJA 1; "; $this->DB ->suorita($sql); ) funktio addItem() ( $nimi=$this->PHP_slashes(strip_tags($_POST["nimi"])); $podcat=intval($_POST["podcat"]); $ id=intval($_POST["id"]); $sql="INSERT INTO `($this->table)` (`id`,`podcat`,`name`) ARVOT ("", "$podcat" , "$nimi");"; $this->DB->suorita($sql); ) funktio deleteItem($id) ( $id=intval($id); $sql="DELETE FROM `($this-> table)` WHERE `id` = "($id)" RAJA 1"; $DB- >execute($sql); header("Sijainti: ?komponentti=($this->komponentti)"); )-funktio PHP_slashes($string,$type="add") (if ($type == "add") ( if (get_magic_quotes_gpc()) ( palauttaa $merkkijono; ) else ( if (function_exists("addslashes")) (palauta vinoviivat($merkkijono); ) else ( return mysql_real_escape_string($string); ) ) ) else if ($tyyppi == "kaistale") ( palauttaa vinoviivat($string); ) else ( die("virhe PHP_slashes (mixed,add | strip)"); ) ) )

    Koko luokka kirjoitettiin tunnin sisällä ja siinä on tietysti joitain puutteita, mutta tämä kaikki on korjattavissa. Sen käyttö on suositeltavaa koulutustarkoituksiin, vaikka viimeistelemällä sitä hieman voit integroida sen mihin tahansa järjestelmään ja nauttia sen työstä)).

    Olisin kiitollinen, jos ehdottaisit kommenteissa omia ratkaisujasi tähän ongelmaan - järjestämällä loputtoman pesimätason luokkia.

    Seuraava tehtävä on tehdä loputtomien sisäkkäisten luokkien PHP:n avulla. Useilla sivustoilla selattuani löysin monia ratkaisuja, mutta kaikki eivät ole ymmärrykseni saatavilla, koska... Ohjelmoinnin taso siellä on korkeampi kuin minulla. Siksi löysin yksinkertaisimman, ehkä ei eleganteimman, mutta toimivan ratkaisun.

    Katsotaan ensin, mitä minulla on tietokannassa

    • id - luokkamme tunniste
    • luokka — luokan nimi
    • category_id — pääluokan tunniste. Voisit kutsua sitä parent_id:ksi, mutta se on minulle tutumpaa
    • lvl — luokan sisäkkäistaso. Tarvitaan muodostamaan...
    • Kaikesta peitellystä ei ole sinulle hyötyä, koska... Siellä on minulle henkilökohtaisesti tarpeellista tietoa, ja olen poistanut nämä tarpeettomat tiedot, jotta en johda teitä harhaan.
    Näytetään kategoriat:

    Täällä ei ole paljon sanottavaa, jos sinulla on kysyttävää, kirjoita kommentteihin, ja niille, jotka eivät todellakaan välitä mitä täällä on kirjoitettu, suosittelen, että katsot heti tuloksen

    Jos et ymmärrä, tarvitsemme vain lvl-kentän tietokannassa, jotta tiedämme, kuinka monta "-"-merkkiä tulee laittaa kategorioiden nimien eteen. Tietenkin on olemassa kehittyneempi menetelmä ilman lvl: tä, mutta tällä hetkellä tämä on ainoa ratkaisu, joka minulla on. Heti kun asiat muuttuvat, päivitän artikkelin.

    Näytetään kategoriat:
    • Mutta tässä on toinen ratkaisu sinulle, kun sinun ei tarvitse näyttää sitä muodossa, vaan luettelossa.

      Täällä emme enää tarvitse lvl:ää, joten koodia on vähemmän. Ja alla tulos

      Se rakennetaan lisäämällä malliin Parent-tyyppinen "parent" -kenttä, joka tallentaa nykyisen tietueen ylätason tunnuksen. Juuritietueiden kohdalla tämän kentän arvo on "-1".

      Huomio! Mallissa voi olla vain yksi "parent"-tyyppinen kenttä.

      Esimerkki yksinkertaisesta puun käytöstä luotaessa alasivuvalikkoa.

      Yhdistetty puu

      Jos haluat luoda rakenteen, kuten "katalogi -> luettelo -> luettelo -> tuote" tai "albumi -> albumi -> kuva", sinun on linkitettävä malli, jossa on "emo"-kenttä toiseen malliin niin, että ensimmäisen malli on vierasavain muiden mallien tietueille.

      Esimerkki linkitetyn puun luomisesta monitasoiselle tuoteluettelolle.

      Class Catalogs laajentaa mallia ( suojattu $nimi = "Katalogiosat"; suojattu $malli_elementit = array(array("Aktiivinen", "bool", "aktiivinen", array("on_create" => true)), array("Nimi" , "merkki", "nimi", array("pakollinen" => true)), array("Katalogi", "parent", "parent", array("parent_for" => "Tuotteet")), array(" Linkki", "url", "url"), array("Sijainti", "järjestys", "järjestys")); ) luokka Tuotteet laajentaa mallia ( suojattu $nimi = "Katalogituotteet"; suojattu $mallin_elementit = array(array) ("Active", "bool", "active", array("on_create" => true)), array("Nimi", "merkki", "nimi", array("pakollinen" => tosi)), array ("Katalogiosio", "enum", "parent", array("foreign_key" => "Calogs", "is_parent" => true)), array("Price", "int", "price", array( "pakollinen" => true)), array("Kuvat", "multi_images","images"), array("Kuvaus", "teksti", "desc", array("rich_text" => true)), array ("Sijainti", "järjestys", "järjestys")); )

      Erityiset puumenetelmät

      Vanhempien ja lasten nopeaa pääsyä varten puussa on erityisiä menetelmiä.

      • getParents($id) - palauttaa joukon ylätason tietueita (enintään tietueeseen, jonka ylätason kentän arvo on -1). Tuloksena olevassa taulukossa avaimet ovat tietueiden tunnukset, arvot tietueiden nimet "$name_field" -parametrin mukaan mallin asettaminen -osiosta.
      • getChildren($id) - palauttaa joukon kaikkia alitietueita, jotka kulkevat rekursiivisesti kaikkien puun oksien läpi. Tuloksena oleva taulukko muodostetaan samalla tavalla kuin edellinen menetelmä.
      • displayBreadcrumbs($id, $url_first [, $url_field]) - näyttää viitepolun syötetylle tunnisteelle. Palauttaa html-tunnisteiden sarjan muodossa
        "linkki -> linkki -> linkki -> span". Syöttöparametrit: nykyisen viestin id, $url_first - URL-osoitteen ensimmäinen osa,
        valinnainen parametri $url_field - sen kentän nimi, johon tämän merkinnän tekstilinkki on tallennettu (URL-osoitteen muodostamiseksi, kuten "catalog/toys/"). Esiasennetussa "Pages"-mallissa linkit rakennetaan automaattisesti muotoon "/page/4/" ja "/contacts/" (ilman ensimmäistä osaa).
      $catalog = $mv -> luettelot -> findRecordById(43); //Välitietueet $parents = $mv -> luettelot -> getParents($catalog -> id); //Lapsimerkinnät $lapset = $mv -> luettelot -> getChildren($catalog -> id); //Katalogiosion viitepolku echo $mv -> catalogs -> displayBreadcrumbs($catalog -> id, "category", "url"); //Katalogituotteen viitepolku echo $mv -> tuotteet -> displayBreadcrumbs($product -> id, "category"); //Viitepolku on muodossa Toys Balls Ball red