ile

PHP ile içerik yönetim sistemi – 1 – Veritabanı Modelleme

Bu zamana kadar hep statik siteleri nasıl yapacağımızdan bahsettik. Hazır içerik yönetimi sistemi olarak kendini kanıtlamış bir sistem olan wordpress’i konuştuk. Sıra geldi kendi içerik yönetim sistemimizi yazmaya.

how-cms-works-0

Bu sistemi önce OOP yani nesne yönelimli programlama ile yazacağız. Spagetti kodlamaya ise hiç girmeyeceğiz. Çünkü spaghetti kodlama çukurunda kalıp hiç kendini geliştirmeyen ve boktan kodlar üreten insanlar olmanızı istemiyorum. OOP başta zor gelebilir ama avantajlarını kullanmaya ve kodlarınıza bakım yapmanız gerektiğinde anlayacaksınız. Daha sonra ise CakePHP framework’e giriş yapacağız. MVC yapısının mantığını anlayarak işe başlayacağız. CakePHP’nin konsol uygulamasını kullanarak temel fonksiyonları içerek sınıfları otomatik üreteceğiz. Zaten birçok framework’te olan bu özellik, frameworklerin en güçlü yanlarından birini oluşturmakta.

Cake-logo

En son olarak özel fonksiyonlarımızı yazacağız, kullanıcı girişi ve yönetimini ayarlayacağız ve görünümleri giydireceğiz. Ancak ilk yapmamız gereken şey her zamanki gibi, tüm yazılımlarımızda ilk atmamız gereken adım olan “Mantıksal Modelleme” kavramı.

Öncelikle içerik yönetim sisteminin nelerden oluştuğuna bakalım. İlk etapta sistem için en gerekli olan öğeleri ekleyeceğiz. Yani kullanıcı yönetimi, sosyal medya paylaşımı, video ekleme gibi şeyleri ikinci plana atıyoruz. İçerik yönetimini oluşturan elemanlar yazılar ve resimler. Aslında basit gibi dursa da içerik yönetim sistemimiz kullanıldıkça karmaşıklaşacak durumlar mevcut. Tek tek ele alalım.

  1. Yazıların içinde resimler olabilir
  2. Resimler bir araya gelip galerileri oluşturabilir
  3. Resimler aynı zamanda pdf, word dokümanı gibi dosyalardan da oluşabilir
  4. Yazılar ve resimler üst menüyü oluşturacak kategorilerin içinde yeralmak zorunda
  5. Bir kategoride birden fazla yazı varsa, blog gibi aşağıya gitmeli
  6. Bir kategoride birden fazla resim varsa ve yazıya dahil değilse galeri olarak görünmeli
  7. Galeri iki şekilde görünebilmeli. Birisi ızgara şeklinde resimler olarak, diğeri kayan resimler olarak.

Tespit ettiğimiz bu sorunlara çözüm olarak, veritabanında resimler yerine dosyalar tablosu tutacağız. Yazacağımız yazılım, dosyanın türüne göre görüntülemelerini farklı yapacak. Örneğin bir yazının içinde word, pfd, excel gibi dosyalar varsa, bunlar yazının altında ikon olarak görünecek.

Resim türündeki dosyalar yazının metninin içinde img etiketiyle görünmeli. Ayrıca veritabanından bağlanmamalı. Çünkü yazı düzenlendiği zaman resim silinirse veritabanından silinmeme durumu olabilir. Bu da veritabanında çöp veri birikmesine neden olur.

Görüldüğü gibi işler kolayca karmaşıklaşabiliyor. Bu yüzden biz de wordpress’teki gibi galeri, resim ve dosyaları yazıların içinde tutacağız. Resimler ve dosyalar için de bir ortam (media) yöneticisi oluşturacağız ki işler daha fazla karmaşıklaşmasın.

İlk önce yazı gireceğiz. Yazı girerken yazının içine resim ekleyebiliriz. Bunu eklerken ortam yöneticisi açılmalı, ortam yöneticisine yüklemeyi yapmalıyız, daha sonra da istersek yazıya bu resmin img etiketini ekleyebiliriz. Dosyaları da aynı şekilde yazıya ekleyebiliriz ancak onlar img etiketi ile değil, link olarak veya dosya ikonu olarak görünebilir.

