• 14-10-2010, 19:36:44
    #1
    Eposta Aktivasyonu Gerekmekte
    MVC desenini temel seviyede bilen ve arayış içerisinde olan kişiler için , bu desen ile yazıp kullandığım ve Jquery-Ajax ile süslediğim örneği veriyorum.
    Yararlı olacaktır.

    Dosya Klasör düzeni şu şekildedir.

    Dir/
    .htaccess
    Classes/
    -Model/
    --DB-Query.php
    --Address_Model.php
    --IModel/
    ---IModel_Address.php


    -Controller
    --Address_Controller.php
    --MainController.php

    -View
    --Address_View.php
    --Main_View.php


    Sql
    CREATE TABLE `nizzo_address` (
    `addressID` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `address` VARCHAR( 50 ) NOT NULL ,
    `relationID` INT( 11 ) NOT NULL ,
    `case` BOOL NOT NULL DEFAULT '1',
    INDEX ( `address` , `regionID` , `case` )
    ) ENGINE = MYISAM ;;
    Şehir-İlçe-İl verileri
    http://hotfile.com/dl/75982448/73729...dress.sql.html



    Dosya içerikleri

    DB-Query.php -- Veritabanı işlemleri sınıfımız.Bunu ayrı bir konu olarakta paylaşmıştım.Biraz daha değişiklik yapılmış hali.
    <?php if(!defined('BASE_URL')) exit(iconv('UTF-8','windows-1254','Sayfa Bulunamadı'));
    /* |DB_Query | @mail = nizzo@windowslive.com| */
    
    class DB_Query
    {
        #    Veritabanı Bağlantı Değişkenleri #######
        var $server     = "localhost";
        
        var $database     = "nizzoEmlak";
        
        var $user         = "root";
        
        var $password     = "1";
        
        var $prefix     = "nizzo_";
        
        var $chacterSet    = "UTF8";
        
        var $connect    = null;
        ############################################
        
        #    SQL Sorgu Cümleciği Değişkeni
        var $sql         = null;
        
        #    Sorgu Çalıştırma Değişkeni
        var $query         = null;
        
        #    Sorgu Sonucunu Tutan Durum Değişkeni
        var $case         = null;
        
        #    Sorgu Sonucu Elde Edilen Satır Sayısını Tutan Değişken
        var $count         = null;
        
        #    Sorguyu Tutan Değişken
        var $row         = null;
        
        #    Sorgu Sonucunu Tutan Değişken
        var $result     = null;
        
        #    Çoklu Sorguda Alınan Verileri Tutan Dizi
        var $results     = array();
        
        
    ###########################################################################
        
        public function Connect()
        {
            try
            {
                $this->connect = mysql_connect($this->server,$this->user,$this->password) or die ($TXT[1]); 
                mysql_select_db($this->database,$this->connect) or die ($TXT[2]); 
                mysql_query("SET NAMES '" . $this->chacterSet . "'") or die ($TXT[3]);
            }
            catch(Exception $ex)
            {
                echo 'Hata oluştu\n' . $ex->getMessage();
            }
        }
        
        
        /*
         |Veritabanında sorgu çalıştırmak| 
        */
        public function Query()
        {
            try
            {
                $this->Connect();
                /* Sorguyu çalıştırıyoruz */
                $this->query = mysql_query($this->sql, $this->connect) or die (mysql_error());
                /**************************/
            }
            catch(Exception $ex)
            {
                echo 'Hata oluştu\n' . $ex->getMessage();
            }
            
            /* Sonuç olumlumu kontrol ediyoruz */
            if($this->query): 
            
                /* Sorguyu farklı fonksiyonlarda kullanmak için alıyoruz */
                $this->row = $this->query;
                /*********************************************************/ 
                
                /* Sorgu başarılı olduğu için case'i true yapıyoruz */
                return $this->case = true; 
                /****************************************************/
            
            else: 
                
                /* Sorgu başarısızsa case'i false yapıyoruz */
                return $this->case = false;
                /********************************************/ 
    
            endif;
            /***********************************/
            
        }
        /*
         |Query() - sonu| 
        */
        
    #############################################################################
        
        
        /*
         |Veritabanından kayıt sayısı almak| 
        */
        public function Count()
        {
            
            /* Sorgumuzu çalıştırıyoruz */
            $this->Query();
            /****************************/
            
            /* Kayıtları diziye aktaryoruz */
            $this->count = mysql_fetch_array($this->row);
            /*******************************/
            
            /* Dizinin ile elemanını alıyoruz */
            $this->count = $this->count[0];
            /**********************************/
            
            /* Sonuç varsa dönen sorgu sonucunu aksi halde false geri gönderiyoruz */
            if($this->count > 0) return $this->count; else return false; 
            /***********************************************************************/
                
        }
        /*
         |Count() - sonu| 
        */
        
    ############################################################################
        
        /*
         |Veritabanından tek satır çekmek|
        */
        public function Row()
        {
            /* İstenen sorguya ait kayıt varmı kontrol ediyoruz */
            if($this->Count() !== false):
                
                /* İstediğimiz kayıt varmı cevap bekliyoruz */
                if($this->Query() !== false):
                
                    /* Dönen kayıtı alip return ile geri gönderiyoruz */
                    return $this->result = mysql_fetch_assoc($this->row);
                    /**************************************************/
                
                /* İstediğimiz kayıt bulunamamışsa dönüş değerini false yapıyoruz */
                else: return false; endif;
                /******************************************************************/
            
            /* İstenen kayıt yoksa durumu false gönderiyoruz */
            else: return false; endif;
            /***************************************************/    
            
        }
        /*
         |Row() - sonu| 
        */
    
    #############################################################################
        
        /*
         |Veritabanından birden fazla sonuç çekmek|
        */
        public function Results() //Kullanım : $db->Results();
        {
            
            /* Sorgu'dan dönüş cevabını alıyoruz */
            if($this->Count() !== false):
            
                /* Kayıt bir ve üstü ise verileri almak için çalıştıryoruz */
                $this->Query();
                /***********************************************************/
                
                /* Kayıt alanlarını sırasıyla diziye aktarıyoruz */
                while($this->result = mysql_fetch_array($this->row)):
                
                    /* İşlenen kayıtı dizimize ekliyoruz */
                    $this->results[] = $this->result;
                    /*************************************/
                    
                endwhile;
                /**************************************************/
                
                /* Dizimizin son halini geri gönderiyoruz */
                return $this->results;
                /******************************************/
    
            /* Kayıt bulunamamışsa fonksiyondan false değer gönderiyoruz */
            else: return false; endif;
            /*************************************************************/
            
        }
        /*
         |Results() - sonu|
        */
    }
    ?>



    Şimdi nizzo_address tablomuzu IModel_Address.php sınıfımızda modelliyelim. (Katmansal mimari)

    IModel_Address.php - Dikkat edin nizzo_address tablosu ile oluşturduğumuz model sınıfın private özellikleri ile public methodları aynı isimle kullanılıyor.Bu bir zorunluluk değil mimari yapının düzenli olmasını sağlıyoruz sadece.
    <?php if(!defined('BASE_URL')) exit(iconv('UTF-8','windows-1254','Sayfa Bulunamadı'));
    
    class IModelAddress
    {
        private $addressID;
        public function AddressID($addressid = null)
        {
            if($addressid == null): return $this->addressID;
            else:
            
                try
                {
                    if(!is_numeric($addressid) || $addressid < 1) throw new Exception("addressID 1'den küçük olamaz yada rakam dışı karakter olamaz.");
                    else $this->addressID = $addressid;
                }
                catch(Exception $ex)
                {
                    echo $ex->getMessage();
                }
                
             endif;
        }
        
        private $addressName;
        public function AddressName($addressname = null)
        {
            if($addressname == null) return $this->addressName;
            else $this->addressName = $addressname;
        }
        
        private $addressRelationID;
        public function AddressRelationID($addressrelationid = null)
        {
            if($addressrelationid == null): return $this->addressRrelationID;
            else:
            
                try
                {
                    if(!is_numeric($addressrelationid) && $addressrelationid < 0) throw new Exception("relationID 0'den küçük olamaz");
                    else $this->addressRrelationID = $addressrelationid;
                }
                catch(Exception $ex)
                {
                    echo $ex->getMessage();
                }
            
            endif;
        }
        
        private $addressCase;
        public function AddressCase($addresscase = null)
        {
            if($addresscase == null) return $this->addressCase;
            else $this->addressCase = $addresscase;
        }
        
    }
    ?>


    Şimdide modelimiz ve veritabanı sınıfımızı kullanarak Address_Model.php sınıfımızı yazalım.

    Address_Model.php
    <?php if(!defined('BASE_URL')) exit(iconv('UTF-8','windows-1254','Sayfa Bulunamadı'));
    require 'DB-Query.php';
    require 'IModel/IModel_Address.php';
    
    class Address
    {
        public static function GetAddress($ID,$parameters = '*')
        {
            $ID = mysql_real_escape_string($ID);
            $parameters = mysql_real_escape_string($parameters);
            
            $db = new DB_Query();
            $db->sql = "Select " . $parameters . " From " . $db->prefix . "address";
            
            if(isset($ID) && !empty($ID)) $db->sql .= " Where relationID='" . $ID . "'";
            
            if($db->Results() !== false):
            
                $Iaddresses[] = new IModelAddress();
                
                foreach($db->results as $db->result):
                
                    $Iaddress = new IModelAddress();
                    $Iaddress->AddressID($db->result['addressID']);
                    $Iaddress->AddressName($db->result['address']);
                    $Iaddress->AddressRelationID($db->result['relationID']);
                    $Iaddress->AddressCase($db->result['case']);
                    
                    $Iaddresses[] = $Iaddress;
                
                endforeach;
                
                return $Iaddresses;
                
            else: return false; endif;
        }
    }
    ?>
    Eveet model yani veritabanı işlemlerimizi tamamen hazırladık şimdi controllere geçebiliriz.

    Querstringleri bu sayfada toplayıp gelen değerlere göre model ve view dosyalarından işlemleri yapıp dönen sonucu ekrana göstereceğimiz kısım.

    Main_Controller.php - Anasayfa olarak kullandığım dosya.
    <?php
    define('BASE_URL','nizzo');
    define('_CLASSES_DIR_','Classes/View/Themes/Orjinal/');
    define('_THEME_','../View/Themes/Orjinal/');
    
    switch($_GET['action']):
    
        default: require '../View/Main_View.php'; break;
        case 'main': require '../View/Main_View.php'; break;
            
    endswitch;
    ?>


    Address_Controller.php - Jquery ile bu sayfaya querystring gönderip işlem sonuçlarını alacağız.
    <?php 
    define('BASE_URL','nizzo');
    
    switch($_GET["action"]):
    
        case "city":
    
            require '../Model/Address_Model.php';
            require '../View/Address_View.php'; 
    
            switch($_GET['where']):
            
                case "AllCity":     AllCity(); break;
                case "AllCounty":     AllCounty($_GET['ID'], $_GET['select']); break;
                case "AllRegion":     AllRegion($_GET['ID'], $_GET['select']); break;
                            
            endswitch;
            
        break;
        
    endswitch;
    ?>

    Controller bu kadar.Şimdide ekranda görünecek olan dosyalarımızı hazırlayalım.


    Address_View.php - Şehir,ilçe,semt fonksiyonlarımızın bulunduğu bölüm. Dikkat edin direk olarak bu sayfa çağırılamaz view ve model dosyalarını direk çağıramazsınız controller içinde bulunan sayfadan require edilerek gösterilebilir sadece.Adı üstünde , kontrol.
    <?php if(!defined('BASE_URL')) exit(iconv('UTF-8','windows-1254','Sayfa Bulunamadı'));?>
    <?php function AllCity() {?>
    
        İl<br />
        <select id="name" name="city" onchange="Javascript:returnAddress(this.value,'*',1,'county');">
        <option value="0">Seçiniz</option>
        <?php foreach(Address::GetAddress() as $address):?>
        
            <option value="<?php echo $address->AddressID();?>"><?php echo $address->AddressName();?></option>
        
        <?php endforeach;?>
        </select>
        
    <?php }?>
    
    <?php function AllCounty($ID,$parameters) {?>
    
        İlçe<br />
        <select name="county" onchange="Javascript:returnAddress(this.value,'*',2,'region');">
        <option value="0">İlçe Seçiniz</option>
        <?php foreach(Address::GetAddress($ID,$parameters) as $address):?>
        
            <option value="<?php echo $address->AddressID();?>"><?php echo $address->AddressName();?></option>
        
        <?php endforeach;?>
        </select>
    
    <?php }?>
    
    
    <?php function AllRegion($ID,$parameters) {?>
    
        Semt<br />
        <select name="region">
        <option value="0">Semt Seçiniz</option>
        <?php foreach(Address::GetAddress($ID,$parameters) as $address):?>
        
            <option value="<?php echo $address->AddressID();?>"><?php echo $address->AddressName();?></option>
        
        <?php endforeach;?>
        </select>
    
    <?php }?>
    Ve geldik anasayfamıza

    Main_View.php - Anasayfa olarak kullandığım dosya. Jquer ile il,ilçe,semt seçimlerini sayfa postback olmadan hallediyoruz buradada.
    <?php if(!defined('BASE_URL')) exit(iconv('UTF-8','windows-1254','Sayfa Bulunamadı'));?>
    <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="tr">
    <head>
    <title>Anasayfa</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <script src="<?php echo _CLASSES_DIR_;?>js/jquery.js" type="text/javascript"></script>
    <script type="text/javascript">
    $(function () {
    
        //Sayfa yüklendiğinde sadece şehirleri gösterecek
        returnAddress("","","","city");
     
    }); 
    
    //Seçime göre get işlemlerini yapıyoruz
    function returnAddress(ID, parameter, type, resultDiv)
    {
        $("#" + resultDiv).html('<select><option>Bekleyin...</option></select>');
        var tip;
        if(type == "") tip = 'AllCity';
        else if(type == 1) tip = 'AllCounty';
        else if(type == 2) tip = 'AllRegion';
        else tip = 'AllCity';
    
        var str = "action=city&where=" + tip;
        
        if(ID != "") str += '&ID=' + ID;
        if(parameter != "") str += '&select=' + parameter;
        
            $.ajax({
                type: 'GET',
                url: 'Classes/Controller/Address_Controller.php',
                data: str,
                success: function(result) {
                    $('#' + resultDiv).html(result);
                }
            })
    }
    </script>
    </head>
    <body>
            <form action="#" method="post">
                <ul>
                    <li id="city"><p>İl</p></li>
                    <li id="county"><p>İlçe</p>
                    <select>
                        <option value="0">İl Seçiniz</option>
                    </select></li>
                    <li id="region"><p>Semt</p>
                    <select>
                        <option value="0">İlçe Seçiniz</option>
                    </select></li>    
                </ul>
            </form>
    </body>
    </html>
    Gördüğünüz gibi anasayfada güvenlik kontrolü hariç hiç php kodu kullanmadık, buda tasarımı editlerken zorlanmamamızı sağlıyor.


    'Ziyaretçi www.xxx.com olarak giriş yaptığında , Classes içinde Controller içinde Main_Controller.php içinde anasayfayı çalıştırmamızı sağlıyacak parametreyi nasıl göndercez ?' derseniz.

    RewriteRule ^index.php|index.html Classes/Controller/MainController.php?action=index
    Bunuda htaccess ile yönlendireceksiniz.


    Geldik sona

    Tabi kodlar dahada kısaltılabilir yada Classes klasörü içerisinde değilde direk ana dizinde tutulabilir. Burada amaç MVC yapısını ve nasıl kodlarda düzen sağlanır onu göstermek.

    Yararlı olmuştur umarım.
    İyi çalışmalar.

    NiZZo_

    Yanlış sql'i vermişim düzelttim.
  • 14-10-2010, 19:41:55
    #2
    Üyeliği durduruldu
    eline sağşık.
    ayrıca var şeklinde değişken tanımlamaya gerek yok artık. php 5 itibari ile public olarak tanır onu.