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.