PHP ile içerik yönetim sistemi – 10 Nesne yönelimli programlama kavramları

  Bu yazıya kadar hep bebek adımlarıyla ilerledik. Sıra geldi büyük adımları atmaya. Yazılımımızda sınıf yapısını kullandık. Bu zamana kadar sınıf yapısını aşağı yukarı mantığını kavrayacak şekilde öğrendiniz. Ancak bilmemiz gereken bir sürü şey daha var. Programımızı bu kavramlara uyduralım. Sınıflarımızda tek tek değişiklikler yapalım. DRY prensibi DRY yani “Do not Repeat Yourself” kendinizi tekrar etmeyin anlamına gelir. Kodlarınızda sürekli copy paste ettiğiniz aynı şeyler varsa, bunları gruplayıp başka bir yerden çağırabilirsiniz. Burada buna benzer bir örnek yapalım. Mesela bizim sınıflarımızın hepsine $id, $related, $db gibi değişkenler var. Ayrıca hepsinde add, edit, delete, view, show fonksiyonları var. Mesela Kullanıcılar diye yeni bir sınıf yaratmamız gerekiyor. Bu kuralları hiç bilmeyen birinin kodların içinde boğulmasını da istemeyiz. Add, edit, delete gibi metodlarımız her sınıfta farklı, ama her sınıfta ortak kullandığımız getRelatedData ve connect metodları da var. Bunların hepsini gruplayalım. Soyut bir sınıf yaratalım. Peki soyut sınıf, abstract cla...
Patreon üyelerine özel içerik.
To view this content, you must be a member of Mutlu's Patreon at "Merakli Bilişimci Üye..." or higher tier
Already a Patreon member? Refresh to access this post.

PHP ile içerik yönetim sistemi – 9 Birleştirmeye devam edelim.

index.php dosyamızı incelemeye devam edelim. Önce app sınıfımızı oluşturmuşuz ve bağlantı metodunu çağırmışız. Daha sonraki satırların korkutucu olduğunu kabul ediyorum. Yine her zaman yaptığımız gibi tek tek inceleyelim. [code language=”php”] $app->connect($config[‘db’][‘host’],$config[‘db’][‘username’],$config[‘db’][‘password’],$config[‘db’][‘dbname’]); if(strpos($_SERVER[‘REQUEST_URI’],$_SERVER[‘SCRIPT_NAME’])!==false){ $request = str_replace($_SERVER[‘SCRIPT_NAME’], "", $_SERVER[‘REQUEST_URI’]); } else{ $request = "/Posts/"; } if(!empty($_POST)) { $data = $_POST; } elseif(!empty($_FILES)) { $data = $_FILES; } else{ $data = ""; } if(empty($request)){ $request = "/Posts/"; } echo $app->calculate($request,$data); [/code] $_SERVER, $_GET, $_FILES gibi değişkenler php yazılımları çalışırken sabit olan global değişkenlerdir. Örneğin dosyamızın ismini $_SERVER[‘SCRIPT_NAME’] i...
Patreon üyelerine özel içerik.
To view this content, you must be a member of Mutlu's Patreon at "Merakli Bilişimci Üye..." or higher tier
Already a Patreon member? Refresh to access this post.

