Kategori alt kategori ağacı görünümü, üst ve alt kategorileri listelemek için kullanıcı dostu bir yol sağlar. Kategori ve alt kategorileri bir ağaç yapısıyla kolayca ayrılır. Kategoriler ağacı görünümünün her zaman sonsuz düzeyde kategori ve alt kategori görüntülemesi önerilir.
Bu eğitimde, PHP ve MySQL kullanarak dinamik kategori alt kategori ağacının nasıl oluşturulacağını göstereceğiz. Özyinelemeli kategori ağacı, bir açılan menüde n düzey kategorilerini listelemek için çok kullanışlıdır. Örnek kod, PHP’de n düzeyinde kategori alt kategori açılır listesi oluşturmanıza yardımcı olur. Dinamik kategori verileri MySQL veritabanından alınır ve bir üst-alt kategori ağacı biçiminde listelenir.
MySQL Tablosu Oluşturma
Önce MySQL veritabanında bir kategori tablosu oluşturun, çünkü veritabanı tablosundan çok düzeyli iç içe kategori oluşturmak istiyoruz.
1 2 3 4 5 6 7 8 9 10 11 | CREATE TABLE `category` ( `category_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `category_name` varchar(50) NOT NULL, `category_link` varchar(255) NOT NULL, `parent_id` int(10) unsigned NOT NULL DEFAULT '0', `sort_order` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`category_id`), UNIQUE KEY `unique` (`category_name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; |
Kategori tablosunun yapısını nasıl yarattığımıza dikkat edin. Bu kategori tablosunda, bu alt öğe için üst kategoriyi tanımlayan üst kategori kimliği bulunur.
Bu üst kategori kimliği için 0 dışında bir değer yoksa, bu kategorinin en üst düzey kategori olduğunu varsayacağız.
Tabloda aşağıdaki beş sütun var
category_id – otomatik artırılmış pozitif int değeri, birincil anahtar da
category_name – görüntülenebilir kategorinin adı veya düzeyi, benzersiz anahtar
category_link – bu kategori için url
parent_id – bu kategorinin ebeveynidir. Kök kategorisi için parent_id 0’dır.
sort_order – sıra numarası
Test Verileri
Yukarıdaki tabloyu oluşturduk, şimdi tamamlanmış uygulamayı test etmek için içine bazı verilere ihtiyacımız var. Hadi içine biraz veri koyalım:
1 2 3 4 5 6 7 8 9 | insert into `category`(`category_id`,`category_name`,`category_link`,`parent_id`,`sort_order`) values (1,'Ana Sayfa','',0,0), (2,'Web Tasarımı','web-tasarimi',0,1), (3,'Java','java',0,2), (4,'CSS','css',2,0), (5,'PHP','php',2,1), (6,'ASP','#',2,2); |
Tablodan Veri Alma
Şimdi aşağıdaki sorguyu kullanarak sonucu getirin. PHP kullanarak sonsuz çok düzeyli iç içe kategorimizi oluşturmak için category_id, category_name, category_link, parent_id ve sort_order sütunlarını getiriyoruz.
1 2 3 4 5 6 7 8 9 10 | SELECT `category_id`, `category_name`, `category_link`, `parent_id`, `sort_order` FROM `category` ORDER BY parent_id, sort_order, category_name |
DB Bağlantısı
Veritabanı bağlantısını oluşturmak için db_config.php adında bir dosya oluşturup bağlantısı ifadelerini yazıyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php $dbHost = "localhost"; $dbUsername = "root"; //db kullanıcı adı $dbPassword = "";//db şifre $dbName = "ticaret";//db adı $db = new mysqli($dbHost, $dbUsername, $dbPassword, $dbName); if ($db->connect_error) { die("Bağlantı hatası: " . $db->connect_error); } |
Ebeveyn-Çocuk Hiyerarşisi Oluşturma
Aşağıdaki mantık, sonuçları kategori tablosundan alır ve sonuçları çok boyutlu bir diziye koyar.
$category dizisi diğer iki diziyi içerir, kategoriler kategori tablosu sorgusundan her sonucu tutar ve parent_cats dizisi alt öğeleri olan tüm kategori kimliklerinin bir listesini tutar.
Sonra sql sonuçlarını çalıştırmak ve dizilere satır atamak için while deyimini kullanıyoruz.
parent_cats dizisinde satır üst kimliği zaten varsa, listelenen her üst kimliğin yalnızca biri olacak şekilde üzerine yazılır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?php require 'db_config.php'; //tüm satırları çek $result = mysqli_query("SELECT category_id, category_name, category_link, parent_id, sort_order FROM category ORDER BY parent_id, sort_order, category_name"); //iki boyutlu kategori ve üst kategori dizisini tanımla $category = array( 'categories' => array(), 'parent_cats' => array() ); //kategori tablosundan diziyi oluştur. while ($row = $result->fetch_array(MYSQLI_ASSOC)) { $category['categories'][$row['category_id']] = $row; $category['parent_cats'][$row['parent_id']][] = $row['category_id']; } |
Şimdi sonsuz çok düzeyli iç içe kategori için nihai sonuçları görüntüleyecek kategori ve alt kategori işlevini oluşturun.
Aşağıdaki işlevde, ana kategori kimliğinin 0 değerine sahip olduğunu ve üst düzey kategori olduğunu ve diğer tüm kategorilerin bu ana kategorinin altına girdiğini varsayıyoruz.
Burada sonsuz çok seviyeli iç içe kategori oluşturmak için özyinelemeli işlevi kullanıyoruz. Mantık, herhangi bir alt kategori olup olmadığını kontrol eder, sonra işlevi özyinelemeli olarak çağırır, aksi takdirde üst öğenin altına kategoriyi yazabilir veya üst kategori olarak yazabilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | function buildCategory($parent, $category) { $html = ""; if (isset($category['parent_cats'][$parent])) { $html .= "<ul>\n"; foreach ($category['parent_cats'][$parent] as $cat_id) { if (!isset($category['parent_cats'][$cat_id])) { $html .= "<li>\n <a href='" . $category['categories'][$cat_id]['category_link'] . "'>" . $category['categories'][$cat_id]['category_name'] . "</a>\n</li> \n"; } if (isset($category['parent_cats'][$cat_id])) { $html .= "<li>\n <a href='" . $category['categories'][$cat_id]['category_link'] . "'>" . $category['categories'][$cat_id]['category_name'] . "</a> \n"; $html .= buildCategory($cat_id, $category); $html .= "</li> \n"; } } $html .= "</ul> \n"; } return $html; } |
Yukarıdaki işlevle işiniz bittiğinde, yukarıdaki işlevi kullanmak istersiniz. Bu nedenle, sonsuz çok düzeyli kategoriyi görüntülemek istediğiniz yerde (çoğunlukla menü alanında) aşağıdaki kodu kullanın.
Kullanım Ayrıntısı
Aşağıdaki örneği kullanarak sonucu görüntüleyin:
1 2 3 | echo buildCategory(0, $category); |
Ekran Çıktısı:
Merhaba sayfada paylaştığınız gibi yaptım, içeriğini değiştirdim. Fakat mysql hatası alıyorum.
$result = mysqli_query(“SELECT bu satırda ve
while ($row = $result->fetch_array(MYSQLI_ASSOC)) { bu satırlarda
çalışan örnek dosya paylaşmanız mümkün müdür acaba?
$result = mysqli_query(buraya sql bağlatısı vereceksin,“SELECT bu satırda ve
while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
Doğru şekli:
$result = mysqli_query($sql, “SELECT bu satırda ve
while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
array(),
‘parent_cats’ => array()
);
//kategori tablosundan diziyi oluştur.
while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
$category[‘categories’][$row[‘category_id’]] = $row;
$category[‘parent_cats’][$row[‘parent_id’]][] = $row[‘category_id’];
}
bunu dene