Php ile Sınırsız Kategori Nasıl Yapılır?

Php ile Sınırsız Kategori Nasıl Yapılır?

 2 ay önce  Php   Ekimnet    299



Php ile sınırsız kategori nasıl yapılır? Mantığını anlamaya çalışacağız. İnternette zamanında biraz araştırma yaptım fakat gerçek manada bir kod göremedim. Evet birçok sitede bu işlem yapılmış ama her kategori için tekrardan mysql sorgusu yapılmışki buda etik bir durum değil. 

Biz daha farklı bir yöntem kullanacağız ve mysql sorgumuzu bir defa yapacağız. Sizlere iki farklı kategori listeleme fonksiyonu yapacağım. Hiçbir yerde bulamıyacağınız bir yapı ile sınırsız kategori listeleyeceğiz.

Neden böyle dediğime gelince nacizane bir arkadaşım olan "Erkan" ile böyle bir yapıya ihtiyacımız oldu. Tabi bizde hemen netten bakalım alıp kullanalım dedik ama malesef böyle bir kod karşımıza çıkmadı. Bizde kendimiz yapalım ozaman dedik ve kolları sıvadık. Sonrasında Aşağıdaki gibi bir listeleme fonksiyonu yaparak işimizi çözmüş olduk.

1. Yöntem Kategori Listeleme Mantığı

  1. Yöntem bu yöntem opencart sistemindeki kategori mantığına benzemektedir. Halbuki opecart bile bu kategori listeleme mantığını kullanırken her kategori için tekrar sorgu yapmakta. Biz ise bunun önüne geçerek tek sorguyla işimizi hallettik

Öncellikle msql veri tabanımızın aşağıdaki resimdeki gibi olması gerekiyor.

Sınırsız Kategori Mysql Veri Tabanı Örneği.

php-sinirsiz-kategori-mysql

Gördüğünüz gibi mysql veri tabanı mantığı bu şekilde olmalı yani Ana kategorilerin kategori ust id leri 0 alt kategoriler ise hangi kategorinin alt kategorisiyse o kategorinin idsi kategori üst id bölümüne eklenmeli.

Kategori tablomuzu bu şekilde düzenledikten sonra veri tabanına bağlanalım ve kategorileri çekelim.

<?php

try {

    $baglanti = new PDO("mysql:host=localhost;dbname=kat", "root", "");
    $baglanti->exec("SET NAMES utf8");
    $baglanti->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $sorgu = $baglanti->query("SELECT kategori_id, kategori_adi, kategori_ust_id FROM kategoriler");
    $veri = $sorgu->fetch(PDO::FETCH_ASSOC);
 // kategoriler tablosuna bağlandık ve $veri değişkenine  dizi şeklinde tüm verileri çektik

} catch (PDOException $e) {
    die($e->getMessage());
}


?>

 

Yukarıdaki kod örneği ile tüm verileri $veri değişkenine dizi halinde çektik. Sonrasında çekmiş olduğumuz bu verileri işleyeceğimiz fonksiyonu yazalım. Aşağıdaki vereceğim fonksiyon ile kategorileri düzene sokacağız.

<?php
function reCall($veri, $ust_id = 0, $kategori_id = null)
{
    $r = array();
    $a = array();
    $html = '';
    foreach ($veri as $d) {
        if ($d['kategori_id'] == $ust_id)
            $a[] = $d;
    }
    foreach ($a as $kategori) {
        $html .= reCall($veri, $kategori['kategori_ust_id']);
        $html .= $kategori['kategori_adi'];
        $html .= ' > ';
        if ($kategori_id) {
            foreach ($veri as $s) {
                if ($s['kategori_id'] == $kategori_id)
                    $r[] = $s;
            }
            foreach ($r as $re) {
                $html .= $re['kategori_adi'];
            }
        }
    }

    return $html;
}

?>

Gelin şimdide bu fonksiyonu çalıştıralım ve çıktımızı alalım.

<table>
    <thead>
    <tr>
        <th>Kategori</th>
    </tr>
    </thead>
    <tbody>
    <?php foreach ($veri as $row) { ?>
        <tr>
            <?php if ($row['kategori_ust_id'] > 0) { ?>
                <td><?php echo reCall($veri, $row['kategori_ust_id'], $row['kategori_id']); ?></td>
            <?php } else { ?>
                <td><?php echo $row['kategori_adi']; ?></td>
            <?php } ?>

        </tr>
    <?php }; ?>

    </tbody>
</table>
<ul>
    <?php foreach ($veri as $row) {
        if ($row['kategori_ust_id'] > 0) { ?>
            <li><?php echo reCall($veri, $row['kategori_ust_id'], $row['kategori_id']); ?></li>
        <?php } else { ?>
            <li><?php echo $row['kategori_adi']; ?></li>
        <?php }
    } ?>
</ul>

Yukarıda ben iki şekilde listeledim kategorileri tablo yapısında ve liste yapısında.

Sonuç olarak elimizde şöyle bir çıktı oluştu

php-sinirsiz-kategori-sonuc