Her metin ve ortamın, hangi tarihte eklendiğini sistemde tutmamız gerekiyor ki, zaman bağlı sıralayabilelim. Ayrıca güncellendiği tarihi de tutabiliriz. Kullanıcı yönetimimiz henüz yok. Fakat kullanıcı yönetimini sisteme girdiğimizde içeriklerin hangi kullanıcı tarafından eklendiğini de sistemde tutmamız lazım. Ayrıca kullanıcı yönetiminde admin yani yönetici, yazar ve yorumcu gibi görevler de olabilir. Ayrıca bir sonraki aşamada yorumlar tablosuna da ihtiyacımız olacak. Tablolarda kategoriler listesi de tutmalıyız. Bu kategorilerin üst ve alt menüleri de olabilir. Bu menüleri görüntülemek için ben superfish kullanıyorum. Her sayfa gösteriminde menüleri veriatabanından çekmemek ve veritabanına yük olmamak için cache adı verilen daha hızlı kayıt ortamlarını da kullanabiliriz, ama şimdilk bu da ikinci aşamaya kalsın.

Veritabanını modellemek için MySQL Workbench programını kullanacağız. MySQL Workbench görsel olarak veritabanını oluşturmamızı ve yönetmemizi sağlayan, görsel diyagramlardan SQL kodu üretmemizi, veritabanından da görsel diyagram üretmemizi sağlayan program.

Oluşturacağımız en temel veritabanı modeli için gerekli olan 3 tane tablomuz var. Posts, Files ve Categories. Tablo isimlerimiz ingilizce ve çoğul olmak zorunda çünkü CakePHP’nin kod üretme aracı veriatabını bu şekilde tabıyıp kod üretebiliyor.

Öncelikle MySQL Workbench programını açalım. Karşımıza şöyle bi ekran gelecek:Screen Shot 2014-05-21 at 12.14.42

Modelin yanındaki + işaretine basarak yeni bir model oluşturmamız gerekiyor. Screen Shot 2014-05-21 at 12.14.29

Modelimizin şema ismine şimdilik “merakli” dedik fakat oluşturacağımız SQL kodunda buna ihtiyacımız olmayacak. Daha sonra üst taraftaki add diagram ikonuna tıklayarak görsel modelleme ekranını açmamız gerekiyor.

Screen Shot 2014-05-21 at 12.14.11

Bu ekran açıldığında sağ tarafta Screen Shot 2014-05-21 at 12.40.59 ikonuna tıklayarak veya klavyeden “T” harfine basarak karelerle oluşan görsel ekranımıza bir table yerleştirelim.

Screen Shot 2014-05-21 at 12.14.11

Yerleştirdiğimiz tablonun boyunu büyüttük ve sıra geldi alanları eklemeye. İlk olarak Aşağıdaki column table yazan yere çift tıklayalım ve ilk index alanımızı oluşturalım. Bu alanın adı id olmak zorunda. Alanlarımızın PK, NN, UQ, BIN, UN, ZF ve AI gibi seçenekleri olduğunu göreceksiniz. Bütün ID alanları AI yani auto increment yani sırayla artan eşsiz (unique) bir numaraya sahip olmak zorunda. Bu nedenle AI’yi işaretleyelim. Bunu her seferinde işaretlemeliyiz çünkü, MySQL Workbench otomatik olarak ilk alan için PK(primary key “birincil anahtar”) ve NN(Not null “Alan boş olamaz”) seçeneklerini işaretlese de AI’yi işaretlemiyor. Biz her tabloya id alanımızı girdiğimizde bunu tekrar işaretlemeliyiz.

Screen Shot 2014-05-21 at 12.16.23burada AI’nin işaretli olması gerekiyor. Şimdi sırasıyla oluşturduğumuz alanlara bakalım.

  1. id: Birincil alan. Eşsiz ve her eklemeyla artan bir numaraya sahip. Boş olamaz.
  2. title: Başlık. 255 adet karakter alabiliyor. Boş olamaz. CakePHP bu alanı otomatik olarak tanıyor ve kodu buna göre üretiyor. CakePHP’de farklı isimli başlık kullanmak istersek model içinde $displayField değişkeni tanımlamalıyız ancak şu an temel seviyedeyiz.
  3. category_id: Yazının ait olduğu kategori’nin id’si. Karşı tablonun tekil ismi ve id yazdığımızda cakePHP’nin kod üreteci bu tablolar arasındaki ilişkiyi otomatik olarak algılıyor. Boş olamaz. Bu alan sayesinde bir kategorinin birden fazla yazıya sahip olabileceği ancak bir yazının sadece bir kategoriye ait olabileceği ilişkisel kuralını tanımlamış oluyoruz.
  4. created ve updated: Yazının eklendiği ve güncellendiği tarih. Bu alanı da cakePHP otomatik olarak tanıyor ve kendisi güncelliyor.

