หมวดหมู่คนไร้บ้าน php.ini การสร้างแผนผังหมวดหมู่ใน PHP

อันดับแรก ฉันจะอธิบายว่าเราจะทำงานด้วยอะไรและเราต้องการอะไร
ระบบ: PHP 5 ขึ้นไป, mySQL 4 ขึ้นไป
คลาสเสริม: dbsql.class.php (คลาสสำหรับการทำงานกับฐานข้อมูล)
คลาสของหมวดหมู่ที่ซ้อนกัน: classTreeCategory.php (โดยตรงคือคลาสหลัก ด้านล่างคือรายการและคำอธิบาย

เราสร้างตารางในฐานข้อมูลด้วยโครงสร้างดังต่อไปนี้:

ดูโค้ด MySQL

ตารางนี้ประกอบด้วยฟิลด์ ID - หมายเลขซีเรียลของหมวดหมู่, podcat - มีค่าเป็นศูนย์สำหรับหมวดหมู่ลำดับที่หนึ่งหรือ ID ของหมวดหมู่หลัก, ชื่อ - ชื่อของหมวดหมู่

ตัวอย่างวิธีการทำงานของชั้นเรียน โดยแสดงหมวดหมู่ในรายการที่มีหมวดหมู่ย่อย:

ดูโค้ด PHP

รวม ("dbsql.class.php" ) ; รวม ("classTreeCategory.php" ) ; $DB = new DB_Engine("mysql" , $settings [ "dbHost" ] , $settings [ "dbUser" ] , $settings [ "dbPass" ] , $settings [ "dbName" ] ) ; // เชื่อมต่อกับฐานข้อมูล โดยระบุข้อมูลการเข้าถึง $category = new TreeCategory ($DB ) ; // ส่งผ่านไปยังคลาสหมวดหมู่ซึ่งเป็นวัตถุสำหรับทำงานกับฐานข้อมูล $category -> table = "category" ; // ชื่อของตารางในฐานข้อมูลที่มีหมวดหมู่ $array = $category -> getCategory () ; // รับหมวดหมู่ทั้งหมดจากฐานข้อมูลในรูปแบบของอาร์เรย์หลายระดับ เรียงลำดับและซ้อนกันตามลำดับที่เราต้องการ $category -> outCategory ($array, "option" ) ; // เตรียมผลลัพธ์ของหมวดหมู่ (สร้าง HTML) ส่งอาร์เรย์ที่มีหมวดหมู่ echo $category -> html ; // หมวดหมู่เอาต์พุตเป็นชื่อ HTML

ดังที่คุณเห็นจากตัวอย่างข้างต้น ทุกอย่างง่ายมาก เราสร้างออบเจ็กต์ $category ใหม่ ตั้งค่าตารางฐานข้อมูลที่เรากำลังทำงานด้วย: 'category' จากนั้นเราจะได้รายการหมวดหมู่ทั้งหมดที่มีการจัดรูปแบบเป็น อาร์เรย์และจัดเรียงตามลำดับชั้นโดยคำนึงถึงหมวดหมู่ย่อยทั้งหมด จากนั้นเราจะส่งอาร์เรย์ไปยังเมธอด outCategory() ซึ่งจะสร้างโค้ด HTML สำเร็จรูปให้เรา ซึ่งเราต้องแสดงในเบราว์เซอร์เท่านั้น

ตามที่เราเห็น เมธอด outCategory() จะใช้พารามิเตอร์สองตัว @array และ @string ในพารามิเตอร์ตัวแรกกับอาร์เรย์ที่มีทุกหมวดหมู่ และในพารามิเตอร์ตัวที่สองคือบรรทัดที่มีตัวเลือกหรือค่าตาราง ค่านี้จะระบุประเภทของโค้ด HTML ที่ต้องใช้ ที่จะถูกสร้างขึ้น
ค่าตัวเลือก

ดูโค้ด HTML

-หมวดที่ 1 --หมวดย่อย 1 ---หมวดย่อย 1 -หมวด 2

หากต้องการแทรกโค้ด HTML นี้ลงในช่องเลือกของแบบฟอร์มใดๆ

ค่าตารางสร้างโค้ด HTML ต่อไปนี้:

ดูโค้ด HTML

โค้ด HTML นี้สะดวกสำหรับการแทรกลงในตารางที่แสดงหมวดหมู่และหมวดหมู่ย่อยทั้งหมดของเรา

ชั้นเรียนยังมีวิธีการดังต่อไปนี้:
ลบรายการ($id); — ลบหนึ่งหมวดหมู่ แม้ว่าจะเป็นหมวดหมู่ที่ซ้อนกันก็ตาม
delCategory($อาร์เรย์, $id); — ลบหมวดหมู่ที่มีหมวดหมู่ย่อยที่ซ้อนกันทั้งหมด, $array — อาร์เรย์ที่มีหมวดหมู่ทั้งหมดจัดทำโดยวิธี $category->getCategory(), $id — จำนวนของหมวดหมู่ที่จะลบ
เพิ่มรายการ(); — ควรเรียกวิธีนี้หากคุณต้องการเพิ่มหมวดหมู่และวิธีนี้จะอ่านค่าจากข้อมูลที่ส่งโดยวิธี POST เช่น จากอาร์เรย์ $_POST
$name=$this->PHP_slashes(strip_tags($_POST['ชื่อ'])); // ชื่อหมวดหมู่
$podcat=intval($_POST['พอดแคต']); // ID ของหมวดหมู่หลัก หากระบุ 0 หมวดหมู่จะอยู่ที่รูท
อัพเดตรายการ() ; — คล้ายกับวิธีก่อนหน้า ยกเว้นว่าวิธีนี้จะอัปเดตหมวดหมู่ ชื่อ และระดับการซ้อน

ตาราง = "หมวดหมู่"; // ขอเลือกรายการหมวดหมู่ ชื่อตาราง * $category->outCategory($category->getCategory()); // เตรียมผลลัพธ์ของหมวดหมู่ (สอบถามอาร์เรย์ของหมวดหมู่) * echo $category->html; // หมวดหมู่เอาท์พุตในชื่อ HTML * */ /** * ดัมพ์ตารางที่เรากำลังดำเนินการด้วย * * วางตารางหากมี `หมวดหมู่`; * สร้างตาราง `หมวดหมู่` (* `id` int(11) ไม่เป็นโมฆะ auto_increase, * `podcat` int(11) ไม่เป็นโมฆะ, * `ชื่อ` varchar(255) ไม่เป็นโมฆะ, * คีย์หลัก (`id`), * คีย์ `id` (`id`) *) เครื่องยนต์ = อักขระเริ่มต้นของ MyISAM = utf8; * */ class TreeCategory ( /** * สตริงการสืบค้นในฐานข้อมูล */ var $table; /** * อินเทอร์เฟซสำหรับการทำงานกับฐานข้อมูล */ var $DB; /** * อาร์เรย์ของหมวดหมู่ที่มีหมวดหมู่ย่อยที่ซ้อนกัน */ var $arrayCat; / ** * นับจำนวนขีดกลางก่อนชื่อหมวดหมู่อัตโนมัติเมื่อส่งออก */ var $countPodcat; /** * รหัส HTML สำหรับส่งออกหมวดหมู่ด้วยหมวดหมู่ย่อย */ var $html; /** * เราได้รับ อินเตอร์เฟสสำหรับทำงานกับฐานข้อมูลและใส่ไว้ในตัวแปรท้องถิ่น */ function __construct($DB) ( $this->DB=$DB; $this->component=$_GET["component"]; ) /** * รับรายการหมวดหมู่ จัดเรียงและวางไว้ในอาร์เรย์ที่มีอาร์เรย์ซ้อนกัน ฯลฯ * @return array category */ function getCategory () ( $all = $this->DB->getAll("SELECT * FROM `( $this->table)` เรียงลำดับตาม `id` ASC"); $path = array(); if(count($all)>0) ( foreach($all as $item): if($item["podcat "]==0)$sort[$item[ "id"]]=$item; if($item["podcat"]>0) ( if(isset($path[$item["podcat"]]) ) ( $str="$sort"; foreach( $path[$item["podcat"]] as $pitem): $rep=$item["podcat"]; $str.="[$รายการ]"; สิ้นสุด; $str.="[($item["podcat"])]"; $str.="[($item["id"])]"; $str.="=$item;"; ประเมิน($str); foreach($path[$item["podcat"]] as $pitem): $path[$item["id"]]=$pitem; สิ้นสุด; $path[$item["id"]]=$item["podcat"]; ) อื่น ๆ ( $sort[$item["podcat"]]["sub"][$item["id"]]=$item; $path[$item["id"]]=$item["podcat" ]; ) ) สิ้นสุดการเข้าถึง; ) $this->arrayCat=$sort; กลับ $this->arrayCat; ) /** * พิมพ์หมวดหมู่ วาง HTML ที่เสร็จแล้วไว้ใน $this->html * @param array อาเรย์พร้อมหมวดหมู่และหมวดหมู่ย่อยที่ซ้อนกัน * @param string ประเภทของโค้ด HTML ที่สร้างขึ้นสำหรับเอาต์พุต ตัวเลือก หรือตาราง */ function 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--; ) ) /** * วิธีการเสริมสำหรับการเตรียมโค้ด HTML * @param array อาร์เรย์ที่มีหมวดหมู่ * สตริง @param ประเภทของโค้ด HTML ที่สร้างขึ้นสำหรับเอาต์พุต ตัวเลือก หรือตาราง */ function outItem($sub, $type="option", $idSel=0) ( for($i=0;$ icountPodcat;$i++) ( $ออก ="-"; ) if($idSel==$sub["id"])$se="selected"; อย่างอื่น $se=""; if($type=="option")$this->html.=" ($out) ($sub["name"]) "; if($type=="table")$this->html.= ($out) ($sub["name"]) HTML; ) ฟังก์ชั่น 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" จำกัด 1"; $this->DB->execute($sql); if (isset($sub["sub"])) $this->delCategory_process($sub["sub"]); ) ) ) ฟังก์ชัน 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"]); ) ) ฟังก์ชั่น updateItem() ( $name=$this- >PHP_slashes(strip_tags($_POST["name"])); $podcat=intval($_POST["podcat"]); $id=intval($_POST["id"]); $sql="UPDATE `( $this->table)` SET `name` = "($name)", `podcat` = "($podcat)" โดยที่ `id`="($id)" จำกัด 1; "; $this->DB ->execute($sql); ) ฟังก์ชั่น 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`) ค่า ("", "$podcat" , "$ชื่อ");"; $this->DB->execute($sql); ) ฟังก์ชั่น DeleteItem($id) ( $id=intval($id); $sql="DELETE FROM `($this->table)` WHERE `id` = "($id)" LIMIT 1"; $DB- >execute($sql); header("Location: ?component=($this->component)"); ) ฟังก์ชั่น 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 == "strip") ( return stripslashes($string); ) else ( die("error in PHP_slashes (mixed,add | strip)"); ) ) )

ทั้งชั้นเรียนเขียนได้ภายในหนึ่งชั่วโมงและแน่นอนว่ามีข้อบกพร่องอยู่บ้าง แต่ข้อนี้สามารถแก้ไขได้ทั้งหมด แนะนำให้ใช้เพื่อวัตถุประสงค์ทางการศึกษาแม้ว่าจะทำให้เสร็จเพียงเล็กน้อย แต่คุณสามารถรวมเข้ากับระบบใดก็ได้และสนุกกับงานของมัน))

