11 Mart 2015 Çarşamba

CodeIgniter - 5 - Sıfırdan Dinamik Site Kodlaması


Not: Bu yazı dizisi ne yazık ki burada bitiyor. Vaktiyle konuyu tamamlamadan bıraktığım bu yazıyı devam ettiremiyorum çünkü çok uzun zamandır CodeIgniter kullanmıyorum. En baştan, bu yazının tamam olmadığını ve tamamlanmayacağını belirtmek isterim. Kolay gelsin...



Eveet, geldik CodeIgniter'ın en önemli mevzuuna: Veritabanı işlemleri...

Bu yayında, örnek bir proje geliştireceğiz. Projemizde şu özellikler olacak:
1- Kullanıcıları karşılayan, içeriğini veritabanından çeken bir AnaSayfa
1.1 - Anasayfamızda bir resim listesi ve resimlerin altında açıklamaları yer alacak
2 - Anasayfayı yönetmek için bir yönetim paneli
2.1 - Yönetim paneli girişi için bir sayfa
2.2 - Resimlerin silinmesi veya yeni resim eklenmesi için bir sayfa

Bu basit projemize sıfırdan başlayalım:

1) Öncelikle projemiz için, localhost'umuzda bir klasör açalım: site.com
> Ben XAMPP kullandığımdan, yolum şu şekilde: C:\xampp\htdocs\site.com\

2) İnternetten edindiğimiz CodeIgniter dosyalarımızı, bu klasör içine atalım.
> application, system klasörleri ve index.php dosyası

3) site.com klasörümüzde .htaccess dosyası oluşturalım ve içine standart kodlarımızı yazalım:

RewriteEngine on
RewriteCond $1 !^(index\\.php|resources|robots\\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L,QSA]

5 yayındır .htaccess dosyası oluşturun diyorum ama bunu oluştururken sorun yaşayanlar olabilir diye yazmak istedim: Yeni bir notepad metin belgesi oluşturun. İçine yukarıdaki kodları yazın. Farklı kaydet deyin ve dosyanın adına (çift tırnaklar ve başındaki nokta da dahil) şunu yazıp Kaydet deyin: ".htaccess"

4) PhpMyAdmin ile yeni bir veritabanı oluşturalım. Adına da site_vt diyelim.

5) site_vt adlı veritabanımızda, şu tablolarımız ve sütunlarımız bulunsun:

resimler [4 sütun] > id [int], resim [varchar(20)], tarih [timestamp], sira [varchar(5)]
anasayfa [4 sütun] > id [int], title [text], description [text], keywords [text]
admin [3 sütun] > id [int], user [varchar(50)], pass [varchar[50]

6) application/config/database.php dosyasını açalım ve şu satırları değiştirelim:

$db['default']['hostname'] = 'localhost'; // localhost'ta çalışacağız
$db['default']['username'] = 'root'; // PhpMyAdmin'e girerken kullandığınız kullanıcı adı
$db['default']['password'] = '1234'; // PhpMyAdmin'e girerken kullandığınız şifre
$db['default']['database'] = 'site_vt'; // Malum, veritabanı adımız

7) application/config/config.php dosyasını açalım ve şu satırları değiştirelim:

// Tarayıcımız yolunu kaybetmesin, sitenin ana yolunu bilsin diye:
$config['base_url'] = 'http://localhost/site.com/';

// URL'lerde Türkçe karakter sorunu yaşamamak için:
$config['permitted_uri_chars'] = 'a-üöçşığz A-ÜÖÇŞİĞZ 0-9~%.:_\-';

8) application/config/autoload.php dosyasını açalım ve şu satırları değiştirelim:

$autoload['libraries'] = array('database'); // Her sayfada veritabanı işlemi yapacağız

$autoload['helper'] = array('url'); // URL yapımızla ilgili her sayfada işlem yapacağız

9) application/config/routes.php dosyasını açalım ve şu satırı değiştirelim:

$route['default_controller'] = 'anasayfa'; // Varsayılan giriş sayfası anasayfa olacak.

10) Dilerseniz, site.com dosyanızı bu haliyle başka bir yere de kaydedin. Böylece her yeni siteye başladığınızda bu ayarları tekrar tekrar yapmak zorunda kalmak yerine, sadece yeni projenin gerektirdiği bölümleri değiştirirsiniz.

11) Sitemizi kodlamaya giriş olarak, anasayfa adlı controller'ımızı kodlamaktan başlayalım.
applications/controllers/ klasörü altına anasayfa.php adlı bir controller dosyası oluşturun. (routes.php dosyasında yaptığımız değişiklikle, site açıldığında ilk olarak bu controller'ın çalışmasını istedik) Bu controller'ımızın içinde, şu kodlarımız yer alsın:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class anasayfa extends CI_Controller
{
    public function __construct() {
        parent::__construct();
    }

    public function index() {
        $this->load->view('anasayfa_view');
    }
}


Sayfa açıldığında ilk olarak elbette kurucu fonksiyon çalışacak. Daha sonra, URL yapısında* herhangi bir parametre bulunmadığı için, varsayılan olarak index() adlı fonksiyon çalışacak. Gördüğünüz gibi, index() fonksiyonunda da şu an için yalnızca, anasayfa_view adlı view dosyasının gösterilmesi komutunu vermişiz. Bu controller'ımızı, daha sonra dönmek üzere bu haliyle kaydedelim ve anasayfa_view adlı view'imizi tasarlayalım. Çünkü artık bir HTML sayfası görmenin vakti geldi...

*URL yapımız, CodeIgniter mantığında şudur:
http://localhost/site.com/[controller adı]/[fonksiyon adı]/[fonksiyona giden parametre]

12) application/views/ klasörü altına, anasayfa_view.php adlı bir dosya oluşturalım ve içine, şu HTML kodlarını yazalım:

<!DOCTYPE HTML>
<html lang='tr-TR'>
<head>
    <meta charset='UTF-8'>
    <title>Başlık</title>
    <meta name='description' content='Açıklama' />
    <meta name='keywords' content='Anahtar Kelimeler' />
    <base href='<?=base_url()?>'>
    <link href='assets/css/style.css' rel='stylesheet' />
</head>
<body>
    <div id='resim-listesi'>
        <div class='resim-kutusu'>
            <div class='resim'><img src='assets/images/1.jpg' /></div>
            <div class='metin'>Örnek resim metni</div>
        </div>
    </div>
</body>
</html>


13) Sayfamızı çalıştırmadan önce, bir CSS dosyası ve bir de resimler için klasör oluşturalım.
Kök klasörümüzün (site.com) içine, assets adlı bir klasör oluşturun. Bu klasörün de içine images ve css adında iki klasör oluşturun. images klasörünün içine 1.jpg adında herhangi bir resim dosyası atın. css klasörünün içine de, style.css adında bir dosya oluşturun ve içine şunları yazın:

* { margin:0; padding:0; box-sizing:border-box; transition:all .3s ease; }
body { font-family:Arial; cursor:default; font-size:14px; letter-spacing:0.5px;  }
#resim-listesi { margin:10px; }
#resim-listesi .resim-kutusu { margin-bottom:10px; }
#resim-listesi .resim-kutusu .resim img { max-width:300px; max-height:200px; }
#resim-listesi .resim-kutusu .metin { background:#ccc; padding:10px; }

14) Şimdi sayfamızı görüntüleyelim. Tarayıcımıza localhost/site.com yazalım. Resmimiz görüntülenmiş olmalı.

15) Şimdi sıra geldi, anasayfa adlı controller'ımızdan bu sayfaya veri göndermeye...
application/controllers/anasayfa.php dosyamızı tekrar açalım ve index() fonksiyonumuzu şu şekilde değiştirelim:

public function index() {
    $data['title'] = 'Site Başlığı';
    $data['description'] = 'Site Açıklaması';
    $data['keywords'] = 'anahtar kelime 1, anahtar kelime 2, ...';
    $this->load->view('anasayfa_view',$data);
}

Şu an için verileri veritabanından çekmek yerine, kendimiz veriyoruz. Şimdi bu verileri view dosyamızda okumak üzere, view dosyamızı açalım.
application/views/anasayfa_view.php dosyamızı tekrar açalım ve head tagı içinde şu değişiklikleri yapalım:

<head>
    <meta charset='UTF-8'>
    <title><?=$title?></title>
    <meta name='description' content='<?=$description?>' />
    <meta name='keywords' content='<?=$keywords?>' />
    <base href='<?=base_url()?>'>
    <link href='assets/css/style.css' rel='stylesheet' />
</head>

Şimdi yeniden deneme zamanı. Tarayıcımıza localhost/site.com yazarak, title, description ve keywords taglarına istediğimiz şekilde değerler yazılmış mı kontrol edelim. (Sayfanın kaynağını görüntüleyerek bu kontrolü sağlayabilirsiniz.) Böylelikle, controller'ımızdan view'ımıza veri göndermiş olduk. Şimdi sıra geldi, controller'ımızın bu verileri veritabanından çekmesine...

16) Nihayet, esas konumuza geldik. Veritabanı işlemlerini nasıl yaparız? Diğer bir deyişle, model katmanından controller katmanına nasıl veri çekeriz?
application/models/ klasörü altına, anasayfa_model.php adlı bir dosya oluşturalım ve içine şunları yazalım:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class anasayfa_model extends CI_Model
{  
    function __construct() {  }

    public function get_sayfa_verileri()
    {
        $this->db->select('title,description,keywords');
        $this->db->from('anasayfa');
        $sorgu = $this->db->get();
        $satir = $sorgu->row_array();
        return $satir;
    }
 }

Eğer CodeIgniter'ı benim yayınlarımdan öğrenmeye çalışıyorsanız, şu an ilk kez gördüğünüz birçok komutla karşılaştınız demektir. Aslında satırları inceleyecek olursanız, mantığın çok basit olduğunu görebilirsiniz. CodeIgniter sayesinde, SQL komutları yazmıyoruz. Daha şirin görünen komutlarla SQL sorgumuzu oluşturuyoruz. Satırları tek tek açıklamakta fayda görüyorum:

class anasayfa_model extends CI_Model
Bu satırımızda, modelimizin adını belirtiyor ve özelliklerini, CI_Model adlı class'dan miras alıyor.

public function get_sayfa_verileri()
Bu satırımızda, controller'ımızdan çağıracağımız fonksiyonumuzun adını belirtiyoruz. Neden fonksiyon adının başına get_ diye bir bölüm ekledim? Bu benim alışkanlığım. Bir veri çağıracaksam get_ derim, güncelleyeceksem update_ derim, ekleyeceksem set_ derim. Mecbur muyuz? Hayır.

$this->db->select('title,description,keywords');
SQL sorgumuzun SELECT title,desctiption,keywords FROM anasayfa bölümünü temsil ediyor. Alan adlarını tek tek yazmak zorunda mıydım? Hayır. Tüm alanları çekmek isteseydim, şöyle bir komut kullanabilirdim: $this->db->select('*');

$this->db->from('anasayfa');
SQL sorgumuzun SELECT title,description,keywords FROM anasayfa bölümünü temsil ediyor.

$sorgu = $this->db->get();
SQL sorgumuz çalıştırılıyor ve sonuç, $sorgu değişkenine aktarılıyor.

$satir = $sorgu->row_array();
Bu satırda istiyoruz ki, tek satırlık (olduğunu bildiğimiz) sorgu sonucumuz, bir diziye aktarılsın. row_array() dan anlamamız gereken budur. Bu iş neticesinde sütunlarımızı şu şekilde okuyabileceğiz: echo $satır['title'];

return $satir;
Controller ve Model katmanlarında (amacımız test etmek değilse) echo komutu kullanmayız. Bu katmanlar yalnızca veri iletimi yaparlar. Biz de bu satır sayesinde, model katmanımızda elde ettiğimiz $satir adlı diziyi, controller katmanından yakalanması için döndürüyoruz.

Şu an bazı şeyleri anladınız, bazı konularda da kafanızda soru işaretleri oluştu. Mesela tek satır değil de daha çok satır çekseydik, row_array() yerine ne yazmamız gerekirdi? Şu an bilmeniz gerekmeyen bu konuya, kafanızda soru işaretiyle devam etmemeniz için cevap veriyorum: result_array()
Bu komut ile elde ettiğiniz diziyi, foreach döngüsü yardımıyla satır satır okuyabilirsiniz. Sonraki adımlarda bu konunun da örneğini yapacağız...

Diğer bir soru da, peki ya WHERE koşuluyla arama yapmamız gerekseydi ne yapacaktık? Aslında bu konuda fikir yürüterek bir sonuca varmışsınızdır ama emin değilsinizdir. Daha sonra bunun da örneğini yapacağız ama şimdilik buna da cevap vermiş olalım. SQL sorgusunu çalıştırdığımız satırdan ($sorgu = $this->db->get(); satırından) önce şunu yazardık: $this->db->where('id',5);
Peki ya verileri sıralı çekmek isteseydik?
ORDER BY sira ASC için kodumuz: $this->db->order_by('sira');
ORDER BY sira DESC için kodumuz: $this->db->order_by('sira','DESC');

Daha merak ettiğiniz çok şey var biliyorum. Ama acele etmeyelim ve projemize devam edelim. Şu anda model katmanındaki dosyamızı oluşturduk ve ilk fonksiyonumuzu yazdık. Peki controller katmanında bu veriyi nasıl çağıracağız? Cevabı sonraki adımda:

17) application/controllers/anasayfa.php dosyamızı tekrar açalım ve index() fonksiyonumuzda şu değişiklikleri yapalım:

public function index() {

    $this->load->model('anasayfa_model'); // Model dosyamızı çağırıyoruz

    $veriler = $this->anasayfa_model->get_sayfa_verileri(); // Model'deki fonksiyonumuz...

    $data['title'] = $veriler['title'];
    $data['description'] = $veriler['description'];
    $data['keywords'] = $veriler['keywords'];
    $this->load->view('anasayfa_view',$data);
}

İşte bu kadar. Zaten daha önceden, veritabanından verileri çekmeden önce, verilerimizi $data adlı diziyle view'imize göndermiştik. Şimdi bu $data değişkenimizin değerlerini, veritabanından çektiğimiz değerlerle değiştirmiş olduk. Şimdi tarayıcıyı açıp çalıştırsak çalışır mı peki? Çalışmaz. Çünkü, veritabanında sorgu sonucunda hiç değer dönmüyor. Çünkü veritabanına değer girmedik! O halde, PhpMyAdmin üzeinden veritabanımızdaki anasayfa adlı tabloyu açın ve tek satırlık verilerimizi girin. Daha sonra localhost/site.com diyerek, sonucu görebilirsiniz...

18) Şimdi anasayfada resimlerin listelenmesinden önce, yönetim panelini kodlamaya geçelim. Yönetim panelimiz için tek bir controller kullanalım. Yani admin girişini de bu controller halletsin, resim ekleme ve silme işlemini de...
Önceki derslerimizden bildiğiniz gibi, eğer bir sayfa ekleyeceksek bu sayfa için controller oluşturuyor ve bu controller ile bir view çağırıyorduk. Bunu her sayfa için ayrı ayrı yapıyorduk. Ancak yönetim panelimizde, farklı bir yöntem kullanacağız. yonetimpaneli adında tek bir controller'ımız olacak ve bu controller, birçok view sayfasını yönetecek. Uygulamada daha iyi anlayacaksınız.
application/controllers/ klasörü içine yonetimpaneli.php adlı bir sayfa oluşturun ve şu kodları yazın:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class yonetimpaneli extends CI_Controller
{
    public function __construct() {
        parent::__construct();
    }

    public function index() {
        $this->load->view('yonetimpaneli/giris_view');
    }
}

Gördüğünüz gibi, yonetimpaneli adlı controller'ımızın varsayılan fonksiyonu olan index()'de, yonetimpaneli klasörü altındaki giris_view adlı view'ı çağırıyoruz. Şimdi, admin'in kullanıcı adı ve şifresiyle giriş yapacağı bu view'ımızı oluşturalım.

19) application/views/ klasörü altına, yonetimpaneli adlı bir klasör açın. (Bu klasörün adıyla controller'ımızın adının aynı olması tamamen benim tercihim. Böyle bir zorunluluk yok.) Neden böyle bir klasör açtık diye sorarsanız: Sitenin normal sayfalarıyla, yönetim paneli sayfaları birbirinden ayrı dursun, karışmasın, aradığımız view'ı rahatça bulabilelim diye...
Şimdi bu yonetimpaneli klasörünün içine, giris_view.php adında bir dosya oluşturun ve içine şunları yazın:

<!DOCTYPE HTML>
<html lang='tr-TR'>
<head>
    <meta charset='UTF-8'>
    <title>Yönetim Paneli</title>
    <base href='<?=base_url()?>'>
    <style>#uyari { color:#f22; padding:20px; border:1px solid #f22; margin:20px; }</style>
</head>
<body>
    <?= $uyari ) ? '<div id="uyari">' . $uyari . '</div>' : ' ' ?>
    <form method='post'>
        <input type='text' name='user' placeholder='Kullanıcı Adı' />
        <input type='text' name='pass' placeholder='Şifre' />
        <input type='submit' value='Oturum Aç' />
    </form>
    <div><a href='anasayfa'>Siteye Dön</a></div>
</body>
</html>

Çok basit ve tasarım çalışması yapılması gereken bir form sayfamız oldu. Konumuz tasarım olmadığı için CSS'e fazlaca girmek istemiyorum. Şu an sayfamızda üç tane yan yana dizilmiş input'umuz, henüz görünmese de bir uyarı div'imiz ve bir de bizi anasayfa'ya yönlendiren link'imiz var. Sayfamızı çalıştırmak istediğimizde bir hata alacağız, çünkü $uyari değişkeni oluşturmadık. Bunu controller'ımızdan oluşturacağız ve bu sayfaya göndereceğiz. (uyarı verilen satırdaki yazım şeklini bilmeyenler olabilir diyerek, o satırın ne iş yaptığını anlatmak istiyorum.
Bu satır: <?= $uyari ? '<div id="uyari">' . $uyari . '</div>: ' ' ?> ve
bu satır: <?php if $uyari echo '<div id="uyari">' . $uyari . '</div>'; else echo ' '; ?>
aynı işi yapar.

20) application/controllers/yonetimpaneli.php adlı controller dosyamızı tekrar açalım ve şu değişiklikleri yapalım:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class yonetimpaneli extends CI_Controller
{
    public function __construct() {
        parent::__construct();
    }

    private function OturumKapaliMi()
    {
        $this->load->library('session');
        if($this->session->userdata('login')==true)
        redirect(base_url().'yonetimpaneli/resimyonetimi');
    }
    private function OturumAcikMi()
    {
        $this->load->library('session');
        if($this->session->userdata('login')==null)
        redirect(base_url().'yonetimpaneli');
    }
    public function oturumkapat()
    {
        $this->load->library('session');
        $this->session->unset_userdata('login');
        redirect(base_url().'yonetimpaneli');
    }

    public function index() {
        $this->OturumKapaliMi();

        $data['uyari'] = '';

        if( $this->input->post() ) { // Sayfaya veri post edilmişse...
            $user = $this->input->post('user'); // kullanıcı adını $user değişkenine at
            $pass = $this->input->post('pass'); // şifreyi $pass değişkenine at

            $this->load->model('yonetimpaneli_model');
            $admin = $this->yonetimpaneli_model->get_admin();

            if( $user == $admin['user'] && $pass == $admin['pass'] ) {
                $this->load->library('session');
                $this->session->set_userdata('login',true);
                redirect(base_url()."yonetimpaneli/resimyonetimi");
            }
            else $data['uyari'] = 'Kullanıcı adı ve şifre kombinasyonu hatalı...';
        }
     

        $this->load->view('yonetimpaneli/giris_view', $data);
    }
}

Böylelikle, bir sürü yeni komut görmüş oldunuz. Şimdi teeek tek bu komutların ne anlama geldiğini ele alalım bakalım...

İki adet private fonksiyonumuz olan OturumKapaliMi() ve OturumAcikMi() ne iş yaparlar? Bunları yazmamızdaki amaç şudur: Oturumun açık olup olmadığını kontrol etmek... index() fonksiyonumuzun ilk satırında, $this->OturumKapaliMi(); adlı fonksiyonu çağırdığımıza dikkat edin. Orada, şunu kontrol ediyoruz: Bu sayfayı görüntüleyen adamın oturumunun kapalı olması gerekir (ki oturum açmak için bir form görüntülüyor) de, bu adamın oturumu şu an kapalı mı ki? Fonksiyon, eğer oturum açmış biri bu sayfayı görüntülemeye çalışırsa, onu direkt yönetim panelinin iç sayfalarına (resimyonetimi sayfasına - evet, henüz böyle bir sayfamız yok) yönlendiriyor. Facebook gibi düşünün. Eğer oturumunuz açıksa, Facebook'a girdiğinizde oturum açmanız için hazırlanmış giriş sayfasını görmezsiniz. Direkt ana sayfaya yönlendirilirsiniz. Bizdeki de o hesap... OturumAcikMi() fonksiyonunu henüz kullanmadık. O fonksiyonu, sadece oturumu açık kişilerin görebileceği sayfaların başında kullanacağız ki, oturum açmamış biri o sayfalara bir şekilde (mesela URL'ye yazarak) erişmeye kalkarsa, sayfayı göremeden, oturum açması için index() fonksiyonunun sayfasına (giris_view) yönlendirilsin.

$this->load->library('session');
CodeIgniter'da nasıl ki view'leri, model'leri controller'ımıza çağırmak için bu load zımbırtısını (controller'ımıza extends ettiğimiz CI_Controller sınıfıyla gelen load sınıfını) kullanıyorsak, oturum işlemleri yapmak için de CodeIgniter'ın library'sinden (applications/library klasörü) session class'ını çağırmamız gerekiyordu ve bu komutla çağırmış oluyoruz... Böylelikle, CodeIgniter'ın $_SESSION yönetimi yapan komutlarını kullanabiliyoruz.

if($this->session->userdata('login')==true) { ... }
Standart PHP'deki karşılığı şudur: if ( $_SESSION['login'] == true ) { ... }

redirect(base_url().'yonetimpaneli/resimyonetimi');
yonetimpaneli adlı controller'ın resimyonetimi() fonksiyonunu çalıştır. (Evet, henüz resimyonetimi() fonksiyonunu yazmadık.) Diğer bir deyişle, şu URL'ye yönlendir:
http://localhost/site.com/yonetimpaneli/resimyonetimi

redirect(base_url().'yonetimpaneli');
yonetimpaneli adlı controller'a yönlendir. Diğer bir deyişle, şu URL'ye yönlendir:
http://localhost/site.com/yonetimpaneli
Diğer bir deyişle, yonetimpaneli controller'ının index() fonksiyonunu çalıştır.

public function oturumkapat() { ... }
Bu fonksiyonumuzun amacı, adı üzerinde, oturum kapatmak. Eğer biz oturum açmış kullanıcımıza şu yönlendirmeyi yaparsak, bu fonksiyon çalışacaktır:
http://localhost/site.com/yonetimpaneli/oturumkapat

$this->session->unset_userdata('login');
login adlı SESSION'ı yok et... Biz bu projemizde sadece login adlı SESSION ile oturum kontrolü yapıyoruz. Siz elbette $_SESSION dizisi üzerinden başka veriler de oluşturabilirsiniz. Biz şu an bu projemizde güvenlik önlemi almıyoruz. Güvenlik, başka bir yayınımın konusu olacak.

$user = $this->input->post('user');
Standart PHP'deki karşılığı: $user = $_POST['user']; (Evet, hiç güvenli değil biliyorum.) CodeIgniter'da mecbur muyuz post edilen veriyi input class'ı yardımıyla çekmeye? Hayır. Standart PHP'deki gibi kullansanız da olur. Ama elinizden geldiğince CodeIgniter'daki şekliyle kullanın ki, öğrenin. Çünkü CodeIgniter, buna ek olarak birçok özellik sunmaktadır. Mesela kodumuz şöyle olsaydı: $user = $this->input->post('user',true); post edilen veri, zararlı kodlardan arındırılmış olurdu... CodeIgniter komutlarına alışın ki, onların özelliklerinden faydalanın. (input class'ı, başka bir yayınımın konusu olacak. Şimdilik konudan sapmayalım...)

$this->load->model('yonetimpaneli_model');
$admin = $this->yonetimpaneli_model->get_admin();
Bu iki satırın ne yaptığını merak ediyor musunuz? 17.adımda anlattığım örneği inceleyin. Bu satırların işlevini burada açıklamamamın nedeni sizi sinir etmek değil elbet. Bu şekilde, daha iyi öğrenirsiniz diye düşünüyorum.

$this->session->set_userdata('login',true);
login adlı SESSION'ımızı burada oluşturuyor ve true değeri atıyoruz.

Umarım açıklayıcı olabilmişimdir. Bu 20.adımda size çok yüklendim, ilk kez gördüğünüz (tabi CodeIgniter'ı bu blog'dan takip ederek öğreniyorsanız) bir sürü komutu önünüze yığdım. Neyse ki bu canlı bir ders değil de, geriye dönüp tekrar tekrar okuma ve rahatça not alma şansınız var.

Şimdi iki görevimiz var:
Birincisi, PhpMyAdmin'e girip, veritabanımızdaki admin adlı tablomuza veri girmek. user sütununa admin, pass sütununa 123 yazın. Bu, kolay görevdi.
İkincisi, controller'ımızda çağırdığımız yonetimpaneli_model adlı model dosyamızı oluşturmak ve get_admin() adlı fonksiyonumuzla, admin tablosundaki verileri çekip return etmek... Bu arada, aklınıza takılmış olabilir. view dosyalarına _view diye yazıyorduk ve bu tamamen bizim keyfimize kalmış bir durumdu. (anasayfa_view.php, giris_view.php gibi) Daha önceki yayınlarımda yazdım mı bilmiyorum ama yazdıysam da yine yazayım. Model dosyalarında _model ekini koymamız mecburi bir durum. (anasayfa_model.php, yonetimpaneli_model.php gibi) Bunu da söyledikten sonra, ikinci görevimizi 21.adımda gerçekleştirelim...

21) application/models/ klasörü altına yonetimpaneli_model.php dosyası oluşturun ve şunları yazın:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class yonetimpaneli_model extends CI_Model
{
    function __construct() {  }

    public function get_admin()
    {
        $this->db->select('user,pass');
        $this->db->from('admin');
        $sorgu = $this->db->get();
        $satir = $sorgu->row_array();
        return $satir;
    }
}

Böylelikle, admin girişi yapan sayfamız da hazır... Gördüğünüz gibi sitemiz bir üyelik sistemi barındırmıyor. Yalnızca yönetim paneli için, yalnızca tek bir admin için giriş yaptıryoruz. Ancak mantığı kavradığınızda, üyelik sistemi de kodlayabilirsiniz.

Şu anda neler oldu? Adminimiz yönetim panelinin giriş sayfasına giriyor. Kullanıcı adını ve şifresini yazıp oturum açıyor ve yonetimpaneli controller'ımızın resimyonetimi fonksiyonuna yönlendiriliyor. Burada resim ekleme, güncelleme ve silme işlemlerini yapacağız ve yönetim panelimizi tamamlamış olacağız. Daha sonra bu yönetim panelimizi kullanarak images klasörümüze ve veritabanımıza resimler ekleyeceğiz. Sonra da, 18.adımda yarım bıraktığımız anasayfa'da resimlerin listelenmesi olayını gerçekleştirerek, yayınımızı tamamlayacağız.

22) application/controllers/yonetimpaneli controller'ımızı açalım ve index() fonksiyonumuzun altına şu eklemeleri yapalım:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class yonetimpaneli extends CI_Controller
{
    public function __construct() {
        parent::__construct();
    }

    private function OturumKapaliMi() { ... }
    private function OturumAcikMi() { ... }
    public function oturumkapat() { ... }
 
    public function index() { ... }

    public function resimyonetimi($islem='',$silinecek_id='')
    {
        // Oturum açık mı? Çünkü oturum açık değilse, bu fonksiyon çalışmamalı...
        $this->OturumAcikMi();

        $data['uyari'] = '';

        if( $islem == 'ekle' ) 
        { 
             // yonetimpaneli/resimyonetimi/ekle URL'si gelirse yapılacak işlemler

             $data['uyari'] = 'Resim eklendi';
        }        
        elseif( $islem == 'guncelle' )
        {
             // yonetimpaneli/resimyonetimi/guncelle URL'si gelirse yapılacak işlemler

            $data['uyari'] = 'Resim güncellendi';
        }
        elseif( $islem == 'sil' )
        {
             // yonetimpaneli/resimyonetimi/sil/1 şeklinde bir URL gelmiş olmalı...
             // Silme işlemi için URL'de sil parametresinden sonra gelen parametremiz
             // id parametremiz olacak. Bu parametrenin, integer bir sayı olması gerekiyor.
             $id = (int)$silinecek_id+0;

            // Böylece $id değişkenimizde bir adet tam sayımız var. Eğer bu parametre
            // boş gönderilmişse ( URL: yonetimpaneli/resimyonetimi/sil )
            // veya id parametresi olarak sayı gelmemişse ( yonetimpaneli/resimyonetimi/şaka )
            // id değerimiz 0 olacak. Yani bir sorun var demektir... Kontrol edelim var mı:             
             if( $silinecek_id <= 0 )
             {
                  $data['uyari'] = 'Silinecek resim bilgisini veren parametrede sorun var.';
             }
             else
             {
                   // yonetimpaneli/resimyonetimi/sil/1 şeklinde bir URL gelirse yapılacak işlemler

                   $data['uyari'] = $id.' ID\'li resim silindi'; // 1 ID'li resim silindi
              }
        }

        $this->load->view('yonetimpaneli/resimyonetimi_view', $data);

    }
}

Bu yapıyı açıklamak gerekirse, URL'den resimyonetimi adlı fonksiyona parametreler gönderiliyor. URL içinde bu parametrelere göre farklı if kontrolleri çalışıyor. Buradaki amacım, yapılacak her işlem için (Güncelle, Ekle, Sil) yeni bir fonksiyon oluşturmamak... Böyle bir kullanım, bir fonksiyon içinde çok fazla komut birikmesine ve hata ararken yorulmamıza neden olur. (Ama ben genelde bu yapıyı kullanıyorum.)

Öncelikle, bu sayfanın HTML halini (view dosyasını) görmek için, resimyonetimi_view dosyamızı oluşturalım ve genel yapımızı görelim. Buna göre, controller'ın hangi verilere ihtiyacı olacağını daha iyi görebiliriz.

23) application/views/yonetimpaneli klasörü altına resimyonetimi_views.php adlı dosyamızı oluşturalım ve şunları yazalım:

--- YAYIN BURADA BİTİYOR. ---

<<< Umarım buraya kadar olan kısım faydalı olmuştur.  >>>

4 yorum:

  1. Yayınlarınızı yeni gördüm ve büyük bir zevkle okudum. Anlatımınız oldukça öğretici oluyor. Buraya kadar olan bölüm için çok teşekkür ederim.

    YanıtlaSil
  2. dersler için çok teşekkür ederim.hepsini okuyup uyguladım devamı gelirse cok iyi olur.Teşekkürler.

    YanıtlaSil
  3. Hocam açıkçası benim de blog sayfam var ve böylesi içerik oluşturmak çok zor.Yazı olarak okuyucu için bilginin bu kadar okunaklı ve anlamlı olması bir başarı. Ek olarak video çekmişseniz ya da çekmeyi düşünürseniz bilgilendirilmek isterim. Takip ediyorum.Birçok kez video izledim ancak yeterli görmedim. Örneklerinizde açıklamalarınızda oldukça iyi. İyi çalışmalar devamını bekliyorum.

    YanıtlaSil
  4. Ne yazık ki devamı yok. Çok uzun zaman önce yazdığım bu yazı dizisinden sonra CodeIgniter'ı kullanmaya devam etmedim. Şu an halen PHP kullanıyorum ama kendimce geliştirdiğim basit bir yapı üzerinden çalışıyorum. Umarım buraya kadar olan kısım faydalı olmuştur. Başka türde yayınlarda görüşmek üzere... :)

    YanıtlaSil

Site Haritası

CodeIgniter Yayınları 1. Merhaba Dünya : CodeIgniter'da Merhaba Dünya yazısını görün... 2. Template Sistemi : CodeIgniter ile sta...