Bu yöntem bize bu şekilde bir kategori listeleme yapıyor.

2. Yöntem Kategori Listeleme Mantığı

bu yöntem aslında aradığınız listeleme mantığı yine mysql sorgusunu bir kez yapacağız ve fazladan sorgu oluşturmayacağız.

Tekrardan sizlere mysql bağlantısı yapmayacağım zira yukarıda yaptık aynı mantıkta kategorilerimiz olacak ve biz fonsiyonumuzu nasıl oluşturacağımızı öğrenelim. Sınırsız kategori mantığı için bu sefer iki tane fonksiyon oluşturacağız birinci oluşturacağımız fonksiyon bize veri tabanımızdaki kategorileri düzene sokacak ikinci fonsiyonumuz ise listeleyecek.

Şimdi hemen kodumuza geçelim .

  1. Fonksiyon "Kategorileri Düzene Sokacak olan fonksiyonumuz".
<?php
function katMenu($veri, $kategori_ust = 0)
{
    $veriler = array();
    foreach ($veri as $kategori) {
        if ($kategori['kategori_ust_id'] == $kategori_ust) {
            $cocuk = katMenu($veri, $kategori['kategori_id']);
            if ($cocuk){
                $kategori['cocuk'] = $cocuk;
            }else{
                $kategori['cocuk'] = array();
            }
            $veriler[] = $kategori;
        }
    }
    return $veriler;
}


//$catt= katMenu($veri);
//print_r($catt);  //fonksiyonu bu şekilde çağırıp çalıştırabilirsiniz ve size sonuç olarak döneceği veri aşağıdaki olacak

?>

Foksiyonu çalıştırdığınızda aşağıdaki gibi bir veri oluşuyorsa ozaman fonksiyonumuz doğru şekilde çalışıyor demekktir.

Array
(
    [0] => Array
        (
            [kategori_id] => 1
            [kategori_adi] => Ana Kategori
            [kategori_ust_id] => 0
            [cocuk] => Array
                (
                    [0] => Array
                        (
                            [kategori_id] => 4
                            [kategori_adi] => Alt Kategori
                            [kategori_ust_id] => 1
                            [cocuk] => Array
                                (
                                    [0] => Array
                                        (
                                            [kategori_id] => 5
                                            [kategori_adi] => Alt alt Kategori 
                                            [kategori_ust_id] => 4
                                            [cocuk] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [kategori_id] => 8
                                                            [kategori_adi] => Alt alt  alt Kategori
                                                            [kategori_ust_id] => 5
                                                            [cocuk] => Array
                                                                (
                                                                )

                                                        )

                                                )

                                        )

                                )

                        )

                )

        )

    [1] => Array
        (
            [kategori_id] => 2
            [kategori_adi] => Ana Kategori 1
            [kategori_ust_id] => 0
            [cocuk] => Array
                (
                )

        )

    [2] => Array
        (
            [kategori_id] => 3
            [kategori_adi] => Ana Kategori 2
            [kategori_ust_id] => 0
            [cocuk] => Array
                (
                    [0] => Array
                        (
                            [kategori_id] => 6
                            [kategori_adi] => Alt Kategori 1
                            [kategori_ust_id] => 3
                            [cocuk] => Array
                                (
                                    [0] => Array
                                        (
                                            [kategori_id] => 7
                                            [kategori_adi] => Alt alt Kategori 1
                                            [kategori_ust_id] => 6
                                            [cocuk] => Array
                                                (
                                                )

                                        )

                                )

                        )

                )

        )

)

Gördüğünüz gibi aslında sınırsız kategori mantığını yaptık şimdi gelin hep birlikte birde html yapısınıda eklediğimiz fonksiyonu yazalım ve çalıştıralım.

2. Fonksiyon " Kategorileri Ekrana Basacağımız Fonksiyon".

function KatMenuGoster($items)
{
    echo '<ul>';
    foreach ($items as $item)
    {
        echo '<li>'.$item['kategori_adi'];
       
        if (sizeof($item['cocuk']))
        {
            KatMenuGoster($item['cocuk']);
        }
        echo '</li>';
    }
    echo '</ul>';
}

$kategoriBas= KatMenuGoster(katMenu($veri));
echo $kategoriBas; // artık kategorilerimiz sınırsız kategori mantığı ile listelenecek 

?>

Yukarıdaki koduda uyguladıktan sonra ekran çıktısı aynen şu şekilde olacaktır.

php-sinirsiz-kategori-sonuc2

Gördüğünüz gibi sadece bir mysql sorgusu yaparak sınırsız kategorilerimizi listeledik. 


Etiket: sınırsız kategori kategori listeleme php kategori listeleme sınırsız kategori mantığı




İçerik 4 kere oylandı.


Ortalama oylama 5.0000 .



Ali
Ali  Cevap Yaz 2 ay önce 
Teşekkürler gerçekten çok güzel bir paylaşım olmuş

Ekimnet
☆ Ekimnet  Cevap Yaz 2 ay önce 
Faydalı olmasına sevindim

Yorum Yaz