Diğer tabloları da aynı şeyleri gözeterek oluşturuyoruz.Screen Shot 2014-05-21 at 12.26.46

Sonuç olarak elimizde 3 adet tablodan oluşan basit bir veritabanı var. Modellemeye ilk aşamada ne kadar fazla dikkat edersek, daha sonra işimiz kolaylaşır ve işlerin karışmasını ve modelleme fazına tekrar dönmemizi önlemiş oluruz.

Screen Shot 2014-05-21 at 12.26.38

MySQL Workbenchin database menüsüne tıklayalım. Forward engineer ile kodumuzu oluşturalım. Biz MySQL Workbenchden veritabanına bağlanmayacağız ancak bağlantımız olması ve MySQL’in bilgisayarımızda kurulu olması gerekiyor. Forward engineer’den ileri ileri diyelim ve database bağlantı bilgilerimizi girelim. Screen Shot 2014-05-21 at 12.27.37

Program bize gerekli sql kodunu üretecek. İstediğimiz bir text editör doyasını açalım ve

CREATE SCHEMA IF NOT EXISTS `merakli` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `merakli` ;

kısmını ve bütün  `merakli`  kelimelerini silelim.Screen Shot 2014-05-21 at 12.28.28 Screen Shot 2014-05-21 at 12.28.15

daha sonra phpmyadmin programını açıp veritabanımızı oluşturalım. Veritabanimizin adı örneğin ‘merakli’ olsun. Karakter sınıfı olarak da “utf8_turkish_ci” seçelim.

Screen Shot 2014-05-21 at 13.04.06

Veritabanımız oluştuktan sonra, temizlediğimiz sql kodunu, phpmyadmin’de üst menüde SQL yazan menüye tıkladımızda ortaya çıkan metin bölümüne yapıştıralım ve ‘GO’ diyerek çalıştıralım.

Screen Shot 2014-05-21 at 12.29.38

 

Kodu çalıştırdığımızda veritabanımızda artık istediğimiz tabloları eklemiş olduk:

Screen Shot 2014-05-21 at 12.29.53

Bir sonraki yazıda Nesne Yönelimli Programlama metodları kullanarak içerik yönetim sistemimizi oluşturmaya başlayacağız.

Kaynaklar:

  1. http://www.mysql.com/products/workbench/
  2. http://www.iainbenson.com/programming/icms/
  3. http://www.inqbation.com/how-cms-works/
  4. http://www.webdesignviews.com/2011/05/history-of-open-source-content-management-systems/
  5. http://www.rocketmill.co.uk/cakephp-and-mysql-workbench-how-to-make-them-work-together
  6. http://book.cakephp.org/2.0/en/tutorials-and-examples/blog/blog.html 
  7. http://alvinalexander.com/php/cakephp-cheat-sheet-reference-page-examples
  8. http://technet.weblineindia.com/web/cakephp-naming-convention-standard/

Yorumla

Yorum

  1. Teşekkürler Midori, aslında hazır başlamışken mikro çapta bir CMS olarak devam ettirsen hatta github ‘da yer edinse de bizde destek versek 🙂

  2. Çok güzel bir düşünce. Dört gözle gelecek yazıları bekliyorum.

    Nacizane tavsiyem, OOP ile bu projeyi bitirmeniz. OOP Mantığını kavradıktan sonra bence framework’ü okuyanlara, öğrenenlere bırakmalısınız.
    OOP ile ilgili teorik bilgi heryerde var, pratikte hiç türkçe eğitim yok. Bu projeye, framework’e girmeden OOP ile noktayı koymanız inanın bana herkes için çok daha yararlı olacaktır.

    Nesne yönelimli programalama ile alakalı çok güzel bir referans yazı dizisi olacağından hiç şüphem yok.

    Teşekkürler.

  3. Ben engineer işlemini düzgün yapamadım sanırım, ve editörde neyi açacağımıda bulamadım, sonra, engineerdeki scripti komple kopyaladım notepad++’a, engineer kısmında ne kadar meraklı varsa sildim, ııh, sonuç felaket, fetch mi yok diyo ne, buaşamada tıkandım işte, yardımcı olabilecek olurmu acaba nerede hata yapıldığına dair bilgisi olan…?