ฉันจะขอบคุณถ้าในความคิดเห็นที่คุณแนะนำวิธีแก้ปัญหาของคุณเองสำหรับปัญหานี้ - การจัดหมวดหมู่ของการทำรังระดับอนันต์

มุมมองแผนผังหมวดหมู่ย่อยของหมวดหมู่เป็นวิธีที่ใช้งานง่ายในการแสดงรายการหมวดหมู่หลักและหมวดหมู่รอง หมวดหมู่และหมวดหมู่ย่อยสามารถแยกออกจากกันได้อย่างง่ายดายด้วยโครงสร้างแบบต้นไม้ แนะนำให้ใช้มุมมองแบบต้นไม้หมวดหมู่เพื่อแสดงหมวดหมู่และหมวดหมู่ย่อยในระดับที่ไม่สิ้นสุด

ในบทช่วยสอนนี้ เราจะแสดงวิธีสร้างแผนผังหมวดหมู่ย่อยแบบไดนามิกโดยใช้ PHP และ MySQL แผนผังหมวดหมู่แบบเรียกซ้ำมีประโยชน์มากในการแสดงรายการหมวดหมู่ระดับ n ในเมนูแบบเลื่อนลง โค้ดตัวอย่างช่วยให้คุณสร้างดรอปดาวน์หมวดหมู่ย่อยหมวดหมู่ระดับ n ใน PHP ข้อมูลหมวดหมู่ไดนามิกจะถูกดึงมาจากฐานข้อมูล MySQL และแสดงรายการในรูปแบบแผนผังหมวดหมู่หลักและรอง

