Kategorie PHP (Strom kategorií). Plně využíváme podmínku if. Bezcitná kategorie php

A tak pro začátek popíšu, s čím budeme pracovat a co budeme potřebovat.
Systém: PHP 5 a vyšší, mySQL 4 a vyšší
Pomocné třídy: dbsql.class.php (třída pro práci s databází)
Třída vnořených kategorií: classTreeCategory.php (přímo hlavní třída, níže je její výpis a vysvětlení.

V databázi vytvoříme tabulku s následující strukturou:

Zobrazit kód MYSQL

Tato tabulka obsahuje pole ID - pořadové číslo kategorie, podcat - má hodnotu nula pro kategorie prvního řádu nebo ID nadřazené kategorie, název - název kategorie.

Příklad fungování třídy, zobrazení kategorií v seznamu s podkategoriemi:

Zobrazit kód PHP

include ("dbsql.class.php" ); include ("classTreeCategory.php" ) ; $DB = new DB_Engine("mysql" , $settings [ "dbHost" ] , $settings [ "dbUser" ] , $settings [ "dbPass" ] , $settings [ "dbName" ] ) ; // připojení k databázi s uvedením přístupových údajů $category = new TreeCategory ($DB ) ; // předání třídě category, objektu pro práci s databází $category -> table = "category" ; // název tabulky v databázi s kategoriemi $array = $category -> getCategory () ; // získáme všechny kategorie z databáze ve formě víceúrovňového pole, setříděné a vnořené v pořadí, v jakém potřebujeme $category -> outCategory ($array, "option" ) ; // příprava výstupu kategorií (tvorba HTML), předání pole s kategoriemi echo $category -> html ; // výstupní kategorie jako HTML název

Jak můžete vidět z výše uvedeného příkladu, vše je velmi jednoduché, vytvoříme nový objekt $category, nastavíme, se kterou databázovou tabulkou pracujeme: 'category', poté z tabulky získáme seznam všech kategorií již zformátovaných jako pole a uspořádány v hierarchickém pořadí s přihlédnutím ke všem podkategoriím. pak pole předáme metodě outCategory(), která nám vygeneruje hotový HTML kód, který nám stačí zobrazit v prohlížeči.

Jak vidíme, metoda outCategory() přebírá dva parametry @array a @string, v prvním parametru pole se všemi kategoriemi a ve druhém řádku obsahující hodnotu volby nebo tabulky, tato hodnota udává, jaký typ kódu HTML potřebuje. být generován.
hodnotu opce

Zobrazit kód HTML

-kategorie 1 --podkategorie 1 ---podkategorie 1 -kategorie 2

Chcete-li vložit tento kód HTML do pole výběru libovolného formuláře.

Hodnota tabulky generuje následující HTML kód:

Zobrazit kód HTML

Tento HTML kód je vhodný pro vložení do tabulky, která zobrazuje všechny naše kategorie a podkategorie.

Třída má také následující metody:
deleteItem($id); — odstraní jednu kategorii, navzdory vnořeným kategoriím
delCategory($pole, $id); — smaže kategorii se všemi vnořenými podkategoriemi, $array — pole se všemi kategoriemi připravenými metodou $category->getCategory(), $id — číslo kategorie, která má být smazána
přidat položku(); — tato metoda by se měla volat, pokud chcete přidat kategorii a tato metoda čte hodnoty z dat přenášených metodou POST, tzn. z pole $_POST.
$name=$this->PHP_slashes(strip_tags($_POST[‘název’])); // Název Kategorie
$podcat=intval($_POST['podcat']); // ID nadřazené kategorie, pokud je zadáno 0, bude kategorie v kořenu.
updateItem() ; — podobná předchozí metodě s tím rozdílem, že tato metoda aktualizuje kategorii, její název a úroveň vnoření.

table="category"; // požadavek na výběr seznamu kategorií, název tabulky * $category->outCategory($category->getCategory()); // příprava výstupu kategorií (dotazování na pole kategorií) * echo $category->html; // výstupní kategorie v HTML názvu * */ /** * Vypíše tabulku, se kterou pracujeme * * 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 ( /** * Řetězec dotazu v databázi */ var $table; /** * Rozhraní pro práci s databází */ var $DB; /** * Pole kategorií s vnořenými podkategoriemi */ var $arrayCat; / ** * Při výstupu automaticky spočítat počet pomlček před názvem kategorie */ var $countPodcat; /** * HTML kód pro výstup kategorií s podkategoriemi */ var $html; /** * Dostaneme rozhraní pro práci s databází a vložit ji do lokální proměnné */ funkce __construct($DB) ( $this->DB=$DB; $this->component=$_GET["komponent"]; ) /** * Získá seznam kategorií, seřadí je a umístí je do pole s vnořenými poli atd. * @return kategorie pole */ funkce getCategory () ( $all = $this->DB->getAll("SELECT * FROM `( $this->table)` ORDER BY `id` ASC"); $cesta = pole(); if(count($all)>0) ( foreach($all as $item): if($item["podcat "]==0)$sort[$item[ "id"]]=$item; if($item["podcat"]>0) ( if(isset($path[$item["podcat"]]) ) ( $str="$sort"; foreach( $path[$item["podcat"]] jako $pitem): $rep=$item["podcat"]; $str.="[$pitem]"; endforeach; $str.="[($item["podcat"])]"; $str.="[($item["id"])]"; $str.="=$položka;"; eval($str); foreach($path[$item["podcat"]] jako $pitem): $cesta[$item["id"]]=$pitem; endforeach; $cesta[$item["id"]]=$položka["podcat"]; ) else ( $sort[$item["podcat"]]["sub"][$item["id"]]=$item; $path[$item["id"]]=$item["podcat" ]; ) ) endforeach; ) $this->arrayCat=$sort; return $this->arrayCat; ) /** * Vytiskne kategorie, umístí hotové HTML do $this->html * @param pole Pole s kategoriemi a vnořenými podkategoriemi * @param string Typ generovaného HTML kódu pro výstup, možnost nebo tabulku */ funkce 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--; ) ) /** * Pomocná metoda pro přípravu HTML kódu * @param pole Pole s kategorií * @param string Typ generovaného HTML kódu pro výstup, možnost nebo tabulku */ funkce outItem($sub, $type="option", $idSel=0) ( for($i=0;$ icountPodcat;$i++) ( $out. ="-"; ) if($idSel==$sub["id"])$se="selected"; jinde $se=""; if($type=="volba")$this->html.=" ($out) ($sub["jméno"]) "; if($type=="table")$this->html.= ($out) ($sub["name"]) HTML; ) funkce delCategory(&$a_tree,&$id=0) ( foreach($a_tree jako $sub) ( if($sub["id"]$id a 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"]); ) ) ) funkce 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"]); ) ) funkce updateItem() ( $name=$this- >PHP_slashes(strip_tags($_POST["name"])); $podcat=intval($_POST["podcat"]); $id=intval($_POST["id"]); $sql="AKTUALIZACE `( $this->table)` SET `name` = "($name)", `podcat` = "($podcat)" WHERE `id`="($id)" LIMIT 1; "; $this->DB ->execute($sql); ) funkce addItem() ( $name=$this->PHP_slashes(strip_tags($_POST["name"])); $podcat=intval($_POST["podcat"]); $ id=intval($_POST["id"]); $sql="INSERT INTO `($this->table)` (`id`,`podcat`,`name`) VALUES ("", "$podcat" , "$jméno");"; $this->DB->execute($sql); ) funkce deleteItem($id) ( $id=intval($id); $sql="DELETE FROM `($this->table)` WHERE `id` = "($id)" LIMIT 1"; $DB- >execute($sql); header("Umístění: ?component=($this->component)"); ) funkce PHP_slashes($string,$type="add") ( if ($type == "add") ( if (get_magic_quotes_gpc()) ( return $string; ) else ( if (function_exists("addslashes")) ( return addlashes($string); ) else ( return mysql_real_escape_string($string); ) ) ) else if ($type == "strip") ( return stripslashes($string); ) else ( die("error in PHP_slashes (mixed,add | strip)"); ) ) )

Celá hodina byla napsána během hodiny a má samozřejmě nějaké nedostatky, ale tohle je vše opravitelné. Jeho použití je vhodné pro vzdělávací účely, i když po jeho malém dokončení jej můžete integrovat do jakéhokoli systému a užívat si jeho práci)).

