PHP
Trend

MYSQL PHP İle Sınırsız Kategori Yapımı

MYSQL PHP İle Sınırsız Kategori Yapımı

MYSQL PHP İle Sınırsız Kategori Yapımı

İlgili Makaleler

Merhaba, bu yazımda sizlere sınırsız kategorilendirme sisteminden ve yapılışından bahsedeceğim.

Bu projenin amacı tıpkı e-ticaret sitelerinde olduğu gibi bir ürünü veya bir konuyu belirli temel etiketler altına kategorize etmeyi sağlamaktır. Bu kategorilendirme işlemi belirli tanımlarla değişip alt alta farklı kategoriler oluşturmakla kalmayıp diğer ana kategorilerin düzenli ve disiplinli bir şekilde görüntüleye bilme imkânı sağlıyor.

Kategorilendirme sistemi Veritabanı verileriyle oluşmakta, bu veriler aracılığı ile kategori adlarını ve numaralarını birbirleriyle ilişkilendirerek Treeview adını verdiğimiz klasörlü görünümü elde ediyoruz. Bu işlemi oluşturduğumuz php fonksiyonu ile kullanışlı bir halde sunacağım.

Yapımına başlayalım; Öncelikle veritabani adında oluşturduğumuz sql dosyasını ekleyelim.

Burada id, kategori, kategori_link ve kategori_ust adında 4 sütunumuz olacak.

Veritabanı yapısı;