สร้างตารางฐานข้อมูล

ในการจัดเก็บหมวดหมู่และหมวดหมู่ย่อย จำเป็นต้องสร้างตารางในฐานข้อมูล SQL ต่อไปนี้จะสร้างตารางหมวดหมู่ในฐานข้อมูล MySQL

สร้างตาราง `หมวดหมู่ ` (`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` datetime NOT NULL , `แก้ไข` datetime NOT NULL , `status` enum("1" ,"0" ) COLLATE utf8_unicode_ci NOT NULL DEFAULT "1" COMMENT "1:Active, 0:Inactive" , PRIMARY KEY (`id` )) ENGINE= InnoDB ค่าเริ่มต้น CHARSET= utf8 COLLATE= utf8_unicode_ci;

คอลัมน์ parent_id ระบุว่าหมวดหมู่นั้นเป็นระดับบนสุดหรือระดับล่าง หาก parent_id เป็น 0 จะเป็นหมวดหมู่หลัก มิฉะนั้นจะเป็นหมวดหมู่ย่อยและรหัสจะเป็นหมวดหมู่หลักของหมวดหมู่นี้

การกำหนดค่าฐานข้อมูล (dbConfig.php)

ไฟล์ dbConfig.php ใช้เพื่อเชื่อมต่อและเลือกฐานข้อมูล ระบุโฮสต์ฐานข้อมูล ($dbHost) ชื่อผู้ใช้ ($dbUsername) รหัสผ่าน ($dbPassword) และชื่อ ($dbName) ตามข้อมูลรับรอง MySQL ของคุณ

ฟังก์ชั่นเรียกซ้ำ PHP เพื่อสร้างแผนผังหลัก / ลูก

ฟังก์ชัน categoryTree() สร้างโครงสร้างหมวดหมู่ย่อยหมวดหมู่ระดับ n โดยใช้ PHP มันจะสร้างตัวเลือกแบบเลื่อนลงสำหรับแผนผังหมวดหมู่

  • $parent_id – ไม่บังคับ ระบุ ID หลักเพื่อรับหมวดหมู่ลูกของหมวดหมู่หลักนี้
  • $sub_mark – ไม่บังคับ เครื่องหมายที่จะต่อท้ายชื่อหมวดหมู่ย่อย