Byl bych vděčný, kdybyste v komentářích navrhli vlastní řešení tohoto problému - organizování kategorií nekonečné úrovně hnízdění.

Dnes je naším cílem vytvořit hierarchickou strukturu kategorií. Je pro nás důležité, aby bylo pohodlné ukládat kategorie a bylo snadné je zobrazit tam, kde je potřebujeme.

Někdy se jednoduché věci zdají komplikované, a proto zveřejním několik fragmentů kódu, které vám, jak doufám, budou užitečné pro implementaci kategorií PHP ve formě stromu.

Struktura by se tedy měla skládat z id kategorie (id), názvu kategorie (name) a samozřejmě id nadřazené kategorie (id_rodiče). V MySQL to vypadá takto:

VYTVOŘIT TABULKU, POKUD NEEXISTUJE `kategorie` (`id` int(10) nepodepsané NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `parent_id` int(11) NOT NULL, PRIMÁRNÍ KLÍČ (`id`)) ENGINE =InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;

Minimální a přehledná struktura tabulky pro ukládání kategorií.

INSERT INTO `category` (`id`, `name`, `parent_id`) VALUES (1, "Telefony a tablety", "0"), (2, "Auta", "0"), (3, "Samsung" ", "1"), (4, "Apple", "1"), (5, "LG", "1"), (6, "Ford", "2"), (7, "Lexus", "2"), (8, "BMW", "2"), (9, "Galaxy Tab 4", "3"), (10, "Galaxy S6", "3");

Pokud je hodnota parent_id=0, tato kategorie nemá nadřazenou kategorii.

Vše je zde jasné a jednoduché. Nyní se pustíme do zobrazení seznamu kategorií. Abychom však seznam správně zobrazili, musíme nejprve získat celý seznam kategorií PHP a teprve poté pomocí rekurze vytvořit náš strom. K získání tohoto seznamu je navržena následující funkce:

Funkce get_cat() ( //dotaz databáze $sql = "SELECT * FROM kategorie"; $result = mysql_query($sql); if(!$result) ( return NULL; ) $arr_cat = array(); if( mysql_num_rows( $result) != 0) ( //V cyklu vytvoříme pole pro ($i = 0; $i< mysql_num_rows($result);$i++) { $row = mysql_fetch_array($result,MYSQL_ASSOC); //Формируем массив, где ключами являются адишники на родительские категории if(empty($arr_cat[$row["parent_id"]])) { $arr_cat[$row["parent_id"]] = array(); } $arr_cat[$row["parent_id"]] = $row; } //возвращаем массив return $arr_cat; } }

//získání pole adresáře $result = get_cat();

Nyní potřebujeme funkci s rekurzí

Funkce view_cat($arr,$parent_id = 0) ( //Podmínky pro ukončení rekurze if(empty($arr[$parent_id])) ( return; ) echo "

    "; // procházejte pole a zobrazte jej na obrazovce pro ($i = 0; $i< count($arr[$parent_id]);$i++) { echo "
  • " .$arr[$parent_id][$i]["name"]."; //rekurze – zkontrolujte, zda existují nějaké podřízené kategorie view_cat($arr,$arr[$parent_id][$i]["id" ]); echo"
  • ";) echo"
"; }

Nyní zbývá pouze zobrazit adresář na obrazovce pomocí rekurzivní funkce

View_cat($result);

A to je obecně vše. Tímto způsobem můžeme získat kompletní strom kategorií s nekonečnými podkategoriemi.

Poměrně častým zmatkem při vývoji tématu pro WordPress je, jak používat konstruktor podmínky if else, jak je správně nastavit a jak je obecně používat ve WordPressu. Aby se miliony uživatelů nezbláznily při hledání řešení, vytvořil WordPress takříkajíc podmíněné značky, o jejichž použití bude dnes řeč.

Konstrukce standardního stavu vypadá takto:

Na jednu stranu je vše jasné, ale na druhou je otázka, jak správně formulovat podmínku, aby WordPress pochopil, co od toho chceme :) pojďme na to:

1. Domovská stránka

Často chceme, aby se určité informace zobrazovaly pouze na hlavní stránce. Chcete-li to vyřešit, můžete vytvořit soubor home.php ve složce motivu nebo přidat do souboru index.php následující podmínku:

....Zde zobrazujeme informace, které chceme vidět na hlavní stránce

2. Kontrola rubrik

Stanovme si následující podmínku: Pokud jsme v sekci WordPress, zobrazíme frázi „Vítejte, WordPress!“ a pokud ne, pak frázi „Vítejte na našem webu!“

/*U takového schématu je to možné*/

"Vítejte, WordPress!"

Vítejte na našich stránkách!"

Dále budu id používat jako identifikátor pro kategorii (tag) nebo příspěvek (stránku) – najdete jej v ovládacím panelu webu. Pokud píšete podmínky pro kategorie (tagy), tak se podívejte na id na stránce kategorie (tagu) a pokud píšete příspěvky (stránky), tak na stránce všech příspěvků (stránek)... panika. Jak to zjistíte? - viz obrázek:

A další trik 🙂 řekněme, že potřebujeme podmínku pro kontrolu několika kategorií, pak budou podmínky vypadat takto:

vydejme, co potřebujeme

3. Zkontrolujte značky

Tagy jsou skvělým klasifikátorem v rámci kategorií. Zvažte několik příkladů, jak je můžete zkontrolovat.

Úkol: Pokud je příspěvek označen jako „plugin“, pak zobrazte frázi – WordPress Plugin

Úkol: Pokud jsme na stránce tagu „plugin“, zobrazte frázi – Kolekce pluginů WordPress.

Poznámka: Při práci s podmínkami štítku je lepší použít štítek spíše než jeho identifikátor.

Závěr

Pokryl jsem základní podmíněné značky, pokud máte nějaké dotazy, zeptejte se jich v komentářích! Šťastné používání!

Stromové zobrazení podkategorií kategorií poskytuje uživatelsky přívětivý způsob, jak vypsat nadřazené a podřízené kategorie. Kategorie a jejich podkategorie jsou snadno odděleny stromovou strukturou. Stromové zobrazení kategorií se vždy doporučuje pro zobrazení nekonečné úrovně kategorií a podkategorií.

V tomto tutoriálu vám ukážeme, jak vytvořit dynamický strom podkategorií kategorií pomocí PHP a MySQL. Rekurzivní strom kategorií je velmi užitečný pro seznam n kategorií úrovní v rozevíracím seznamu. Ukázkový kód vám pomůže vytvořit rozevírací seznam podkategorií kategorie n úrovně v PHP. Data dynamických kategorií budou načtena z databáze MySQL a uvedena ve formátu stromu kategorií rodič-dítě.

Vytvořte tabulku databáze

Pro ukládání kategorií a podkategorií je potřeba v databázi vytvořit tabulku. Následující SQL vytvoří tabulku kategorií v databázi MySQL.

CREATE TABLE `categories ` (`id` int (11) NOT NULL AUTO_INCREMENT, `parent_id` int (11) NOT NULL DEFAULT "0" , `name` varchar (100 ) COLLATE utf8_unicode_ci NOT NULL, `created` date NOT NULL `modified` datetime NOT NULL , `status` enum("1" ,"0" ) COLLATE utf8_unicode_ci NOT NULL DEFAULT "1" KOMENTÁŘ "1:Aktivní, 0:Neaktivní" , PRIMÁRNÍ KLÍČ (`id` )) ENGINE= InnoDB DEFAULT CHARSET= utf8 COLLATE= utf8_unicode_ci;

Sloupec parent_id určuje, zda je kategorie nadřazená nebo podřízená. Pokud je parent_id 0, bude to nadřazená kategorie. V opačném případě se bude jednat o podřízenou kategorii a ID je nadřazenou kategorií této kategorie.

Konfigurace databáze (dbConfig.php)

K připojení a výběru databáze slouží soubor dbConfig.php. Zadejte hostitele databáze ($dbHost), uživatelské jméno ($dbUsername), heslo ($dbPassword) a jméno ($dbName) podle vašich pověření MySQL.

Rekurzivní funkce PHP pro generování nadřazeného/podřízeného stromu

Funkce categoryTree() generuje strom podkategorií kategorie n úrovně pomocí PHP. Vytvoří rozevírací možnosti pro strom kategorií.

  • $parent_id – volitelné. Chcete-li získat podřízené kategorie této nadřazené kategorie, zadejte ID rodiče.
  • $sub_mark – volitelné. Označte, že se připojí na začátek názvu podřízené kategorie.