CREATE TABLE `kategori` (
`id` int(20) NOT NULL,
`kategori` varchar(30) COLLATE utf8_turkish_ci NOT NULL,
`kategori_link` varchar(30) COLLATE utf8_turkish_ci NOT NULL,
`kategori_ust` varchar(30) COLLATE utf8_turkish_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_turkish_ci;
--
-- Tablo döküm verisi `kategori`
--
INSERT INTO `kategori` (`id`, `kategori`, `kategori_link`, `kategori_ust`) VALUES
(1, 'Elektronik', 'elektronik', '0'),
(2, 'Bilgisayar', 'bilgisayar', '1'),
(3, 'Laptop', 'laptop', '2'),
(4, 'TV', 'tv', '1'),
(5, 'Samsung', 'samsung', '4'),
(6, 'Akıllı', 'akilli', '5'),
(7, 'Normal', 'normal', '5'),
(8, 'Masaüstü', 'masaustu', '2'),
(9, 'LG', 'lg', '4'),
(10, 'Telefon', 'telefon', '1'),
(11, 'LG', 'lg', '10'),
(12, 'Samsung', 'samsung', '10'),
(13, 'Beyaz Eşya', 'beyaz-esya', '0'),
(14, 'Buzdolabı', 'buzdolabi', '13'),
(15, 'Galaxy', 'galaxy', '12');
--
-- Dökümü yapılmış tablolar için indeksler
--
--
-- Tablo için indeksler `kategori`
--
ALTER TABLE `kategori`
ADD PRIMARY KEY (`id`);
ALTER TABLE `kategori`
MODIFY `id` int(20) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=16;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

Veritabanı bağlantımız baglan.php;

<?php
@ob_start();
@session_start();
date_default_timezone_set('Europe/Istanbul');
if (basename($_SERVER['PHP_SELF'])==basename(__FILE__)) {
exit(' Erişim Engellendi.');
};
$db_user = "root";
$db_pass = "";
$db_name = "veritabani";
$host_name = "localhost";
try {
$db = new PDO("mysql:host=$host_name;dbname=$db_name", $db_user, $db_pass);
} catch (PDOException $e) {
echo 'Connection failed: '.$e->getMessage();
}
$db->query("SET NAMES utf8");
$db->query("SET CHARACTER SET utf8");
$db->query("SET COLLATION_CONNECTION = 'utf8_general_ci'");
?>

Veritabanı bağlantısını oluşturduktan sonra sıra gelelim kategori ekleme sayfasına, index üzerinde inşa ettiğimiz formda iki alanımız olacak, bunlardan birisi kategori adını gireceğimiz [input type=text name=kategori] ve daha önce oluşturduğumuz kategori adlarının listelendiği [select option name=kategori_ust] alanımız.

Select içerisine ufak bir php SELECT sorgusu ile option arasına kategorileri ve id değerlerini çekiyoruz. Disabled ile belirtiğimiz option’lar ana kategori olarak başta gözükecek.

Burada dikkatinizi çeken kısım olmuştur. Kategoriler adında bir sabit dizi ve içerisinde kategori ve kategori_ust adında ikinci bir dizi. Bu dizler içerisine tıpkı sorguda olduğu gibi bazı değerler atıyoruz. Kategori ikinci dizisine bütün kategori değerlerini çekiyoruz, diğer bir dizi olan kategori_ust dizisine foreach esnasındaki kategorinin üst değeri ile o kategorinin kendi id değerini diziye ekliyoruz. Bu sayede daha sonra Treeview için kullanacağız.

index.php;

<form action="kategori.php" method="POST">
<label>Kategori Ekle</label>
<input class="form-control" type="text" name="kategori" value="" placeholder="Kategori Adı">
</div>
<div class="form-group col-md-4">
<label>Üst Kategori</label>
<select class="form-control" name="kategori_ust">
<option value="0">Kategori Yok</option>
<?php
include 'baglan.php';
/* kategoriler adında bir array oluşturup içerisine yine iki array dizini açıp kategori adındaki dizeye bütün kategori değerlerini listeletiyoruz. kategori_ust dizisine ise sadece kategorilerin üst değerine karşılık o kategorinin id değerini atıyoruz*/
$kategoriler = array(
'kategori' => array(),
'kategori_ust' => array()
);
$kategori=$db->prepare("SELECT * FROM kategori ORDER BY kategori_ust ASC");
$kategori->execute();
while ($row = $kategori->fetch()) {
$kategoriler['kategori'][$row['id']] = $row; //
$kategoriler['kategori_ust'][$row['kategori_ust']][] = $row['id']; //
if ($row["kategori_ust"] == 0) {
echo '<option disabled style="background:#ccc;" >'.$row["kategori"].'</option>';
echo '<option value="'. $row["id"] .'">'.$row["kategori"].'</option>';
}
else{echo '<option value="'. $row["id"] .'">'.$row["kategori"].'</option>';}
}
?>
</select>
</div>
<button type="submit" name="kategoriekle" class="btn btn-primary"><i class="fa fa-edit"></i> Ekle</button>
</form>

Form içerisinde oluşturduğumuz kategori adını veritabanına eklemek için kategori.php sayfasına bakalım. Kategori adını ve kategori_ust değerini değişkene aktarıp kategori_link değerini ise kategori postunu seo fonksiyonu ile harici karakterlerden temizliyoruz. Ve Insert işlemi yapıyoruz. Ekleme işlemi tamamlandığı takdirde index sayfasına yönlendirme işlemi yapıyoruz.

<?php
include 'baglan.php';
function seo($s) {
$tr = array('ş','Ş','ı','I','İ','ğ','Ğ','ü','Ü','ö','Ö','Ç','ç','(',')','/',' ',',','?');
$eng = array('s','s','i','i','i','g','g','u','u','o','o','c','c','','','-','-','','');
$s = str_replace($tr,$eng,$s);
$s = strtolower($s);
$s = preg_replace('/&amp;amp;amp;amp;amp;amp;amp;amp;amp;.+?;/', '', $s);
$s = preg_replace('/\s+/', '-', $s);
$s = preg_replace('|-+|', '-', $s);
$s = preg_replace('/#/', '', $s);
$s = str_replace('.', '', $s);
$s = trim($s, '-');
return $s;
};
if (isset($_POST["kategoriekle"])) {
$kategori = $_POST["kategori"];
$kategori_link = seo($_POST["kategori"]);
$kategori_ust = $_POST["kategori_ust"];
$sql = "INSERT INTO kategori SET
kategori=:kategori,
kategori_ust=:kategori_ust,
kategori_link=:kategori_link";
$kaydet = $db->prepare($sql);
$kaydet->execute(array("kategori" => $kategori,"kategori_ust" => $kategori_ust,"kategori_link" => $kategori_link));
if ($kaydet) {
header("Location:index.php?kategor=eklendi");
}else{
header("Location:index.php?kategor=eklenmedi");
}
}
?>

 

Sıra geldi Treeview yani kategorilerin sıralı bir şekilde listeleme işlemi. Bu işlemi daha önce bahsettiğim gibi php fonksiyonu ile gerçekleştirmek gerekiyor, çünkü iç içe geçen kategoriler aynı işlemleri tekrarlanması ile gerçekleşiyor, bunun için kategori($id,$kategoriler) adında iki parametreli bir fonksiyonumuz var id yerine 0 yazarak varsayılan ilk sorguyu başlatıyoruz. Kategoriler adı ile oluşturduğumuz diziyi burada ekleyerek çözümlüyoruz.

Fonksiyon Açıklaması

1.    Numaralı satırda kategori_ust dizisinde belirtilen id değerinde bir grup varsa işlem başlar.
2.    Bu satırda liste tagını ekliyoruz.
3.    Kategori_ust dizisini döngüye 0 alt dizinini numara değişkenine çekiyoruz.
4.    Burada kategori_ust->0 alt dizininde bulunan değer kategori_ust içinde kendi dizini yoksa.
5.    Benzer dizin yoksa kategori dizininde o id ye ait kategori adını listeye ekler.
6.    –.
7.    Burada kategori_ust->0 alt dizininde bulunan değer kategori_ust içinde kendi dizini varsa.
8.    Öncelikle numaraya eşit olan kategori adını listeye ekler
9.    Kendi alt dizini olan numaranın alt kategorilerini çekmek için fonksiyona o dizinin numarası eklenir.
10.    Fonksiyon tamamlanınca kategoriyi kapanış tagıyla bitirir.
11.    Listeyi tamamlamak için kategoriye kapanış verir
12.    Liste değişkenini daha sonra return edilir.
13.    Son olarak echo ile return edilen değer ekrana yazılır.
 

Basit bir şekilde açıklamak gerekirse sistem kategori_ust üzerinde çalışır, eğer belirli bir numara altında toplanmış farklı id değerleri varsa o numara kendi altında bulunan idlerin kapsayıcısıdır.

Fonksiyon;

<div style="border:1px solid grey;border-radius: 5px;">
<?php
function kategori($id,$kategoriler)
{ $liste = "";
if (isset($kategoriler['kategori_ust'][$id])) {/*ust kategori varsa*/
$liste .= "<ul>";
foreach ($kategoriler['kategori_ust'][$id] as $numara) {/**/
if (!isset($kategoriler['kategori_ust'][$numara])) {
$liste .="<li>".$kategoriler["kategori"][$numara]["kategori"]."</li>";
}
if (isset($kategoriler['kategori_ust'][$numara])) {
$liste .= "<li>".$kategoriler["kategori"][$numara]["kategori"];
$liste .= kategori($numara,$kategoriler);
$liste .= "</li>";
}
}
$liste .= "</ul>";
}
return $liste;
}
echo kategori(0,$kategoriler);
print_r($kategoriler['kategori_ust'][13]);
?>
</div>

Dosya linkini sizlere arşivleyerek sunuyorum.

Yorum, görüş ve önerilerinizi benimle paylaşın. Beğenerek, oylayarak ve paylaşarak katkı sağlaya bilirisiniz. Teşekkürler.

Dosya Linki: Buradan

220cookie-checkMYSQL PHP İle Sınırsız Kategori Yapımı

Oy ver

İlgili Makaleler

4 Yorum

  1. merhaba Ana Sayfa / Bilgisayar / Tablet / gibi bir kategoride tablet ürün eklediğimde aynı zamanda bilgisayar kategorisinde nasıl listeleyebilirim teşekkürler

    1. Select kısmını multiselect yaparak birden fazla option seçebilirsin. Yada ürünleri görüntülediğin sayfada Bilgisayar kategori id değerini ve parentid si ile sorgulama yapabilirsin. Örnek bilgisayar kategorisi id değeri 10 olarak belirle Sorguda ürünlerin yanında kategori tablosunu da join ile bileştirip parentid değeri 10 olan bütün içerikleri listelersin

      1. Merhaba hocam bu kodlamayı benim sitem için uygularmısınız ücreti neyse karşılarım yardımcı olursanız çok memnun olurum

salih için bir yanıt yazın Yanıtı iptal et

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu