Neler yeni

Foruma hoş geldin 👋, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

  • Forumdan daha fazla yararlanmak için, profilinizi telefon numaranız 📱 ile doğrulayın ve daha ayrıcalıklı olun 😉
    Daha fazla bilgi!

PHP ile Mvc framework oluşturma

Helper - Dosya Yükleme Fonksiyonu

Bu bölümde bir formdan dosya yükleme işlemlerini göreceğiz. Bu bölüm de, trait içerisindeki fonksiyonumuzu geliştirerek adım adım ilerleyip, gelişmiş bir upload (dosya yükleme) işlemi gerçekleştireceğiz. İlk olarak libraries dizini içerisinde dosya_yukleme.php adında bir dosya oluşturup aşağıdaki gibi kodluyoruz.

PHP:
<?php
/*
    * Dosya yükleme kütüphanesi
*/

trait Dosya_yukleme
{
    public function dosya($data)
    {
        
    }
}

?>

Daha sonra views dizini içerisindeki users.php dosyasını açıyoruz ve form_ac() alanını aşağıdaki form_multipart ile değiştiriyoruz.

PHP:
<?php echo form_multipart("profile/submit_form", "post", ['class' => 'form']); ?><br />

Şimdi de views dizini içerisindeki users.php dosyasını açıyoruz ve kullanici_adi inputunun altına aşağıdaki inputu ekliyoruz.

PHP:
<?php echo form_input(['type' => 'file', 'name' => 'image', 'id' => 'input-id', 'class' => 'form-control']); ?><br />

Şimdi de controllers dizini içerisindeki profile.php dosyasını açıyoruz ve submit_form() methodunu aşağıdaki gibi kodluyoruz. Diğer form inputlarının kodlamasını şimdilik yorum satırı haline getirdiğimizi görebilirsiniz. Bunları tekrar yazmamanız adına şimdilik pasif duruma düşürdük, yükleme işlemini yaptıktan sonra toplu olarak testlerimizi yapabiliriz.

PHP:
public function submit_form()
{
    $data = [
        'dosya_adi'         =>  'image',
        'dosya_uzantisi'    =>  'jpg|png',
        'yuklenecek_yol'    =>  'images/',
        'label_ismi'        =>  'Resim'
    ];

    $this->dosya($data);

    /*$this->dogrulama('kullanici_adi', 'Kullanıcı Adı', 'int_yok|min_uzunluk|5|gerekli');
    $this->dogrulama('adres', 'Adres', 'int_yok|min_uzunluk|5|gerekli');
    $this->dogrulama('sifre', 'Şifre', 'min_uzunluk|5|gerekli');
    $this->dogrulama('sifre_tekrar', 'Şifre Tekrarı', 'onay_sifre|sifre|gerekli');
    $this->dogrulama('email', 'Email', 'benzersiz|users|gerekli');

    if($this->calistir()){

        echo $this->post("kullanici_adi");
        echo $this->post("adres");
        echo $this->post("password");

    }else{

        $this->view("users");
    }*/
}

ibraries dizini içerisinde dosya_yukleme.php adında bir dosya oluşturmuştuk, bu dosyanınde libraries dizini içerisindeki netron.php sınıfına tanımlanması gerekiyor. Daha önce biliyorsunuz use form_dogrulama diye bir trait eklemiştik. Aynı şekilde aşağıdaki gibi use form_dogrulama alanının hemen yanına bunu alabiliriz. Örnek kod aşağıdaki gibi olacak.

PHP:
use form_dogrulama, dosya_yukleme;

Şimdi libraries dizini içerisinde dosya_yukleme.php dosyamızı açıyoruz ve içerisindeki kodları aşağıdaki kodlarla değiştiriyoruz.

PHP:
<?php

/*
    * Dosya yükleme kütüphanesi
 */

trait Dosya_yukleme
{
    public $dosya_hatalari = [];
    public $data;
    public $dosya_data;
    public function dosya($data)
    {
        $this->data = $data;
        $this->dosya_data = [

            'dosya_adi'         =>  $_FILES[$this->data['dosya_adi']]['name'],
            'dosya_tmp'         =>  $_FILES[$this->data['dosya_adi']]['tmp_name'],
            'uzantilar'         =>  $this->data['dosya_uzantisi'],
            'yuklenecek_yol'    =>  $this->data['yuklenecek_yol'],
            'label_ismi'        =>  $this->data['label_ismi'],
            'alan_ismi'         =>  $this->data['dosya_adi']


        ];

        print_r($this->dosya_data);
    }
}

?>

Şimdi tarayıcımız da http://localhost/netron/profile/user url'imize jpg veya png formatlarına sahip bir dosya yüklemesi yapalım ve aşağıdaki çıktıyı alalım.

ekranciktisi_61.jpg

Şimdi de dosya giriş alanının, boş olup olmadığını kontrol edelim ve boş gelirse bir hata mesajı gönderelim. Bunun için libraries dizini içerisinde dosya_yukleme.php dosyamızı açıyoruz ve içerisindeki kodları aşağıdaki kodlarla değiştiriyoruz.

PHP:
<?php
    /*
    * Dosya yükleme kütüphanesi
 */

trait Dosya_yukleme
{
    public $dosya_hatalari = [];
    public $data;
    public $dosya_data;
    public function dosya($data)
    {
        $this->data = $data;
        $this->dosya_data = [

            'dosya_adi'         =>  $_FILES[$this->data['dosya_adi']]['name'],
            'dosya_tmp'         =>  $_FILES[$this->data['dosya_adi']]['tmp_name'],
            'uzantilar'         =>  $this->data['dosya_uzantisi'],
            'yuklenecek_yol'    =>  $this->data['yuklenecek_yol'],
            'label_ismi'        =>  $this->data['label_ismi'],
            'alan_ismi'         =>  $this->data['dosya_adi']


        ];

       /*
            * Dosya giriş alanının boş olup olmadığını kontrol ediyoruz.
        */

        if(empty($this->dosya_data['dosya_adi'])){

            return $this->dosya_hatalari[$this->dosya_data['alan_ismi']] = $this->dosya_data['label_ismi'] . " gerekli alandır!";

        }

    }

    public function dosya_calistir()
    {
        if(empty($this->dosya_hatalari)){

            return true;

        }else{

            return false;

        }
    }
}

?>

Daha sonra controllers dizini içerisinde profile.php dosyamızı açalım ve submit_form() methodunu aşağıdaki gibi düzenleyelim.


PHP:
public function submit_form()
    {
        $data = [
            'dosya_adi'         =>  'image',
            'dosya_uzantisi'    =>  'jpg|png',
            'yuklenecek_yol'    =>  'images/',
            'label_ismi'        =>  'Resim'
        ];

        $this->dosya($data);

        if($this->dosya_calistir()){

        }else{

            print_r($this->dosya_hatalari);
        }

        /*$this->dogrulama('kullanici_adi', 'Kullanıcı Adı', 'int_yok|min_uzunluk|5|gerekli');
        $this->dogrulama('adres', 'Adres', 'int_yok|min_uzunluk|5|gerekli');
        $this->dogrulama('sifre', 'Şifre', 'min_uzunluk|5|gerekli');
        $this->dogrulama('sifre_tekrar', 'Şifre Tekrarı', 'onay_sifre|sifre|gerekli');
        $this->dogrulama('email', 'Email', 'benzersiz|users|gerekli');

        if($this->calistir()){

            echo $this->post("kullanici_adi");
            echo $this->post("adres");
            echo $this->post("password");

        }else{

            $this->view("users");
        }*/
    }

Şimdi tarayıcımız da http://localhost/netron/profile/user açalım ve boş bir form gönderelim. Aşağıdaki çıktıyı görebiliriz.

ekranciktisi_62.jpg

Sıradaki işlemimiz gelen dosyanın uygun formatta olup olmadığını kontrol edeceğiz. Bunun libraries dizini içerisinde dosya_yukleme.php dosyamızı açıyoruz ve içerisindeki kodları aşağıdaki kodlarla değiştiriyoruz.

PHP:
<?php
/*
    * Dosya yükleme kütüphanesi
*/

trait Dosya_yukleme
{
    public $dosya_hatalari = [];
    public $data;
    public $dosya_data;
    public function dosya($data)
    {
        $this->data = $data;
        $this->dosya_data = [

            'dosya_adi'         =>  $_FILES[$this->data['dosya_adi']]['name'],
            'dosya_tmp'         =>  $_FILES[$this->data['dosya_adi']]['tmp_name'],
            'uzantilar'         =>  $this->data['dosya_uzantisi'],
            'yuklenecek_yol'    =>  $this->data['yuklenecek_yol'],
            'label_ismi'        =>  $this->data['label_ismi'],
            'alan_ismi'         =>  $this->data['dosya_adi']


        ];

       /*
            * Dosya giriş alanının boş olup olmadığını kontrol ediyoruz.
        */

        if(empty($this->dosya_data['dosya_adi'])){

            return $this->dosya_hatalari[$this->dosya_data['alan_ismi']] = $this->dosya_data['label_ismi'] . " gerekli alandır!";

        }

        // Resim/Dosya uzantısını kontrol ediyoruz.
        $dosya_uzantisi = explode(".", $this->dosya_data['dosya_adi']);
        $dosya_uzantisi = end($dosya_uzantisi);
        $uzantilar      = explode("|", $this->dosya_data['uzantilar']);
        if(!in_array($dosya_uzantisi, $uzantilar)){
            return $this->dosya_hatalari[$this->dosya_data['alan_ismi']] = $dosya_uzantisi . " bu format desteklenmiyor!";
        }

    }

    public function dosya_calistir()
    {
        if(empty($this->dosya_hatalari)){

            return true;

        }else{

            return false;

        }
    }
}

?>

Daha sonra controllers dizini içerisinde profile.php dosyamızı açalım ve submit_form() methodunu aşağıdaki gibi düzenleyelim.

PHP:
public function submit_form()
{
    $data = [
        'dosya_adi'         =>  'image',
        'dosya_uzantisi'    =>  'jpg|png|PNG',
        'yuklenecek_yol'    =>  'images/',
        'label_ismi'        =>  'Resim'
    ];

    $this->dosya($data);

    if($this->dosya_calistir()){

    }else{

        print_r($this->dosya_hatalari);
    }

    /*$this->dogrulama('kullanici_adi', 'Kullanıcı Adı', 'int_yok|min_uzunluk|5|gerekli');
    $this->dogrulama('adres', 'Adres', 'int_yok|min_uzunluk|5|gerekli');
    $this->dogrulama('sifre', 'Şifre', 'min_uzunluk|5|gerekli');
    $this->dogrulama('sifre_tekrar', 'Şifre Tekrarı', 'onay_sifre|sifre|gerekli');
    $this->dogrulama('email', 'Email', 'benzersiz|users|gerekli');

    if($this->calistir()){

        echo $this->post("kullanici_adi");
        echo $this->post("adres");
        echo $this->post("password");

    }else{

        $this->view("users");
    }*/
}

Şimdi tarayıcımız da http://localhost/netron/profile/user açalım ve png veya jpg dışında başka bir formatta dosya yüklemesi yapalım. Aşağıdaki hata mesajını görebilirsiniz.

ekranciktisi_63.jpg

Şimdi dosya yolunun kontrolünü ve dosyanın yüklemesini yapacağız. libraries dizini içerisinde dosya_yukleme.php dosyamızı açıyoruz ve içerisindeki kodları aşağıdaki kodlarla değiştiriyoruz. Ayrıca yazılan kodların tüm açıklaması kod içerisine açıklama satırları halinde eklenmiştir.

PHP:
<?php
/*
    * Dosya yükleme kütüphanesi
 */

trait Dosya_yukleme
{
    public $dosya_hatalari = [];
    public $data;
    public $dosya_data;
    public function dosya($data)
    {
        $this->data = $data;
        $this->dosya_data = [

            'dosya_adi'         =>  $_FILES[$this->data['dosya_adi']]['name'],
            'dosya_tmp'         =>  $_FILES[$this->data['dosya_adi']]['tmp_name'],
            'uzantilar'         =>  $this->data['dosya_uzantisi'],
            'yuklenecek_yol'    =>  $this->data['yuklenecek_yol'],
            'label_ismi'        =>  $this->data['label_ismi'],
            'alan_ismi'         =>  $this->data['dosya_adi']


        ];

       /*
            * Dosya giriş alanının boş olup olmadığını kontrol ediyoruz.
        */

        if(empty($this->dosya_data['dosya_adi'])){

            return $this->dosya_hatalari[$this->dosya_data['alan_ismi']] = $this->dosya_data['label_ismi'] . " gerekli alandır!";

        }

        /*
            * Resim/Dosya uzantısını kontrol ediyoruz.
         */
        
        // Dosya (.) nokta'dan explode ile dizi halinde parçalıyoruz.
        $dosya_uzantisi = explode(".", $this->dosya_data['dosya_adi']);

        // end ile dosyanın son dizi elemanını alıyoruz.
        $dosya_uzantisi = end($dosya_uzantisi);
        
        // Gelen dosya uzantılarını (|) dik çizgiden dizi hakinde parçalıyoruz.
        $uzantilar      = explode("|", $this->dosya_data['uzantilar']);

        // Gelen dosya uzantılarını uygun formatta değilse hata mesajını bastıyoruz.
        if(!in_array($dosya_uzantisi, $uzantilar)){
            return $this->dosya_hatalari[$this->dosya_data['alan_ismi']] = $dosya_uzantisi . " bu format desteklenmiyor!";
        }


        /*
            * Dosya yolunun kontrolünün yapılıyor.
         */
        
        // Dosya yolu geçerli bir dizin mi diye kontrol ediyoruz.
        if(!file_exists($this->dosya_data['yuklenecek_yol'])){

            // Hata mesajında dosyanın sonundaki slash görünmesin diye temizmiyoruz.
            $dizin = rtrim($this->dosya_data['yuklenecek_yol'], "/");

            // Dosya yolunda hata var ise hata mesajını gönderiyoruz.
            return $this->dosya_hatalari[$this->dosya_data['alan_ismi']] = $dizin . " yükleme dizini hatası!";

        }

    }

    public function dosya_calistir()
    {
        if(empty($this->dosya_hatalari)){

            /*
                * Dosya yüklemesi yapılıyor.
             */

            move_uploaded_file($this->dosya_data['dosya_tmp'], $this->dosya_data['yuklenecek_yol'].$this->dosya_data['dosya_adi']);

            return true;

        }else{
            $this->data = null;
            return false;

        }
    }
}

?>

Şimdi kodlarımızı biraz daha toparlayalım. Bunun views dizini içerisindeki users.php dosyasını açın ve image inputunun altına aşağıdaki hata çıktılama kodlarını ekleyin.

PHP:
<?php if(!empty($this->hatalar['kullanici_adi'])): ?>
    <?php echo $this->hatalar['kullanici_adi']; ?>
<?php endif; ?><br />

Şimdi de controllers dizini içerisindeki profile.php dosyasını açın ve submit_form() methodunu aşağıdaki method ile değiştirin.

PHP:
public function submit_form()
{
    $data = [
        'dosya_adi'         =>  'image',
        'dosya_uzantisi'    =>  'jpg|png|PNG',
        'yuklenecek_yol'    =>  'images/',
        'label_ismi'        =>  'Resim'
    ];

    $this->dosya($data);
    $this->dogrulama('kullanici_adi', 'Kullanıcı Adı', 'int_yok|min_uzunluk|5|gerekli');
    $this->dogrulama('adres', 'Adres', 'int_yok|min_uzunluk|5|gerekli');
    $this->dogrulama('sifre', 'Şifre', 'min_uzunluk|5|gerekli');
    $this->dogrulama('sifre_tekrar', 'Şifre Tekrarı', 'onay_sifre|sifre|gerekli');
    $this->dogrulama('email', 'Email', 'benzersiz|users|gerekli');


    if($this->dosya_calistir() & $this->calistir()){

        echo   "Form iletildi";

    }else{

        $this->view('users');
    }

}

Şimdi de tarayıcınızda http://localhost/netron/profile/user url'ini çalıştırın ve boş bir form gönderimi yapın. Aşağıdaki çıktıyı alacaksınız.

ekranciktisi_65.jpg

Son işlemlerimizi yapalım. Dosyanın yüklenmesini ve isminin değiştirilmesi yani dosya adının benzersiz olmasını sağladık ayrıca dosya da bazı değişiklikler yaptık. Kod açıklamalarında hepsini belirttik. libraries dizini içerisinde dosya_yukleme.php dosyamızı açıyoruz ve içerisindeki kodları aşağıdaki kodlarla değiştiriyoruz.

PHP:
<?php
/*
    * Dosya yükleme kütüphanesi
 */

trait Dosya_yukleme
{
    public $dosya_hatalari = [];
    public $data;
    public $dosya_data;
    public function dosya($data)
    {
        $this->data = $data;
        $this->dosya_data = [

            'dosya_adi'         =>  $_FILES[$this->data['dosya_adi']]['name'],
            'dosya_tmp'         =>  $_FILES[$this->data['dosya_adi']]['tmp_name'],
            'uzantilar'         =>  $this->data['dosya_uzantisi'],
            'yuklenecek_yol'    =>  $this->data['yuklenecek_yol'],
            'label_ismi'        =>  $this->data['label_ismi'],
            'alan_ismi'         =>  $this->data['dosya_adi'],

            // PATHINFO_EXTENSION bize dosya uzantısını otomatik bulur.
            'dosya_uz'          =>  pathinfo($_FILES[$this->data['dosya_adi']]['name'], PATHINFO_EXTENSION)


        ];

       /*
            * Dosya giriş alanının boş olup olmadığını kontrol ediyoruz.
        */

        if(empty($this->dosya_data['dosya_adi'])){

            return $this->dosya_hatalari[$this->dosya_data['alan_ismi']] = $this->dosya_data['label_ismi'] . " gerekli alandır!";

        }

        /*
            * Resim/Dosya uzantısını kontrol ediyoruz.
         */

        // Dosya uzantısını yukarıda yakaladığımız pathinfo'dan gelen 'dosya_uz'dan alıyoruz.
        $dosya_uzantisi = strtolower($this->dosya_data['dosya_uz']);

        // Gelen dosya uzantılarını (|) dik çizgiden dizi hakinde parçalıyoruz.
        $uzantilar      = explode("|", $this->dosya_data['uzantilar']);

        // Gelen dosya uzantılarını uygun formatta değilse hata mesajını bastıyoruz.
        if(!in_array($dosya_uzantisi, $uzantilar)){
            return $this->dosya_hatalari[$this->dosya_data['alan_ismi']] = $dosya_uzantisi . " bu format desteklenmiyor!";
        }


        /*
            * Dosya yolunun kontrolünün yapılıyor.
         */

        // Dosya yolu geçerli bir dizin mi diye kontrol ediyoruz.
        if(!file_exists($this->dosya_data['yuklenecek_yol'])){

            // Hata mesajında dosyanın sonundaki slash görünmesin diye temizmiyoruz.
            $dizin = rtrim($this->dosya_data['yuklenecek_yol'], "/");

            // Dosya yolunda hata var ise hata mesajını gönderiyoruz.
            return $this->dosya_hatalari[$this->dosya_data['alan_ismi']] = $dizin . " yükleme dizini hatası!";

        }

    }

    public function dosya_calistir()
    {
        if(empty($this->dosya_hatalari)){

            /*
                * Dosya yüklemesi yapılıyor.
             */

            // PATHINFO_FILENAME ile dosyanın adını alıyoruz.
            $dosya_adi = pathinfo($this->dosya_data['dosya_adi'], PATHINFO_FILENAME);

            // Gelen dosya da boşluk var ise bunları  _ alt tire işareti ile değiştiriyoruz.
            $dosya_adi = preg_replace("/\s+/", "_", "$dosya_adi");

            // Dosya adının benzersiz olması için time() methodunu dosya adının önüne ekletiyoruz.
            $dosya_adi = time().$dosya_adi;

            // En yukarıda data da oluşturduğumuz PATHINFO_EXTENSION ile dosya uzantısını alıyoruz.
            $dosya_adi = $dosya_adi.".".$this->dosya_data['dosya_uz'];

            // move_uploaded_file ile dosyanın yüklenmesini sağlıyoruz.
            move_uploaded_file($this->dosya_data['dosya_tmp'], $this->dosya_data['yuklenecek_yol'].$dosya_adi);

            // Yeni dosya adını alıyoruz.
            $this->dosya_data['dosya_adi'] = $dosya_adi;

            return true;

        }else{
            $this->data = null;
            return false;

        }
    }
}

?>

Şimdi controllers dizini içerisindeki profile.php dosyamızı açıyoruz ve içerisindeki submit_form() method kodlarını aşağıdaki kodlarla değiştiriyoruz.

Şimdi tarayıcımız da http://localhost/netron/profile/user açalım ve png veya jpg formatına sahip bir resim dosyası yükleyelim. Dosyanın başarılı bir şekilde public\images dizinine yüklendiğini görebiliriz.

Şimdi kodlarımızı biraz daha toparlayalım. Bunun views dizini içerisindeki users.php dosyasını açın ve image inputunun altına aşağıdaki hata çıktılama kodlarını ekleyin.

PHP:
<?php if(!empty($this->hatalar['kullanici_adi'])): ?>
    <?php echo $this->hatalar['kullanici_adi']; ?>
<?php endif; ?><br />

Şimdi de controllers dizini içerisindeki profile.php dosyasını açın ve submit_form() methodunu aşağıdaki method ile değiştirin.

PHP:
public function submit_form()
{
    $data = [
        'dosya_adi'         =>  'image',
        'dosya_uzantisi'    =>  'jpg|png',
        'yuklenecek_yol'    =>  'images/',
        'label_ismi'        =>  'Resim'
    ];

    $this->dosya($data);
    $this->dogrulama('kullanici_adi', 'Kullanıcı Adı', 'int_yok|min_uzunluk|5|gerekli');
    $this->dogrulama('adres', 'Adres', 'int_yok|min_uzunluk|5|gerekli');
    $this->dogrulama('sifre', 'Şifre', 'min_uzunluk|5|gerekli');
    $this->dogrulama('sifre_tekrar', 'Şifre Tekrarı', 'onay_sifre|sifre|gerekli');
    $this->dogrulama('email', 'Email', 'benzersiz|users|gerekli');


    if($this->dosya_calistir() & $this->calistir()){

        echo $this->dosya_data['dosya_adi'];

    }else{

        $this->view('users');
    }

}

Şimdi tarayıcımız da http://localhost/netron/profile/user açalım ve png veya jpg formatına sahip bir resim dosyası yükleyelim. Dosyanın başarılı bir şekilde farklı isimde public\images dizinine yüklendiğini görebiliriz.

ekranciktisi_66.jpg
 
Helper - Session Fonksiyonu

Bu bölümde session trait'imizi ve methodlarımızı oluşturacağız. Bunun için libraries dizini içerisinde session.php adında bir dosya oluşturalım ve içeriğini aşağıdaki gibi kodlayalım.

PHP:
<?php
/*
    * Session Kütüphanesi
 */

trait Session
{
    public function start()
    {
        /*
            * Start Session
         */

        session_start();
    }

    //İki tane parametre alıyor deger parametresi boşta gelebilir dedik.
    public function set_session($isim, $deger = '')
    {
        // Gelen isim boş değilse dedik.
        if(!empty($isim)){

            // is_array() : Belirtilecek olan değişken içeriğinin array veri türünde olup olmadığını sınamak için kullanılır. İşlem sonucu daima boolean veri türünde döner

            if(is_array($isim) && empty($deger)){
                // $isim alanını dizi döngüsüne soktuk
                foreach($isim as $anahtar =>  $session_adi):
                    //Gelen anahtar değerine, session isimlerini depoladık.
                    $_SESSION[$anahtar] = $session_adi;
                endforeach;

            //Eğer sizi gelmeyecekse de $isim parametresi dizi olmayacak bu seferde deger boş olmayacak dedik.
            }elseif(!is_array($isim) && !empty($deger)){
                // isim sessionına, degerden gelen veriyi depoladık.
                $_SESSION[$isim] = $deger;
            }
        }
    }
}

?>

Şimdi controllers dizini içerisindeki profile.php dosyasını açıyoruz ve içerisindeki submit_form methodunu aşağıdaki method ile değiştiriyoruz.

PHP:
public function submit_form()
    {
        $data = [
            'dosya_adi'         =>  'image',
            'dosya_uzantisi'    =>  'jpg|png',
            'yuklenecek_yol'    =>  'images/',
            'label_ismi'        =>  'Resim'
        ];

        $this->dosya($data);
        $this->dogrulama('kullanici_adi', 'Kullanıcı Adı', 'int_yok|min_uzunluk|5|gerekli');
        $this->dogrulama('adres', 'Adres', 'int_yok|min_uzunluk|5|gerekli');
        $this->dogrulama('sifre', 'Şifre', 'min_uzunluk|5|gerekli');
        $this->dogrulama('sifre_tekrar', 'Şifre Tekrarı', 'onay_sifre|sifre|gerekli');
        $this->dogrulama('email', 'Email', 'benzersiz|users|gerekli');


        if($this->dosya_calistir() & $this->calistir()){

            $session_data = [

                'id'   =>  4,
                'isim' =>   $this->post("kullanici_adi"),
                'email' =>  $this->post("email")
            ];

            $this->set_session($session_data);
            yonlendir("panel/profile");

        }else{

            $this->view('users');
        }

    }

Şimdi controllers dizini içerisindeki panel.php dosyasını açıyoruz ve içerisindeki profile() methodunu aşağıdaki method ile değiştiriyoruz.

PHP:
public function profile()
{
    echo $_SESSION['id'] ."";
    echo $_SESSION['isim'] ."";
    echo $_SESSION['email'];
}

Şimdi http://localhost/netron/profile/user url'ini çalıştırıp formumuzu doldurup gönderiyoruz. Aşağıdaki çıktıyı görebilirsiniz.

ekranciktisi_67.jpg

Şimdi ise bu session fonksiyonunu database üzerinden de kullanacağımız için bunu database.php sınıfımıza da ekliyoruz. Örnek kod aşağıda.

PHP:
use session;

Şimdi bunu model sınfımız olan user.php içerisindeki kullanalım. Bunun için models dizini içerisindeki user.php dosyasını açıyoruz ve en altına aşağıdaki methodu ekliyoruz.

PHP:
public function session_olustur()
{
    return $this->session_getir('isim');
}

Şimdi controllers dizini içerisindeki profile.php dosyasını açıyoruz ve user() methodunu aşağıdaki gibi düzenliyoruz.

PHP:
public function user()
{

    $this->view("users");

}

Şimdi controllers dizini içerisindeki profile.php dosyasını açıyoruz ve user() methodunu aşağıdaki gibi düzenliyoruz.

PHP:
public function submit_form()
{
    $data = [
        'dosya_adi'         =>  'image',
        'dosya_uzantisi'    =>  'jpg|png',
        'yuklenecek_yol'    =>  'images/',
        'label_ismi'        =>  'Resim'
    ];

    $this->dosya($data);
    $this->dogrulama('kullanici_adi', 'Kullanıcı Adı', 'int_yok|min_uzunluk|5|gerekli');
    $this->dogrulama('adres', 'Adres', 'int_yok|min_uzunluk|5|gerekli');
    $this->dogrulama('sifre', 'Şifre', 'min_uzunluk|5|gerekli');
    $this->dogrulama('sifre_tekrar', 'Şifre Tekrarı', 'onay_sifre|sifre|gerekli');
    $this->dogrulama('email', 'Email', 'benzersiz|users|gerekli');


    if($this->dosya_calistir() & $this->calistir()){

        $session_data = [

            'id'   =>  4,
            'isim' =>   $this->post("kullanici_adi"),
            'email' =>  $this->post("email")
        ];

        $this->set_session($session_data);
        yonlendir("panel/profile");

    }else{

        $this->view('users');
    }

}

Şimdi http://localhost/netron/profile/user url'ini çalıştırıyoruz ve formu eksiksiz dolduruyoruz. yonlendir("panel/profile"); tanımlı olduğu için giriş olduğunda bizi http://localhost/netron/panel/profile alanına yönlendirecek ve session'dan gelen isim değerini almış olacağız. Örnek çıktı aşağıdaki gibi olacak.

ekranciktisi_68.jpg

Şimdi ise bunu başka bir views dosyası oluşturarak, views dosyası üzerinden yapalım. views dizini içerisinde user_panel.php adında bir dosya oluşturalım. Daha sonra controllers dizini içerisindeki panel.php dosyasını açalım ve profile methodunu aşağıdaki kodlarla değiştirelim.
PHP:
public function profile()
{
    $this->view("user_panel");
}

Şimdi tekrar views dizini içerisindeki oluşturmuş olduğumuz user_panel.php dosyasını açalım ve içerisine aşağıdaki kodları ekleyelim.

PHP:
<!doctype html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>User Panel</title>
</head>
<body>

    <?php echo $this->session_getir('isim'); ?>

</body>
</html>


Şimdi tarayıcımız da http://localhost/netron/panel/profile url'ini çalıştıralım ve aşağıdaki çıktıyı alalım. Görüldüğü üzere farklı sayfalarımız da da session başarılı bir şekilde çalışmakta.

ekranciktisi_69.jpg

Biz session oturum yöntemlerini sadece üyelerin bilgilerini tutması için kullanmıyoruz. Doğrulama mesajlarında, hata mesajlarında veya sepet uygulamaların vs kullanabiliyoruz. Şimdiki fonksiyonumuz da hata ve başarılı mesajlarımızı kullanıcılara session üzerinden göstereceğimiz kodlamamızı yapalım. Bu işlemin adına flash mesajlar denmektedir. Şimdi session.php dosyamızı açalım ve en altına aşağıdaki gonskyonları yazalım.

PHP:
/*
    * Flash Mesaj Session Methodu
*/

public function set_flash($isim, $mesaj)
{
    if(!empty($isim) && !empty($mesaj)){

        $_SESSION[$isim] = $mesaj;
    }
}

public function flash($isim, $class = "")
{
    if(!empty($isim) && isset($_SESSION[$isim])){
        echo "" . $_SESSION[$isim] . "";
        unset($_SESSION[$isim]);
    }
}

Şimdi ise controllers dizini içerisindeki profile.php dosyamızı açalım ve submit_form() methodumuzu aşağıdaki method ile değiştirelim. Aslında burada tek değişiklik $this->set_flash("hesap_basarili", "Hesap oluşturuldu. Giriş yapabilirsiniz."); flash mesajımızın yazılması oldu.


PHP:
public function submit_form()
{
    $data = [
        'dosya_adi'         =>  'image',
        'dosya_uzantisi'    =>  'jpg|png',
        'yuklenecek_yol'    =>  'images/',
        'label_ismi'        =>  'Resim'
    ];

    $this->dosya($data);
    $this->dogrulama('kullanici_adi', 'Kullanıcı Adı', 'int_yok|min_uzunluk|5|gerekli');
    $this->dogrulama('adres', 'Adres', 'int_yok|min_uzunluk|5|gerekli');
    $this->dogrulama('sifre', 'Şifre', 'min_uzunluk|5|gerekli');
    $this->dogrulama('sifre_tekrar', 'Şifre Tekrarı', 'onay_sifre|sifre|gerekli');
    $this->dogrulama('email', 'Email', 'benzersiz|users|gerekli');


    if($this->dosya_calistir() & $this->calistir()){

        $session_data = [

            'id'   =>  4,
            'isim' =>   $this->post("kullanici_adi"),
            'email' =>  $this->post("email")
        ];

        $this->set_session($session_data);
        $this->set_flash("hesap_basarili", "Hesap oluşturuldu. Giriş yapabilirsiniz.");
        yonlendir("panel/profile");

    }else{

        $this->view('users');
    }

}

controllers içerisindeki panel.php sınıf dosyamız içerisinde aşağıdaki fonksiyon zaten tanımlıydı, amacı neydi kodumuzun views dizini içerisindeki user_panel.php dosyasında görüntülenmesini sağlamaktı.

PHP:
public function profile()
{
    $this->view("user_panel");
}

views dizini içerisindeki user_panel.php dosyasını açalım ve içerisine aşağıdaki kodları yazalım.

PHP:
<!doctype html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>User Panel</title>
<style>
    .alert-success{
        border: 1px solid green;
        color: green;
        padding: 10px;
    }
</style>
</head>
<body>

    <?php echo $this->flash("hesap_basarili", "alert-success"); ?>

</body>
</html>

Şimdi tarayıcıda http://localhost/netron/profile/user url'ini çalıştıralım ilgili formu dolduralım ve butona basalım. Bizi otomatik olarak http://localhost/netron/panel/profile alanına yönlendirecek ve mesajımızı görüntüleyecek. Tekrar yenilediğimiz de sayfayı mesaj kalkacak. Örnek çıktı aşağıdaki gibi olacak.

ekranciktisi_70.jpg

Şimdi de unset ile gönderilen session değerleri yok edeceğiz. Yani kullanıcıya çıkış yaptıracağız. Bunun için session.php dosyasını açın ve en altına aşağıdaki kodları ekleyin.

PHP:
public function unset_session($isim)
{
    if(is_array($isim)){
        foreach($isim as $anahtar):
            unset($_SESSION[$anahtar]);
        endforeach;
    }else{
        unset($_SESSION[$isim]);
    }

}

Şimdi de controllers dizini içerisindeki profile.php sınıf dosyasını açın ve en altına aşağıdaki methodu ekleyiniz.

PHP:
public function logout()
{
    $data = ['id', 'email'];
    $this->unset_session($data);
}

Şimdi de views dizini içerisindeki user_panel.php dosyasını açın ve içerisindeki kodları aşağıdaki kodlarla değiştirin.

PHP:
<!doctype html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>User Panel</title>
</head>
<body>

    <?= $this->session_getir('id'); ?> <br />
    <?= $this->session_getir('isim'); ?><br />
    <?= $this->session_getir('email'); ?>

</body>
</html>

Şimdi tarayıcıda http://localhost/netron/profile/user url'ini çalıştıralım ilgili formu dolduralım ve butona basalım. Aşağıdaki gibi bize id, isim, email değerlerimizi session yoluyla verecektir.

ekranciktisi_71.jpg

controllers dizini içerisindeki profile.php sınıfı içerisindeki logut() fonksiyonuna bakarsak;

id ve email değerlerimizin silinmesi gerektiğini söyledik. Şimdi tarayıcıda http://localhost/netron/profile/logout url'ini çalıştıralım ve daha sonra tekrar http://localhost/netron/panel/profile url'ini çalıştıralım aşağıdaki gibi bir çıktı ile karşılacağız. Burada id ve email sessionlarının yok edildiğini görebiliyoruz.

ekranciktisi_72.jpg

sessionlarla ilgili son işlemimiz de sessionların hepsini tek seferde öldürme yani yok etme fonksiyonumuzu yazalım. session.php dosyamızı açalım ve en altına aşağıdaki methodu ekleyelim.

PHP:
public function destroy_session()
{
    session_destroy();
}

Şimdi de controllers dizini içerisindeki profile.php dosyasını açalım logout() fonksiyonunu aşağıdaki kodlarla değiltirelim.

PHP:
public function logout()
{
    $this->destroy_session();
}

Şimdi tarayıcıda http://localhost/netron/profile/user url'ini çalıştıralım ilgili formu dolduralım ve butona basalım.

ekranciktisi_73.jpg

Şimdi tarayıcıda http://localhost/netron/profile/logout url'ini çalıştıralım ve daha sonra tekrar http://localhost/netron/panel/profile url'ini çalıştıralım aşağıdaki görüldüğü gibi tüm sessionlarımız yok edildi.

ekranciktisi_74.jpg
 
Helper - Şifreleme Hash Fonksiyonu

Şifreleme için ayrı bir alan oluşturmaya gerek yok bu bölüm çok kısa olacak. libraries dizini içerisindeki form_dogrulama.php dosyasını açalım ve en altına aşağıdaki methodumuzu ekleyelim.

PHP:
/*
    * Şifreleme - Hash Methodu
*/

public function sifreleme($sifre)
{
    if(!empty($sifre)){

        return password_hash($sifre, PASSWORD_DEFAULT);
    }
}

Bundan sonra şifreleme işlemleri için sifreleme() methodumuzu kullanabiliriz.
 
Config - Kod Düzenlemesi ve Taşınması

config
dizini içerisindeki, config.php dosyasını açın ve içerisindekileri kopyalıp, system dizini içerisinde ayar.php adında dosya oluşturup içerisine kopyaladığımız kodları yapıştıralım. Daha sonra config dizini içerisindeki, config.php dosyasına tekrar dönelim ve içerisindeki tüm kodları aşağıdaki kodlarla değiştirelim.

PHP:
<?php

$database = [

    'host'      =>  'localhost',
    'username'  =>  'root',
    'database'  =>  'mvc',
    'password'  =>  ''

];

$default = [

    'controller'    =>  'anasayfa',
    'method'        =>  'index',
    'param'         =>  []

];

$ayar = [

    'base_url' => 'http://localhost/netron'

];

?>

Şimdi system dizini içerisindeki ayar.php dosyasını açalım içerisindeki kodları aşağıdaki kodlarla değiştirelim.

PHP:
<?php

include "config/config.php";

/*
    * rout.php içerisindeki varsayılan controller, method ve parametreleri içerir.
*/
define("Varsayilan_controller", $default['controller']);
define("Varsayilan_method", $default['method']);
define("Varsayilan_parametre", $default['param']);

/*
    * Database Parametleri
*/

define('HOST', $database['host']);
define('USERNAME', $database['username']);
define('DATABASE', $database['database']);
define('PASSWORD', $database['password']);

/*
    * BASE URL
*/

define("BASE_URL", $ayar['base_url']);


?>

Şimdi system dizini içerisindeki init.php dosyasını açalım en üst alanda bulunan include "config/config.php"; kodunu aşağıdaki kod ile değiştirelim.

PHP:
include "ayar.php";

Son bir işlem daha yapalım system dizini içerisindeki config klasörünü application dizini içerisine taşıyalım. Daha sonra system dizini içerisindeki ayar.php dosyasını açalım ve en üst kısımında bulunan aşağıdaki kodu


PHP:
include "../config/config.php";

Aşağıdaki include kodu ile değiştirelim.

PHP:
include "../application/config/config.php";

Daha sonra libraries dizini içerisindeki netron.php dosyasını açalım, __construct() methodunu aşağıdaki method ile değiştirelim. Aslında burada sadece dahil ettiğimiz dosya yolunu değiştirdik.

PHP:
public function __construct()
{
    $this->start();
    if(file_exists("../application/config/autoload.php")){
        require_once "../application/config/autoload.php";
        $helpers = $autoload["helpers"];
        $this->helper($helpers);
    }

}

İşlemler tamamlandı kontrol ettiğimizde herhangi bir hatamızın olmaması gerekir.
 
MVC Dosyaların Temizliği

Burada mvc yapımızı hazırladık gerekli fonksiyonlarımızı yaptık, testlerimizi gerçekleştirdik. Şimdi mvc çerçevemizin temizliğini yapma zamanı geldi. controllers dizini içerisindeki panel.php dosyasını silin.

controllers dizini içerisindeki profile.php dosyasını silin.

models dizini içerisindeki user.php dosyasını silin.

views dizini içerisindeki users.php ve user_panel.php dosyasını silin.

config dizini içerisindeki autoload.php dosyasını açın içerisindeki kodları aşağıdaki kodlarla değiştirin.

PHP:
<?php

/*
    * Autoload helpers
*/

$autoload = [

/*
    * Gerekli helperlar : url', 'form', 'html', 'yonlendir
*/

    'helpers' => []
];

?>
 
MVC Site Yapım Aşaması

1- Login - Tasarım Alanı Entegresi ve Kayıt Forumu Oluşturma

Artık çalışma yapacağımız web sitesinin html kodlarını mvc yapımıza entegre etme zamanımız geldi. Hem bu sayede gerçek bir web sitesinde yapmış olduğumuz mvc framework nasıl çalışır, nasıl kodlanır bunlarıda öğrenmiş olacağız. İlk olarak mvc projemizdeki public dizini içerisindeki css, images, js dosyalarımızı silelim.

Burada artık kendi tasarladığımız dosyaları aktaracağız. En başta söylediğim gibi framework yapımız hazır olduğu için gerçek dünya projemizi yapacağız tasarımımıza ait dosyalarımızı assets dizini içeresinde tutacağız. Yine en başta söylediğim gibi bu anlatım kodlama bilen kişilere yönelik olduğu için kendi tasarımınızı oluşturabilirsiniz. Burada konumuz tasarım değil mvc yapısını anlamak.

public dizini içerisinde assets dizini oluşturalım ve bu dizinin içerisinde sırasıyla aşağıdaki dizinleri oluşturalım;
  • css
  • images
  • js

Şimdi mvc projemize gelip views dizini içerisinde index.php adında bir dosya oluşturup, tasarımımıza ait olan kopyalamış olduğumuz html kodlarını bunun içerisine yapıştıralım. Örnek kod aşağıdaki gibi olacak. Aşağıdaki koda baktığımız da

<link rel="stylesheet" href="<?php echo BASE_URL; ?>/assets/css/style.css">

ve

<img src="<?php echo BASE_URL; ?>/assets/images/Icon-nt.png" alt="not found" class="icon-nt"> </div>

alanlarında değişiklik yaptığımızı görebilirsiniz.

PHP:
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<title>Kullanıcı panel login</title>
<link rel="stylesheet" href="<?php echo BASE_URL; ?>/assets/css/style.css">
<link href="https://fonts.googleapis.com/css?family=Poppins:100,200,300,400,500" rel="stylesheet">
</head>
<body>

<div class="form-container">
    <div class="header-img">
        <img src="<?php echo BASE_URL; ?>/assets/images/Icon-nt.png" alt="not found" class="icon-nt">
    </div><!-- close header-img -->
    <div class="heading">
        <h2>Yeni hesap oluştur</h2>
    </div><!-- close heading -->
<form action="">
    <div class="group">
        <input type="text" name="name" class="control" placeholder="Kullanıcı adı">
    </div><!-- close group -->
    <div class="group">
        <input type="email" name="email" class="control" placeholder="Email">
    </div><!-- close group -->
    <div class="group">
        <input type="password" name="password" class="control" placeholder="Şifre">
    </div><!-- close group -->
    <div class="group">
        <input type="password" name="confirm_password" class="control" placeholder="Şifre tekrar">
    </div><!-- close group -->
    <div class="group m-20">
        <input type="submit" class="btn" value="Hesap oluştur →">
    </div><!-- close group -->
    <div class="group m-30">
        <a href="login.html" class="links">Zaten bir hesabın var mı ?</a>
    </div>
    </form> <!-- close form-->

    </div><!-- close container -->

    <div class="bg">

    </div><!-- close container -->

</body>
</html>


Şimdi de controllers dizini içerisinde hesap.php dosyası oluşturalım ve içerisine aşağıdaki kodları ekleyelim.

PHP:
<?php

class Hesap extends Netron
{
    public function index()
    {
        $this->view('index');
    }
}

?>

Şimdi tarayıcımız da http://localhost/netron/hesap url'ini çalıştıralım ve login alanımızın geldiğini görebiliriz.

Şimdi ise index dosyamızı parçalayarak include edeceğiz ve görünüm için layout datasından gösterim yapacağız. ilk olarak, aşağıdaki alanları kesip, views dizini içerisinde parts adında bir dizin oluşturup, onunda içerisinde header.php dosyası oluşturup kestiğimiz aşağıdaki kodu içerisine yapıştıralım.

PHP:
<link rel="stylesheet" href="<?php echo BASE_URL; ?>/assets/css/style.css">
<img src="<?php echo BASE_URL; ?>/assets/images/Icon-nt.png" alt="not found" class="nt-login-ags">

Daha sonra kestiğimiz bu kodların yerine tekrar index.php dosyasına gelip, title etiketlerinin altına aşağıdaki kodu ekleyelim.

PHP:
<?php include "parts/header.php"; ?>

PHP:
<div class="form-container">
    <div class="header-img">
        <img src="<?php echo BASE_URL; ?>/assets/images/Icon-nt.png" alt="not found" class="nt-icon">
    </div><!-- close header-img -->
    <div class="heading">
        <h2>Yeni hesap oluştur</h2>
    </div><!-- close heading -->
<form action="">
    <div class="group">
        <input type="text" name="name" class="control" placeholder="Kullanıcı adı">
    </div><!-- close group -->
    <div class="group">
        <input type="email" name="email" class="control" placeholder="Email">
    </div><!-- close group -->
    <div class="group">
        <input type="password" name="password" class="control" placeholder="Şifre">
    </div><!-- close group -->
    <div class="group">
        <input type="password" name="confirm_password" class="control" placeholder="Şifre tekrar.">
    </div><!-- close group -->
    <div class="group m-20">
        <input type="submit" class="btn" value="Hesap oluştur →">
    </div><!-- close group -->
    <div class="group m-30">
        <a href="login.html" class="links">Zaten bir hesabın var mı ?</a>
    </div>
    </form> <!-- close form-->

Kestiğimiz bu kodları kayit.php içerisine yapıştıralım. Şimdi controllers dizini içerisindeki hesap.php dosyasını açalım ve aşağıdaki gibi kodlayalım.

PHP:
<?php

class Hesap extends Netron
{
    public function index()
    {
        $data['layout'] = "parts/kayit";
        $data['title']  =  "Yeni Hesap Oluştur";
        $this->view('index', $data);
    }
}

?>

Şimdi tekrar index.php dosyasına dönelim ve aşağıdaki gibi kodlayalım.

PHP:
  <!DOCTYPE html>
    <html lang="tr">
    <head>
    <meta charset="UTF-8">
    <title><?php echo $data['title']; ?></title>
    <?php include "parts/header.php"; ?>
    </head>
    <body>
 
    <?php $this->view($data['layout']); ?>

    <div class="bg">
 
    </div><!-- close container -->
 
    </body>
    </html>

Yukarıdaki kodları açıklayalım hesap.php sınıfı içerisine dikkat edersiniz

$data['layout'] = "parts/kayit";

$data['title'] = "Yeni Hesap Oluştur";

Kod eklemesi yaptık. Yani biz parts dizini içerisindeki layout alanlarımızı artık include etmek yerine view fonksiyonu ile çıktılamasını yaptık. Ayrıca sayfa birde title göndermiş olduk.


Üyelik Kaydının Yapılması

Şimdi kayıt formundan gelecek olan kaydın veritabanına kaydını gerçekleştireceğiz. form action linki ekliyoruz.

PHP:
<?php echo form_ac("hesap/kayitForm", "POST"); ?>

Şimdi controllers dizini içerisindeki hesap.php dosyasını açıyoruz ve aşağıdaki methodu ekliyoruz.

PHP:
public function kayitForm()
    {
        $this->dogrulama("kullaniciAdi", "Kullanıcı Adı", "gerekli|int_yok");
        $this->dogrulama("email", "e-Posta", "gerekli|benzersiz|users");
        $this->dogrulama("sifre", "Şifre", "gerekli|min_uzunluk|5");
        $this->dogrulama("confirm_password", "Şifre Tekrarı", "gerekli|onay_sifre|sifre");
        if($this->calistir()){

            $kullaniciAdi = $this->post('kullaniciAdi');
            $email        = $this->post('email');
            $sifre        = $this->sifreleme($this->post('sifre'));

            $data = [
                'isim'  => $kullaniciAdi,
                'email' => $email,
                'sifre' => $sifre,
                'image' => 'profile.png'
            ];

            if($this->model->kaydol($data)){

                echo "Kayıt başarılı";

            }else{

                echo "Ekleme sırasında hata oluştu";
            }

        }else{
            $data['layout'] = "parts/kayit";
            $data['title']  =  "Yeni Hesap Oluştur";
            $this->view('index', $data);
        }
    }

Şimdi de models dizini içerisindeki hesapModel.php dosyasını açıyoruz ve aşağıdaki kodları ekliyoruz.

PHP:
<?php
class hesapModel extends Database
{
    public function kaydol($data)
    {
        if($this->Ekle("users", $data)){

            return true;

        }else{

            return false;
        }
    }
}

?>

Kayıt işlemi başarılı. Ufak not verelim; Her controller dosyası içerisindeki __construct(); methodunun içerisindeki Netron sınıfındaki __construct() methodunu controllers dosyalarına parent::__construct(); diyerek eklemeyi unutmayın. Çünkü bizim traitlerimiz netron sınıfındaki __construct() methodunda tanımlı.
 
Mvc Ajax İşlemleri ve Ajax Veri Testlerinin Yapılması

Ajax kodlarına geçmeden önce test kodlarımızı yazacağız. Bu sağlıklı veri alış verişi yapılmadan önce muhakak yapılması gerekir. views/parts dizini içerisindeki meyve.php dosyasını açalım ve içerisine aşağıdaki kodlarımızı ekleyelim.

PHP:
<h2 class="heading-thin">Meyve Ekle</h2>

<?php echo form_ac(); ?>
<div class="group">
    <?php echo form_input(['type' => 'text', 'id' => 'meyveAdi', 'class' => 'control', 'placeholder' => ' Meyve Adı Giriniz...']); ?>
</div><!-- close group -->

<div class="group">
    <input type="number" id="fiyat" class="control" placeholder="KG Fiyatını Giriniz...">
</div><!-- close group -->

<div class="group">
    <?php echo form_button(['class' => 'btn-default', 'id' => 'meyveEkle', 'value' => 'Meyve Ekle'])?>
</div><!-- close group -->

<?php echo form_kapat(); ?>

<table class="table m-20">
<thead class="table m-20">
    <tr>
        <th>ID</th>
        <th>İsim</th>
        <th>KG Fiyatı</th>
        <th>Sil</th>
        <th>Güncelle</th>
    </tr>
</thead>
<tbody>
    <tr>
        <td>1</td>
        <td>Elma</td>
        <td>10₺</td>
        <td><a href="#" class="linkss">Delete ✕</a></td>
        <td><a href="#" class="linkss-warning">Güncelle ⚠</a></td>
    </tr>

    <tr>
        <td>1</td>
        <td>Muz</td>
        <td>8₺</td>
        <td><a href="#" class="linkss">Delete ✕</a></td>
        <td><a href="#" class="linkss-warning">Güncelle ⚠</a></td>
    </tr>

</tbody>
</table>

Şimdi ise, views dizini içerisindeki ajax.php dosyasını açalım. Şunu da belirtelim. Mvc'i mimarisindeki ajax işlemleri, views dosyalarında yapılır ve yine aynı şekilde controllers dosyalarında kontrol edilir. Yapı hemen hemen aynı mantıkla çalışır ve aşağıdaki kodları ekleyelim.

JavaScript:
<script type="text/javascript">

$(document).ready(function(){

$("#meyveAdi").click(function() {
    let meyveAdi = "Elma";
    $.post("<?= BASE_URL; ?>/ajax/meyveEkle",{'meyve': meyveAdi}, function(response) {
    alert(response);
    });

});
});

</script>

Yukarıdaki kodlaro açıklayacak olursak, Sadece gelen cevabı almak istediğimizi görebiliriz. input içerisindeki meyveAdi id değerini alacağız. Deneme amaçlı let ile bir elma verisi tutan meyveAdi diye bir değişken oluşturduk ve inputun üzerine tıklandığında bize elma değerini vermesi gerekiyor ama bundan önce controllers dizini içerisindeki ajax.php dosyasını açalım ve içerisinde aşağıdaki methodu oluşturalım.

PHP:
public function meyveEkle()
{
    $meyveAdi = $this->post("meyve");
    echo $meyveAdi;
}

Şimdi tarayıcımız da http://localhost/netron/ajax/index urlini açalım meyve inputunun üstüne tıklayalım. Elma şeklinde uyarımızın geldiğini görebiliriz.

Ajax Veri İşlemleri

Ajax veri işemlerinden önce testlerimizi yapmıştık. Şimdi de ajax işlemini yapabiliriz. Önce ekleme işlemini yapacağınız bunun için views dizini içerisindeki ajax.php dosyasını açıp ajax kodlarımızı aşağıdaki gibi yazalım.

JavaScript:
<script type="text/javascript">

$(document).ready(function(){

$("#meyveEkle").click(function() {

    let meyveAdi    = $("#meyveAdi").val();
    let fiyat    = $("#fiyat").val();
    if(meyveAdi.length == "" || fiyat.length == ""){

        $(".result").html(`<div class="alert alert-danger">Lütfen formu doldurun ve tekrar deneyin!</div>`);
        endMessage();

    }else{

        $.ajax({

            type   :   "POST",
            url    :   "<?= BASE_URL; ?>/ajax/meyveEkle",
            data   :   {'meyveAdi' : meyveAdi, 'fiyat' : fiyat},
            dataType : 'JSON',
            success : function(response) {
                if(response.durum === "basarili" ){
                    alert("Meyve verisi eklendi");
                }
            }


        }); // close ajax
    }

});
});

//form input tipi button olmazsa ise çalışmaz.
function endMessage() {
    setTimeout(function() {
        $(".alert").hide();
    },3000);
}
</script>

Şimdi controllers dizini içerisindeki ajax.php dosyasını açıp __construct() üstünde aşağıdaki public değişkenini tanımlayalım.

PHP:
public $model;

Şimdi controllers dizini içerisindeki ajax.php dosyasını açıp __construct() içerisine aşağıdaki modeli tanımlayalım.

PHP:
$this->model = $this->model('ajaxModel');

Şimdi controllers dizini içerisindeki ajax.php dosyasını açıp kodlarımızı aşağıdaki gibi yazalım.

PHP:
/*
    * Ajax'tan gelen verileri işleyecek methodumuz
*/
public function meyveEkle()
{
    $meyveAdi = $this->post("meyveAdi");
    $fiyat    = $this->post("fiyat");

    $data = [
        'meyve_adi' => $meyveAdi,
        'meyve_fiyat' => $fiyat,
    ];

    if($this->model->meyveEkle($data)){

        echo json_encode(['durum' => 'basarili']);

    }

}

Şimdi models dizini içerisinde ajaxModel.php dosyası oluşturalım ve içerisini aşağıdaki gibi kodlayalım.

PHP:
<?php

class ajaxModel extends Database
{
    public function meyveEkle($data)
    {

        if($this->Ekle("meyve", $data)){
            return true;
        }else{
            return false;
        }

    }
}

?>

Şimdi tarayıcımız da http://localhost/netron/ajax alanına gidelim bir tane meyve ekleyelim ve başarılı bir şekilde eklendiğini görebiliriz.

Şimdi ise başarılı mesajı yazdıralım. Buttona tıkladığında ekleniyor yazsın ve gönderim yapıldıktan sonra input değerlerini resetlesin. Ajax kodumuz aşağıdaki gibi olacak.

JavaScript:
<script type="text/javascript">

$(document).ready(function(){

    $("#meyveEkle").click(function() {

        let meyveAdi    = $("#meyveAdi").val();
        let fiyat    = $("#fiyat").val();
        let btnValue    = $("#meyveEkle").val();
        if(meyveAdi.length == "" || fiyat.length == ""){

            $(".result").html(`<div class="alert alert-danger">Lütfen formu doldurun ve tekrar deneyin!</div>`);
            endMessage();

        }else{

            $.ajax({
                // Post tipinde
                type   :   "POST",
                //İşleneceği controllers ve methodu
                url    :   "<?= BASE_URL; ?>/ajax/meyveEkle",
                //json formaytında yukarıdan aldığımız inputtan gelen veriler
                data   :   {'meyveAdi' : meyveAdi, 'fiyat' : fiyat},
                //json tipi
                dataType : 'JSON',
                // Buttonun üzerine tıklandığında ekleniyor yazacak.
                beforeSend: function(){
                $("#meyveEkle").attr("value", "Ekleniyor...");
                },
                // Başarı mesajı
                success : function(response) {
                    // 1,5 saniye sonra çalıştır.
                    setTimeout(function () {
                        //controllerden gelen değer başarılı ise
                        if(response.durum === "basarili" ){
                            // Başarılı mesajıdır / html veri gönderimi yapar.
                            $(".result").html(`<div class="alert alert-success">İşlem başarıyla kaydedildi.</div>`);
                            //Aşağıdaki mesaj gösterim süresi
                            endMessage();
                            //Form Verilerinin gönderildikten sonra silinmesi
                            $("#myForm").trigger("reset");
                            //Meyve ekle buttonunun tekrar yazılması
                            $("#meyveEkle").attr("value", "Meyve Ekle")
                        }
                    }, 1500);
                }

            }); // close ajax
        }

    });
});

function endMessage() {
    setTimeout(function() {
        $(".alert").hide();
    },3000);
}

</script>

Şimdi ise ajax ile verilerimi listeleyeceğiz. Bunun için ilk önce models dizini içerisindeki ajaxModel.php dosyamızı açalım ve içerisine aşağıdaki methodu yazalım.

PHP:
public function meyveleriGetir()
{

    $user_id = $this->session_getir('kullanici_id');
    if($this->Select_Where("meyve", ['user_id' => $user_id])){
        if($this->satirSay() > 0){
            return $this->tumKayitlar();
        }else{
            return false;
        }
    }
}

Şimdi controllers dizini içerisindeki ajax.php dosyamızı açalım ve içerisine aşağıdaki methodu yazalım.

PHP:
public function meyveleriGetir()
{
    $sonuc = $this->model->meyveleriGetir();

    if($sonuc){
        // data key tutacak ajax döngüsünde datamız key olacak.
        echo json_encode(['durum' => 'basarili', 'data' => $sonuc]);

    }else{
        // Sonra işlenecek.
        echo json_encode(['durum' => 'kayitYok']);
    }
}

Şimdi views/parts dizini içerisindeki meyve.php dosyamızı açalım ve içerisindeki tabloyu kaldırıp aşağıdaki kodu ekleyelim.

HTML:
<div id="table">

</div>

Şimdi views dizini içerisindeki ajax.php dosyamızı açalım ve içerisinde aşağıdaki ajax kodlarımızı yazalım.

JavaScript:
<script type="text/javascript">

function meyveleriGetir() {

$.ajax({

    type        : 'POST',
    url         : "<?= BASE_URL; ?>/ajax/meyveleriGetir",
    dataType    : 'JSON',
    success     : function(response) {
        if(response.durum === "basarili"){
            // table bol bir değişken oluşturuyoruz.
            let table = "";

            //boş bir id değerine sahip tablo html'i oluşturuyoruz.
            $("#table").html('');
            //Verileri döngüye sokuyoruz.
            response.data.forEach(function(element) {
                //Yukarıda oluşturduğumuz tablo değişkenine html tablosu depoluyoruz.
                //ve döngüden gelen değerleri alıyoruz.
                table += ` <tbody><tr>
                            <td>${element.meyve_adi}</td>
                            <td>${element.meyve_fiyat}.00₺</td>
                            <td><a href="#" class="linkss">Delete ✕</a></td>
                            <td><a href="#" class="linkss-warning"><Güncelle ⚠</a></td>
                            </tr></tbody>`;
            });
                                    //Tablo head başlıklarını döngünün dışında tutuyoruz.
                                    $("#table").html(`<table class="table m-20">
                                    <thead class="table m-20">
                                    <tr>
                                    <th>İsim</th>
                                    <th>KG Fiyatı
                                    <th>Sil</th>
                                    <th>Güncelle</th>
                                    </tr>
                                    </thead>${table}</table>`)
        //Kayıt yoksa alanı sonra işlenecek.
        }else if(response.durum == "kayitYok"){

        }
    }

});

}

// Fonksiyonu fonkisoyun dışında tanımlıyoruz.
meyveleriGetir();

</script>

Yukarıdaki meyveleriGetir(); fonksiyonunu, meyve ekleme ajaxında da kullanmanız gerekecek. Sebebi ise veri eklemesi yapıldığında o meyveleriGetir(); hemen isteğe tabi tutsun. Aksi halde sayfayı tekrar yenilemeniz gerekir. fonksiyonu başarılı mesajın hemen altına yerleştirmeniz yeterlidir.

Şimdi güncelleme işlemi için güncelleme linkini aşağıdaki gibi düzenleyelim

HTML:
<td><a href="javascript:void(0);" class="linkss-warning" onclick="data_guncelle(${element.id}, '${element.meyve_adi}', ${element.meyve_fiyat});">Güncelle ⚠</a></td>

Şimdi views/parts dizini içerisindeki meyve.php dosyasını açalım, number inputunun hemen altına aşağıdaki inputu ekleyelim.

HTML:
<input type="hidden" id="meyveId" value="">

Şimdi views dizini içerisindeki ajax.php dosyasını açalım ve aşağıdaki fonskiyonu yazalım.

JavaScript:
function data_guncelle(id, meyve_adi, meyve_fiyat) {
    $("#meyveAdi").attr("value", meyve_adi);
    $("#fiyat").attr("value", meyve_fiyat);
    $("#meyveEkle").attr("value", "Meyve Güncelle");
    $("#meyveId").attr("value", id);
}

Şimdi tarayıcımızda http://localhost/netron/ajax alanına gidelim güncelleme alanının çalıştığını görebiliriz.
 
Evet, Php'de Mvc framework nasıl yapılır görmüş olduk. Bunu geliştirmek daha iyi hale getirmek sizin elinizde. Eğer ben mevcut Laravel, symfony gibi frameworkleri kullanmak istemiyorum, kendi framework yapımı hazırlamak istiyorum diyorsanız böyle bir yapı kendinize hazırlayabilir daha geliştirebilirsiniz. Benim kendime hazırladığım çok çok gelişmiş bir framework yapım var. Projelerimde hazır framework tercih etmeyeceksem kendi framework yapımı kullanıyorum. Ama Laravel, symfony gibi güzel frameworkleri de kullanabilirsiniz en azından şu anda bunlarında nasıl çalıştığının mantığını anlamış oldunuz.

Buradaki makale tarafımca hazırlanmış olup, XGT dışında paylaşılması yasaktır.

Saygılar, sevgiler.
 
Ellerine, emeğine sağlık kanka efsane bir çalışma. Fazlasıyla emek harcanmış sabrın ve emeklerin için teşekkürler 👏👏
 
Ellerine, emeğine, beynine ve de gözlerine sağlık Fikret, oku oku bitmiyor, ben okumaya üşendim bu kadar yazıyı sen nasıl yazdın. :D
 

Foruma hoş geldin 👋, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.