PHP ile içerik yönetim sistemi – 8 Herşeyi birleştirmeye başlayalım

  Sıra geldi herşeyi birleştirmeye ve projemizin ilk bebek adımlarını atmasını sağlamaya. Yapmamız gerek bir kaç iş daha var ama biz projeyi birleştirmeye başlayalım.   burada config.codekit ve composer.json dosyaları hariç dizin yapısını lokal web sunucumuzun içinde (ipucu:xampp) oluşturalım. Klasör ismimiz Cms olsun. En önemli dosyamız şu anda index.php. Diyelim ki projemizi, ftp ile sunucuya yükledik. Kullanıcı da adres çubuğuna sitemizin adresini yazdı. Ulaşacağı ilk sayfa index.php olacak haliyle. index.php dosyasının yapması gereken işler var. Sonuçta otelde resepsiyondaki görevliler gibi bişi o. Önce bizi tanımaya çalışacak, daha sonra bize yardımcı olacak ve istediğimiz yere götürecek. index.php dosyasının yapması gereken işler sırayla; Kullanıcıyı tanımak. Kullanıcıya isteğini sormak. İsteğine göre gösterilecek sayfaları seçmek. Bunun için uygulama sınıfına başvurmak. Ondan cevap beklemek. Kullanıcıya nerede olduğunu söylemek. Admin panelindeyse admin, dış sitedeyse admin sayfalarını göstermek. Kullanıcının bi isteği yoksa, lobide rahat etmesini sağlamak. (Ana sayf...
Patreon üyelerine özel içerik.
To view this content, you must be a member of Mutlu's Patreon at "Merakli Bilişimci Üye..." or higher tier
Already a Patreon member? Refresh to access this post.

PHP ile içerik yönetim sistemi – 7 Temalar ve Admin paneli

Görüntü sayfalarımız neredeyse bitti. Kullanıcıya göstermemiz gereken iki tip sayfa var. Kullanıcı eğer adminse, şifreyle giriş yaptıysa, yönetim yani admin paneli. Eğer giriş yapmadıysa, herkesin göreceği sayfa ve menüler. Eğer o sayfa sistemde yoksa, 404 yani sayfa bulunmadı mesajı göstermeliyiz. Kullanıcıların göreceği sıradan sayfaların bileşenleri neler olacak? Bunları zaten HTML5 serisinde gözden geçirmiştik. Logo veya Site başlığı. Kategorilerin listesi. (Kategoriye tıklandığı zaman o kategori içerisindeki girdileri gösterecek.) Footer içinde de copyright bilgisi. Aslında daha çok bileşen eklenebilir ancak biz şimdilik bunları ekleyelim. [code language=”html”] <!doctype html> <html class="no-js" lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Site Başlığı</title> <link rel="stylesheet" href="css/foundation.css" /> <link rel="stylesheet" href="css/app.css...
Patreon üyelerine özel içerik.
To view this content, you must be a member of Mutlu's Patreon at "Merakli Bilişimci Üye..." or higher tier
Already a Patreon member? Refresh to access this post.

PHP ile içerik yönetim sistemi – 6 Veriyi html’ye çeviren PHP dosyaları

Kalan işlerimizi gözden geçirelim. Uygulama için konfigürasyon dosyası yazmak. Veritabanı bilgileri, saat dilimi gibi bilgileri tutsun. Veritabanı işlemlerini yapan sınıflarımız şimdilik oldukları gibi kalsınlar. Veri giren ve gösteren, düzenleyen formlarımızı tutan sayfalarımızı oluşturalım. Ama bu adımdan önce gereksiz kullanıcı girişlerini önlemek için oturum açalım. Kullanıcılar sınıfını oluşturalım. Bunun için admin bölümü sayfalarını oluşturalım. En son olarak tüm programımızı yönetecek olan dosyalarımızı oluşturup sınıflarımızı bitirelim. Lego gibi minik minik parçaları birleştireceğiz. Bu parçaları oluştururken dikkat etmemiz gereken şey, daha sonra farklı projelerimzde de bu parçaları alıp kullanabiliyor olmamız. Bu yazıda ihtiyaç duyacağımız sayfa ve formları oluşturacağız. İçerik yönetim sistemi sayfaları nelerden oluşur peki? Konuya veri açısından bakarsak 2 çeşit sayfamız var. Birincisi bilgi girişi yaptığımız sayfalar, ikincisi bilgi çıkışı yaptığımız sayfalar. Konuya kullanıcı açısından bakarsak, herkese açık olan sayfalar ve yöneticiler için olan admin paneli. Örneğin...
Patreon üyelerine özel içerik.
To view this content, you must be a member of Mutlu's Patreon at "Merakli Bilişimci Üye..." or higher tier
Already a Patreon member? Refresh to access this post.

PHP ile içerik yönetim sistemi – 5 Gereksiz kod tekrarlarından kaçınmak ve hataları başından önlemek

Kalan iki sınıfımız daha var. Kategoriler ve Resimler. Bir önceki bölümde hazırladığımız gibi, diğer iki sınıf dosyasını da hazırlayalım: Kategoriler sınıfı: [code language=”php”] <?php /** * Tüm sistemdeki kategorileri yönetecek olan kategori sınıfıdır. * * Sistemdeki kategorilerin düzenlenmesini, silinmesini, görüntülenmesini, * listelenmesini ve eklenmesini kontrol eden sınıftır. * * @author Midori Kocak <mtkocak@mtkocak.net> */ class Categories{ /** * Kategorinin tekil id’sini tutan değişken. Başka kategorilerle karışmamasını sağlar * * @var int */ public $id; /** * Kategori başlığı * * @var string */ public $title; /** * Veritabanı bağlantısını tutacak olan değişken. * * @var PDO */ private $db; /** * Veritabanına bağlanmaya yarayan yardımcı metod * * @param string host Veritabanı sunucusunun adresi * @param string dbname Veritabanı adı * @param string username Kullanıcı adı * @param string password Parola * @return string bağlanılabildiyse doğru, bağlanamadıysa hata mesajı döndürsün. */ public function connect($host, $username, $password, $dbname){ tr...
Patreon üyelerine özel içerik.
To view this content, you must be a member of Mutlu's Patreon at "Merakli Bilişimci Üye..." or higher tier
Already a Patreon member? Refresh to access this post.

PHP ile içerik yönetim sistemi – 4 Sınıflarımızı yazmaya başlayalım.

Bir önceki örneğimizde sınıfımızdaki metodların içlerini boş bırakmıştık. Şimdi tek tek bu metodların içlerini dolduracağız. Öncelikle veritabanına bağlanacağız. Ancak bu bağlantıyı, sınıf çalışıyorken bir değişkende tutmamız gerek. [code language=”php”] /** * Veritabanı bağlantısını tutacak olan değişken. * * @var PDO */ private $db; /** * Veritabanına bağlanmaya yarayan metod * * @param string host Veritabanı sunucusunun adresi * @param string dbname Veritabanı adı * @param string username Kullanıcı adı * @param string password Parola * @return string bağlanılabildiyse doğru, bağlanamadıysa hata mesajı döndürsün. */ public function connect($host, $username, $password, $dbname){ try { return $this->db = new PDO(&quot;mysql:host=&quot;.$host.&quot;;dbname=&quot;.$dbname.&quot;&quot;, &quot;&quot;.$username.&quot;&quot;, &quot;&quot;.$password.&quot;&quot;); } catch ( PDOException $e ){ return $e->getMessage(); } } [/code] Korkuttu mu? Korkutmasın. Tek tek bakalım: Sınıfımızın genelinde kullanacağımız $db değşke...
Patreon üyelerine özel içerik.
To view this content, you must be a member of Mutlu's Patreon at "Merakli Bilişimci Üye..." or higher tier
Already a Patreon member? Refresh to access this post.

PHP ile içerik yönetim sistemi – 3 Sınıf taslakları

PHP ile içerik yönetim sistemi yazmaya devam ediyoruz, yapacağımız bütün işleri belirledik, şimdi sıra geldi sınıflarımızın taslaklarını hazırlamaya. 3 adet sınıfımız olacak, Posts (Girdiler), Categories (Kategoriler) ve Files (Dosyalar). Basit bi şekilde, içerik girme (add), bir adet görüntüleme (view), düzenleme (edit), silme (delete) ve listeleme (index) işlemlerini hepsinde yapacağız. Biz öncelikle girdilerden başlayalım. Taslak olarak sınıfımızı oluşturalım. Henüz fonsiyonlarımızın (metodlarımızın) içini doldurmayacağız. <?php /** * Tüm sistemdeki girdileri yönetecek olan girdi sınıfıdır. * * Sistemdeki girdilerin düzenlenmesini, silinmesini, görüntülenmesini, * listelenmesini ve eklenmesini kontrol eden sınıftır. * * @author Midori Kocak <mtkocak@mtkocak.net> */ class Posts{ /** * Girdinin tekil id'sini tutan değişken. Başka girdilerle karışmamasını sağlar * * @var int */ public $id; /** * Girdi başlığı * * @var string */ public $title; /** * Girdinin içeriği * * @var string */ public $content; /** * Girdinin hangi tarihte oluşturulduğunu gösteren değişken * * @var str...
Patreon üyelerine özel içerik.
To view this content, you must be a member of Mutlu's Patreon at "Merakli Bilişimci Üye..." or higher tier
Already a Patreon member? Refresh to access this post.

PHP ile içerik yönetim sistemi yazalım – 2 – Yapılacak işler

PHP ile içerik yönetim sistemi yazmaya azimliyiz. Temel SQL bilgimizle veritabanını modellemeyi de öğrendik. Ara yazı olarak öncelikle neler yapmamız gerektiğini planlamalıyız. Aslında bu adımlar genel olarak yazacağınız ‘personel yönetim sistemi’, ‘müşteri ilişkileri yönetimi’ gibi yazılımlarda da aynı. Şimdi baştan itibaren attığımız ve atacağımız adımları inceleyelim ve planlayalım: Mantıksal modelleme, yani sistemi ne için kullanacağız. Bunlara karar verdik, bir önceki yazıda hallettik. Veritabanı modelleme, bunu da MySQL workbench programını nasıl kullanacağımızı öğrenerek hallettik. PHP sınıflarını oluşturma. Yani kullandığımız mantığı, yazılımsal temele oturtma. Bundan lütfen korkmayın. Spaghetti öğretmiyorum çünkü insanlar bu adımı öğrenmiyorlar ve bir sürü anlamsız kod çöpleri ile boğuşuyorlar. Buna alıştığınızda inanın neden OOP yani nesne yönelimili programlama diye ısrar ettiğimizi anlayacaksınız. Kendinize yapacağınız en yararlı yatırım olacak. İlk adımda sınıfları taslak olarak oluşturacağız. Her nesnenin, özellik ve metodlarına karar vereceğiz....
Patreon üyelerine özel içerik.
To view this content, you must be a member of Mutlu's Patreon at "Merakli Bilişimci Üye..." or higher tier
Already a Patreon member? Refresh to access this post.

Temel SQL serisi, SON SQL-5 Sayfalama ve Arama işlemleri

Bir sürü şeyi hallettik. Veri ekleme, düzenleme, güncelleme ve silme. Bir de birleştirme. Geriye ne kaldı? Görelim bakalım.. Tüm yazıların başlıklarının olduğu bir liste göstermek. Kategori eklemek, silmek, düzenlemek. Kategori içindeki yazıları göstermek Ayrıca yazı başlıklarını gösterirken, sayfalama yapmak, her sayfada 20 yazı göstermek, 2. sayfada bir sonraki 20 yazıyı yani 20 ile 40 arası yazıları göstermek Arama yapmak Başlık listesi görüntülememek de çok kolay. SELECT title FROM posts; Bu komutu yazdığımız zaman Girdilerden sadece başlıkların olduğu listeyi çekebiliyoruz. 2. maddedeki ekleme, silme, düzenleme işlemlerinden zaten bahsetmiştik. Kategori içindeki yazıları da verileri birleştirerek alıyoruz. Bunu da bir önceki yazıda hallettik. Sayfalama Sayfalama dediğimiz olay, örneğin 1 milyon makale olan bir internet sitesinde, hiçbir kısıtlama olmadan “SELECT * FROM posts” dersek, hem kullanıcı bir milyon makalenin inmesini bekler, hem de bu veriyi çeken yazılım da belirli bir süre sonra timeout olur, yani sonsuza dek sistemin bu işleme kilitlenmesini engellemek i...
Patreon üyelerine özel içerik.
To view this content, you must be a member of Mutlu's Patreon at "Merakli Bilişimci Üye..." or higher tier
Already a Patreon member? Refresh to access this post.