<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CETURK &#187; MVC</title>
	<atom:link href="http://www.ceturk.com/kategori/web-teknolojileri/mvc/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ceturk.com</link>
	<description>Türkiye&#039;nin Bilişim Platformu</description>
	<lastBuildDate>Sat, 05 May 2012 16:04:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>PHP Faces MVC 2</title>
		<link>http://www.ceturk.com/php-faces-mvc-2/</link>
		<comments>http://www.ceturk.com/php-faces-mvc-2/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 22:50:05 +0000</pubDate>
		<dc:creator>Olcay KÜK</dc:creator>
				<category><![CDATA[MVC]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[Web Teknolojileri]]></category>
		<category><![CDATA[php faces]]></category>
		<category><![CDATA[PHP Faces MVC 2]]></category>
		<category><![CDATA[PHP MVC]]></category>

		<guid isPermaLink="false">http://www.ceturk.com/?p=3118</guid>
		<description><![CDATA[Merhabalar bu makale PHP Faces MVC yapısını tanıtmayı amaçlayan giriş niteliğinde bir yazıdır. PHP Faces JSF, Structs, Coldfusion, gibi Uygulama çatılarından bir takım özellikleri örnek almış PHP5 ve üzeri için geliştirilmiş AJAX destekli bir uygulama çatısıdır. PHP Faces’ı PHP tarafındaki diğer çatılardan ayıran en önemli özeliklerinin başında Bileşen tabanlı olması ve olay yönelimli programlama yapmanıza [...]]]></description>
			<content:encoded><![CDATA[<p>Merhabalar bu makale PHP Faces MVC yapısını tanıtmayı amaçlayan giriş niteliğinde bir yazıdır.</p>
<p>PHP Faces JSF, Structs, Coldfusion, gibi Uygulama çatılarından bir takım özellikleri örnek almış PHP5 ve üzeri için geliştirilmiş AJAX destekli bir uygulama çatısıdır. PHP Faces’ı PHP tarafındaki diğer çatılardan ayıran en önemli özeliklerinin başında Bileşen tabanlı olması ve olay yönelimli programlama yapmanıza imkân tanımasıdır.</p>
<p><span id="more-3118"></span>PHP Faces çatısının Model yapısı ORM(Object Relation Mapping) ile desteklenmiştir. Özellikle Java programcılarının PHP de arayıp ta bulamadıkları tarzda bir uygulama çatısıdır.</p>
<p><strong>Kurulum </strong>phpfaces.zip dosyasını bir dizine çıkarın ve ilgili phpfaces klasörünü sunucunuza taşıyın kurulum için yapmanız gereken şimdilik sadece bu kadar.PHP faces’ı diğer frameworkler gibi dizin yapısı ile birliktede kullanabilirsiniz bunun için bir takım ayarlamalar yapmanız gerekli makale giriş niteliğinde olduğundan detaylara fazla girmeyeceğim.</p>
<p><strong>Faces Kontrolcüleri </strong>Çatı içerisinde bileşen desteği olan iki kontrolcü bulunmaktadır bunlar FacesController ve Facete sınıflaraıdır . FacesController java swing uygulamalarındaki gibi listener ara yüzleri ile olay yakalamayı gerçekleştirir. Facete ise Basic ve Delphi dekine benzer bir yapıdadır.</p>
<p><strong>Faces Görünüm</strong> view(görünüm) dosyaları XML biçimini destekler ve &lt;faces&gt;&lt;/faces&gt; etiketleri arasına yazılır.<strong> </strong></p>
<p><strong>Faces Model</strong> Yukarıda da belirdiğim gibi PHP Faces bu katmanda ORM kullanır bunun için sisteminizde PHP PDO eklentisinin kullanılabilir durumda olması gerekmekte.</p>
<p>Aşağıda Controller ve View kullanan basit bir php faces uygulaması var. Bu uygulamada Ad,Soyad,Email,ve adres bilgilerini sunucumuza göndericeğiz ancak uygulamamızın bazı özellikleri var.</p>
<p>Ad&amp;Soyad alanı boş ise bunu kullanıcıya bildiriyoruz yine benzer şekilde email alanındaki bilgi doğru bir e posta adresi değilse bunu da kullanıcıya bir hata olarak bildiriyoruz. Kullanıcı adresi belirlerken iki select kutumuz var. Birinci kutu şehirler için şehir bilgisi değiştiğinde ilçe kutumuzu seçilen şehir’e ait ilçelerle doldurmamız gerekiyor üstelik tüm bunları AJAX kullanarak yapacağız.</p>
<p><img class="alignnone size-full wp-image-3119" title="form" src="http://www.ceturk.com/images/form.jpg" alt="form" width="548" height="220" /></p>
<div>
<pre class="brush:csharp">
&lt;?php
define("BASE_URL","http://localhost/phpfaces/");
require_once ("phpfaces/system/PHPFaces.php");
import("phpf.controllers.facete");
import("io.validator");
class Sayfa extends Facete {
function Sayfa() {
parent::Facete();
$this-&gt;setValidCallBack(true);
$this-&gt;render("gorunum.html");

}
protected function illerChanged($olay) {//iller kutusu değiştiğinde çalışcak olan metot
$tumilceler = array(
"Ankara"=&gt;array(Keçiören,Mamak,Çankaya,Yenimahalle,Sincan),
"İstanbul"=&gt;array( Adalar,Arnavutköy,Ataşehir,Bağcılar,Bakırköy),
"İzmir"=&gt;array( Adalar,Arnavutköy,Ataşehir,Bağcılar,Bakırköy)
);
$il = $this-&gt;iller-&gt;getSelected();
if(array_key_exists($il,$tumilceler))
$this-&gt;ilceler-&gt;setModel($tumilceler[$il]);
else
$this-&gt;ilceler-&gt;setModel(null);
$this-&gt;AjaxResponse();
}
protected function btnClicked($olay) {//btn buttonuna tıklandığında Formumuz post edildiğinde çalışacak metot
$gelen= "Gönderilen &lt;br&gt;&lt;b&gt;Ad soyad = ".$this-&gt;adsoy-&gt;text;
$gelen.= "&lt;br&gt;Email = ".$this-&gt;email-&gt;text;
$gelen.= "&lt;br&gt;Adres = ".$this-&gt;iller-&gt;getSelected()."/".$this-&gt;ilceler-&gt;getSelected()."&lt;/b&gt;";
$this-&gt;gonderilen-&gt;setText($gelen);
$this-&gt;AjaxResponse();
}
}
$sayfa = new Sayfa();
?&gt;</pre>
</div>
<p>Örneğimizin View(Görünüm) dosyası</p>
<div>
<pre class="brush:csharp">
<pre>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;</pre>
<pre>&lt;html&gt;</pre>
<pre>    &lt;head&gt;</pre>
<pre>    &lt;title&gt;Kayıt&lt;/title&gt;</pre>
<pre>    &lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;</pre>
<pre>&lt;/head&gt;</pre>
<pre>&lt;body&gt;</pre>
<pre>&lt;faces&gt;</pre>
<pre>    &lt;@import taglib="phpf.ui.*" prefix="f"/&gt;</pre>
<pre>    &lt;f:form id="form" method="post"&gt;</pre>
<pre>        &lt;table&gt;&lt;tr&gt;&lt;td&gt;   Ad &amp; Soyad : &lt;/td&gt;</pre>
<pre>                &lt;td&gt;</pre>
<pre>            &lt;f:textbox id="adsoy"</pre>
<pre>                       validator="validator"</pre>
<pre>                       rule="required"</pre>
<pre>                       message="Lütfen Ad &amp; Soyad alanı boş bırakmayın"</pre>
<pre>                       messagefor="hata1"/&gt;</pre>
<pre>            &lt;font color="red"&gt;</pre>
<pre>                &lt;f:message id="hata1"/&gt;</pre>
<pre>            &lt;/font&gt;</pre>
<pre>            &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;</pre>
<pre>                &lt;td&gt;Email Adresiniz :&lt;/td&gt;</pre>
<pre>                &lt;td&gt; &lt;f:textbox id="email"</pre>
<pre>                            validator="validator"</pre>
<pre>                            rule="mail"</pre>
<pre>                            message="Hatalı bir e-mail adresi girdiniz."</pre>
<pre>                            success="E-mail adresiniz doğrulandı"</pre>
<pre>                            messagefor="hata2"/&gt;</pre>
<pre>            &lt;font color="red"&gt;</pre>
<pre>                &lt;f:message id="hata2"/&gt;</pre>
<pre>            &lt;/font&gt;</pre>
<pre>            &lt;/td&gt;&lt;/tr&gt;</pre>
<pre>            &lt;tr&gt;</pre>
<pre>                &lt;td&gt;Adres  :&lt;/td&gt;</pre>
<pre>                &lt;td&gt;</pre>
<pre>            &lt;f:combobox id="iller" onchange="ajaxevent"</pre>
<pre>                        bind="array(Ankara,İstanbul,İzmir)"&gt;</pre>
<pre>            &lt;/f:combobox&gt;</pre>
<pre>            &lt;/td&gt;</pre>
<pre>            &lt;tr&gt;&lt;td&gt;İlçe :&lt;/td&gt;&lt;td&gt;</pre>
<pre>            &lt;f:combobox id="ilceler"</pre>
<pre>                        bind="array(Keçiören,Mamak,Çankaya,Yenimahalle,Sincan)"&gt;</pre>
<pre>            &lt;/f:combobox&gt;</pre>
<pre>            &lt;/td&gt;&lt;/tr&gt;</pre>
<pre>            &lt;tr&gt;&lt;td colspan="1"&gt;</pre>
<pre>            &lt;f:button id="btn" text="Formu Gonder" onclick="ajaxevent" forname="form"/&gt;</pre>
<pre>            &lt;/td&gt;&lt;/tr&gt;</pre>
<pre>    &lt;/f:form&gt;</pre>
<pre>&lt;/table&gt;</pre>
<pre>&lt;f:label id="gonderilen" &gt;&lt;/f:label&gt;</pre>
<pre>&lt;/faces&gt;</pre>
<pre>&lt;/body&gt;</pre>
<pre>&lt;/html&gt;</pre>
</pre>
</div>
<p>Yukarıdaki örneğimizde tek bir satır bile Javascirpt yazmadan tüm işlemlerimizi MVC içerisinde AJAX kullanarak kolay bir şekilde uyguladık. Eğer AJAX kullanmak istemiyorsanız görünüm dosyasındaki yerine yazmak ve kontrolcümüzdeki  $this-&gt;AjaxResponse(); satırlarını kaldırmak olacak. Bu makalede PHP Faces çatısının C(controller) ve V(View) katmanlarını uygulayarak anlatmaya çalıştım PHPFaces model katmanı başlı başına bir ORM çatısı gibidir. İlerleyen günlerde bu konuda bir makale hazırlaya bilirim. Aşağıda PHPFaces’ı hakkında bazı bağlantıları bulabilirsiniz şimdilik hoşcakalın.</p>
<p><strong>Hüseyin Bora ABACI</strong></p>
<p><strong>PHP Faces çatısını indirmek için.</strong></p>
<p><strong><a href="http://php-faces.googlecode.com/files/phpfaces.zip">http://php-faces.googlecode.com/files/phpfaces.zip</a></strong></p>
<p><strong>PHP Faces için PDF formatında Türkçe e kitap.</strong></p>
<p><strong><a href="http://php-faces.googlecode.com/files/PHP%20Faces.pdf">http://php-faces.googlecode.com/files/PHP%20Faces.pdf</a></strong></p>
<p><strong>PHP Faces blog</strong></p>
<p><strong>http://www.webmahsulleri.com</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ceturk.com/php-faces-mvc-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<enclosure url="http://www.ceturk.com/images/form.jpg" length="67739" type="image/jpg" />	</item>
		<item>
		<title>Erkan Balaban – PHP MVC Demo Videosu</title>
		<link>http://www.ceturk.com/erkan-balaban-php-mvc-demo-videosu/</link>
		<comments>http://www.ceturk.com/erkan-balaban-php-mvc-demo-videosu/#comments</comments>
		<pubDate>Mon, 12 Oct 2009 11:56:20 +0000</pubDate>
		<dc:creator>Yönetici</dc:creator>
				<category><![CDATA[CETURK TV]]></category>
		<category><![CDATA[Genel]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Seminerler]]></category>
		<category><![CDATA[Web Teknolojileri]]></category>
		<category><![CDATA[ceviz.net]]></category>
		<category><![CDATA[Compec]]></category>
		<category><![CDATA[PHP MVC]]></category>
		<category><![CDATA[PHP MVC demo]]></category>
		<category><![CDATA[Seminer]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[Web tekno]]></category>
		<category><![CDATA[Web Teknolojileri Günü]]></category>

		<guid isPermaLink="false">http://www.ceturk.com/?p=2503</guid>
		<description><![CDATA[CETURK &#8211; Ceviz.Net &#8211; Compec işbirliği ile Boğaziçi Üniversitesi&#8216;nde, 9 Mayıs 2009 Cumartesi günü düzenlenen &#8220;Web Teknolojileri Günü&#8221; etkinliğinde Erkan Balaban PHP MVC Sunumunde yaptığı demoyu sizinle paylaşıyoruz. Erkan Balaban PHP MVC Sunumu PHP MVC Demo]]></description>
			<content:encoded><![CDATA[<p>CETURK &#8211; Ceviz.Net &#8211; <a href="../etiket/compec">Compec </a>işbirliği ile <a href="../etiket/bogazici-universitesi">Boğaziçi Üniversitesi</a>&#8216;nde, 9 Mayıs 2009 Cumartesi günü düzenlenen &#8220;<a href="../etiket/web-teknolojileri-gunu">Web Teknolojileri Günü</a>&#8221; etkinliğinde Erkan Balaban PHP MVC Sunumunde yaptığı demoyu sizinle paylaşıyoruz.</p>
<p><a href="http://www.ceturk.com/web-teknolojileri/erkan-balaban-php-mvc-seminer-videosu.html">Erkan Balaban PHP MVC Sunumu</a><br />
<a href="http://www.ceturk.com/genel/erkan-balaban-php-mvc-demo-videosu.html">PHP MVC Demo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ceturk.com/erkan-balaban-php-mvc-demo-videosu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Erkan Balaban &#8211; PHP MVC Seminer Videosu</title>
		<link>http://www.ceturk.com/erkan-balaban-php-mvc-seminer-videosu/</link>
		<comments>http://www.ceturk.com/erkan-balaban-php-mvc-seminer-videosu/#comments</comments>
		<pubDate>Sun, 11 Oct 2009 08:22:41 +0000</pubDate>
		<dc:creator>Yönetici</dc:creator>
				<category><![CDATA[CETURK TV]]></category>
		<category><![CDATA[Manşet]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Seminerler]]></category>
		<category><![CDATA[Web Teknolojileri]]></category>
		<category><![CDATA[ceviz.net]]></category>
		<category><![CDATA[Compec]]></category>
		<category><![CDATA[PHP MVC]]></category>
		<category><![CDATA[Seminer]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[Web tekno]]></category>
		<category><![CDATA[Web Teknolojileri Günü]]></category>

		<guid isPermaLink="false">http://www.ceturk.com/?p=2499</guid>
		<description><![CDATA[CETURK &#8211; Ceviz.Net &#8211; Compec işbirliği ile Boğaziçi Üniversitesi&#8216;nde, 9 Mayıs 2009 Cumartesi günü düzenlenen &#8220;Web Teknolojileri Günü&#8221; etkinliğinde Erkan Balaban PHP MVC Sunumu yaptı. Erkan Balaban PHP MVC Sunumu PHP MVC Demo]]></description>
			<content:encoded><![CDATA[<p>CETURK &#8211; Ceviz.Net &#8211; <a href="http://www.ceturk.com/etiket/compec">Compec </a>işbirliği ile <a href="http://www.ceturk.com/etiket/bogazici-universitesi">Boğaziçi Üniversitesi</a>&#8216;nde, 9 Mayıs 2009 Cumartesi günü düzenlenen &#8220;<a href="http://www.ceturk.com/etiket/web-teknolojileri-gunu">Web Teknolojileri Günü</a>&#8221; etkinliğinde Erkan Balaban <a href="http://www.ceturk.com/etiket/php-mvc">PHP MVC</a> Sunumu yaptı.</p>
<p><a href="../web-teknolojileri/erkan-balaban-php-mvc-seminer-videosu.html">Erkan Balaban PHP MVC Sunumu</a><br />
<a href="../genel/erkan-balaban-php-mvc-demo-videosu.html">PHP MVC Demo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ceturk.com/erkan-balaban-php-mvc-seminer-videosu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Asp.Net MVC ile Kendi Doğrulama Niteliğimizi Yazalım</title>
		<link>http://www.ceturk.com/asp-net-mvc-ile-kendi-dogrulama-niteligimizi-yazalim/</link>
		<comments>http://www.ceturk.com/asp-net-mvc-ile-kendi-dogrulama-niteligimizi-yazalim/#comments</comments>
		<pubDate>Mon, 05 Oct 2009 06:00:12 +0000</pubDate>
		<dc:creator>GokayOkutucu</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[Web Teknolojileri]]></category>
		<category><![CDATA[Asp.Net Mvc]]></category>
		<category><![CDATA[Gökay Okutucu]]></category>
		<category><![CDATA[Membership]]></category>
		<category><![CDATA[Mvc Framework]]></category>

		<guid isPermaLink="false">http://www.ceturk.com/?p=2394</guid>
		<description><![CDATA[Uzunbir aradan sonra herkese merhaba. Daha öncede belirttiğim gibi üzerinde çalıştığım bir proje var. Bu yüzden makalelerime ara vermek zorunda kaldım. Bugün sizlerle birlikte Asp.Net Web Formlar için denediğimiz özel Membership’imizi yani kullanıcı denetleme sistemimizi Asp.Net MVC için yazmaya çalışacağız. Önceki yazımızda Web Form için bu olayı Üst/Taban(Base) bir sınıftan türeterek yaparken, MVC’de sadece doğrulama [...]]]></description>
			<content:encoded><![CDATA[<p>Uzunbir aradan sonra herkese merhaba. Daha öncede belirttiğim gibi üzerinde çalıştığım bir proje var. Bu yüzden makalelerime ara vermek zorunda kaldım.<br />
<img class="aligncenter" src="http://www.ceturk.com/images/attributemvcsamp1.png" alt="" width="500" height="289" /></p>
<p>Bugün sizlerle birlikte Asp.Net Web Formlar için denediğimiz özel Membership’imizi yani kullanıcı denetleme sistemimizi Asp.Net MVC için yazmaya çalışacağız. Önceki yazımızda Web Form için bu olayı Üst/Taban(Base) bir sınıftan türeterek yaparken, MVC’de sadece doğrulama işleminin gerçekleşmesini istediğimiz sınıf üzerine ilgili <span style="font-weight:bold;">Niteliği</span>(Attribute) koyarak yapacağız.</p>
<div><strong>Özel Doğrulama Niteliği</strong></div>
<div><strong><br />
</strong></div>
<div><strong>Nitelikler</strong>(Attributes) bildiğimiz üzere <strong>Yansıma</strong>(Reflection) teknikleri kullanarak çalışma zamanında nesneler ile ilgili bilgilere erişmemizi sağlarlar. <strong>Asp.Net MVC</strong> içerisinde yapacağımız bu projede de eski ve kullanımı zor yöntemlerden sıyrılıp çok daha kolay kullanılabilen bir doğrulama sistemi yazacağız. Bunu bize sağlayan şey ise tabiki de Asp.Net MVC’nin esnekliği ve Nitelikler&#8230;</div>
<div>
<div>Niteliğimizi yazmaya başlamadan önce üye bilgileri tutacağımız <strong>MemberInfo</strong> ve <strong>MemberTicket</strong> sınıflarını yazalım.</div>
<div>
<pre class="brush:csharp">namespace MvcCustomMembership.Helper
{
public class MemberInfo
{
public string User { get; set; }
public MemberTicket Ticket { get; set; }
public bool IsAuthenticate { get; set; }
}

public class MemberTicket
{
public Guid Guid { get; set; }
public int UserId { get; set; }
public string User { get; set; }
public DateTime IssueDate { get; set; }
public DateTime Expiration { get; set; }
}
}</pre>
</div>
</div>
<div>Bu sınıflarda kullanıcı adı, kullanıcı doğrulandı mı doğrulanmadı mı ve <strong>çerez</strong>(cookie) için bazı bilgiler içeriyor. Bu bilgileri <strong>Session’da </strong>tutacağız ve gerektiğinde kullanağız.</div>
<div>Niteliğimizi yazarken <strong>ActionFilterAttribute </strong>isimli <strong>Soyut</strong>(Abstract) sınıfından türettiğimize dikkat ediyoruz. Hatırlayacağınız üzere <strong>soyut</strong>(Abstract) sınıflar içerisinde tanımlanan <strong>soyut metotlar</strong>(Abstract Methods) mutlak suretle <strong>ezilmelidirler</strong>(Override). Şimdi biz de bu metotlardan birini ezerek devre dışı bırakacağız.</div>
<div><span style="font-family:-webkit-monospace;font-size:100%;"><span style=" white-space: pre;font-size:13px;"><span style="font-family:Georgia;font-size:130%;"><span style=" white-space: normal;font-size:16px;"><br />
</span></span></span></span></div>
<div>
<pre class="brush:csharp">public class AuthenticationAttribute : ActionFilterAttribute
{
private HttpContextBase _context;

public Role Roles { get; set; }

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.Controller is ControllerBase)
{
var baseControllar = filterContext.Controller as ControllerBase;
if (baseControllar != null)
{
_context = baseControllar.ControllerContext.HttpContext;

var memberInfo = (MemberInfo)_context.Session["MemberInfo"] ?? new MemberInfo();
Helper.CookieLogin(memberInfo);

if (!memberInfo.IsAuthenticate &amp;&amp; _context.Request.Path != null)
{
    string loginUrl = "~/Account/Login?returnUrl=" + _context.Request.Path;
    filterContext.HttpContext.Response.Redirect(loginUrl);
}
}
}
}
}</pre>
</div>
<div><strong>OnActionExecuting </strong>metodu <strong>Controller </strong>sınıfı içerisinde tanımlanmış olan bir <strong>ActionMethod</strong> çalıştırılmak üzereyken işleme alınır. Burada üzerinde bizim niteliğimiz tarafından işaretlenmiş olan bir <strong>Controller</strong> sınıfı metot gövdesinde kullanılmak üzere parametre ile aktarılıyor. Eğer <strong>Session</strong> da tanımlanmış olan <strong>MemberInfo</strong> null değilse <strong>memberInfo</strong> değişkenine aktarılıyor. Eğer null ise yeni bir <strong>MemberInfo </strong>sınıfı yaratılıyor. Yaratılma işleminden hemen sonra ise daha önce <strong>“Beni Hatırla”</strong> seçeneği işaretlenmişse çerez içerinden bilgiler aktarılıp <strong>memberInfo </strong>sınıfına bu şekilde aktarım gerçekleştiriliyor.</div>
<div>Bir sonraki satırda ise kullanıcının doğrulanma durumu kontrol ediliyor. Doğrulama işlemi gerçekleştirilmemişse kullanıcının hangi sayfadan <strong>Login </strong>sayfasına yönlendirildiğine dair bir <strong>Url</strong> bilgisi elde ediliyor. Böylelikle eğer <strong>About</strong> sayfasına girdiyseniz ve bu sayfada doğrulama işlemi gerekiyorsa, sistem sizi <strong>Login</strong> sayfasına yönlendiriyor(<strong>returnUrl</strong> isimli parametre).</div>
<div>Şimdi geçelim <strong>AccoutController </strong>sınıfımıza. Öncelikle yeni yaratılan <strong>MVC proje şablonu</strong> içerisindeki <strong>AccountController </strong>sınıfının gövdesini temizleyelim ve aşağıdaki kod blogunu buraya geçirelim.</div>
<div>
<pre class="brush:csharp">[HandleError]
public class AccountController : Controller
{
public ActionResult Index()
{
return RedirectToAction("Login");
}

public ActionResult Login()
{
ViewData["Title"] = "Login Page";
return View();
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Login(string username, string password, string rememberMe)
{
//Kullanıcı adı ve şifre kontrollerinide veritabanına bağlanıp yapmalıyız
if (username == "test" &amp;&amp; password == "test")
{
string requestUrl = Request.QueryString.Count &gt; 0 ? Request.QueryString["returnUrl"] : null;

//Bu kısımı database'den gelen veriye göre set etmemiz gerekiyor
var memberInfo = new MemberInfo { IsAuthenticate = true, User = "Gokay" };

Session["MemberInfo"] = memberInfo;
memberInfo.Ticket = new MemberTicket()
{
  User = memberInfo.User,
  Expiration = DateTime.Now.AddMinutes(2),
  IssueDate = DateTime.Now,
  UserId = 1,
  Guid = Guid.NewGuid()
};

if (rememberMe == "on")
  AddCookie(memberInfo);

if (requestUrl != null)
  return Redirect(requestUrl);
return RedirectToAction("Index", "Home");
}
else
return View();
}

private void AddCookie(MemberInfo memberInfo)
{
var myCookie = new HttpCookie("myCookie");

myCookie.Values.Add("userName", memberInfo.User);
myCookie.Values.Add("userIssueDate", memberInfo.Ticket.IssueDate.ToString());
myCookie.Values.Add("userId", memberInfo.Ticket.UserId.ToString());
myCookie.Values.Add("userGuid", memberInfo.Ticket.Guid.ToString());
myCookie.Values.Add("userExpiration", memberInfo.Ticket.Expiration.ToString());

myCookie.Expires = memberInfo.Ticket.Expiration;

Response.Cookies.Add(myCookie);
}

public ActionResult Logout()
{
Session["MemberInfo"] = null;
if (Request.Cookies["myCookie"] != null)
{
RemoveCookie();
}

return RedirectToAction("Index", "Home");
}

private void RemoveCookie()
{
var myCookie = new HttpCookie("myCookie") { Expires = DateTime.Now.AddYears(-1) };

Response.Cookies.Set(myCookie);
}
}</pre>
</div>
<p>En üsteki <strong>Index </strong>isimki <strong>ActionResult</strong> metodumuz tarayıcıdan <strong>http://localhost/Account</strong> biçminde bir istek gelirse <strong>Login</strong> <strong>ActionResult’una </strong>yönlendirme yapıyor. <strong>Login metodu</strong> içerisinde ise doğrulama işlemlerini ele alıyoruz. Bunun için bir de <strong>Login </strong>isimli bir <strong>View</strong> oluşturmamız gerekiyor. Burada kullanıcı arabirimimizi tasarlayacağız.</p>
<div>
<pre class="brush:csharp">&lt;asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"&gt;
&lt;% using (Html.BeginForm())
{ %&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;
Username :
&lt;/td&gt;
&lt;td&gt;
&lt;%= Html.TextBox("username")%&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Password :
&lt;/td&gt;
&lt;td&gt;
&lt;%= Html.Password("password")%&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="2"&gt;
&lt;input id="rememberMe" name="rememberMe" type="checkbox"/&gt;&lt;label for="rememberMe"&gt;Beni Hatırla&lt;/label&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="2"&gt;
&lt;input type="submit" name="login" id="login" value="Login" /&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;%} %&gt;
&lt;/asp:Content&gt;</pre>
</div>
<div><strong>Login ActionResult metodu</strong> içerindeki <strong>KullanıcıAdı </strong>ve <strong>Şifre</strong> kontrollerini veritabanına bağlanıp yapabiliriz. Ben burada işlemleri hızlı yapmak adına kullanıcı adı ve şifresiyi <strong>“test”</strong> olarak belirledim. <strong>İf blogunun </strong>içine bakmak gerekirse; burada <strong>Nitelik </strong>içerisinde belirtilen <strong>returnUrl </strong>isimli parametrenin <strong>Url </strong>üzerinde olup olmadığını kontrol ediyoruz. Daha sonra <strong>memberInfo </strong>sınıfını yaratıp, giriş yapan kullanıcının bilgilerini buradaki <strong>özelliklere</strong>(properties) atıyoruz. <strong>“Beni Hatırla”</strong> isimli <strong>chechBox</strong> işaretlenmişse çerezimizi yazıyor ve kullanıcıyı <strong>“returnUrl”</strong> parametresinde belirtilen adrese ya da anasayfaya yönlendiriyoruz.</div>
<div>Bunların dışında ben anasayfada kullanmak üzere ufak bir <strong>UserControl </strong>yazdım. Bu UserControl ile <strong>Login </strong>isimli <strong>View </strong>içerindeki kodlar birbiriyle oldukça benzer. Bu yüzden sadece UserControl içerisindeki kod bloglarını anlatacağım.</div>
<div>
<pre class="brush:csharp">&lt;%
MemberInfo memberInfo = Helper.GetMemberInfo();

if (memberInfo.IsAuthenticate)
{
%&gt;
&lt;span&gt;Hoş Geldiniz
&lt;%= Html.Encode(memberInfo.User) %&gt;&lt;/span&gt;
&lt;%
}
else
{
using (Html.BeginForm("login", "account", FormMethod.Post))
{
%&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;
Kullanıcı Adı
&lt;/td&gt;
&lt;td&gt;
&lt;input id="username" name="username" type="text" maxlength="20" size="20" /&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Şifre
&lt;/td&gt;
&lt;td&gt;
&lt;input id="password" name="password" type="password" maxlength="20" size="20" /&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="2"&gt;
&lt;input type="checkbox" id="rememberMe" name="rememberMe" /&gt;&lt;label for="rememberMe"&gt;Remember
  Me&lt;/label&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="2"&gt;
&lt;input type="submit" name="login" id="login" value="Login" /&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;%
}
}
%&gt;</pre>
</div>
<p>En üst satırda <strong>memberInfo </strong>sınıfımızı <strong>Helper </strong>metodu içerisindeki <strong>GetMemberInfo </strong>metodu ile <strong>set </strong>ediyorum</p>
<div>
<pre class="brush:csharp">public static class Helper
{
public static MemberInfo GetMemberInfo()
{
var memberInfo = new MemberInfo();

if (HttpContext.Current.Session["MemberInfo"] != null)
    memberInfo = (MemberInfo)HttpContext.Current.Session["MemberInfo"];
else
    CookieLogin(memberInfo);

return memberInfo;
}

public static void CookieLogin(MemberInfo memberInfo)
{
var myCookie = HttpContext.Current.Request.Cookies["myCookie"];
if (myCookie != null)
{
    int userExpration = Convert.ToDateTime(myCookie.Values["userExpiration"]).Year;
    int userIssueDate = Convert.ToDateTime(myCookie.Values["userIssueDate"]).Year;
    if (myCookie["userName"] != null &amp;&amp; !memberInfo.IsAuthenticate &amp;&amp; userExpration &gt;= userIssueDate)
    {
        memberInfo.User = myCookie["userName"];
        memberInfo.Ticket = new MemberTicket()
        {
            User = myCookie["userName"],
            Guid = new Guid(myCookie["userGuid"]),
            UserId = Convert.ToInt32(myCookie["userId"])
        };
        //Eğer belirtilen guid database'de bulunuyorsa isAuthenticate property'sini true yapalım
        memberInfo.IsAuthenticate = true;
    }
}
}
}</pre>
</div>
<div>Doğrulama işlemi başarılı gerçekleştirilmişse<strong> “Hoş Geldiniz”</strong> yazısını ve kullanıcı ismini gösteriyor, gerçekleştirilmemiş ise giriş yapma arabiriminiz gösteriyorum. Burada dikkat etmemiz gereken bir ikinci kısım ise buradaki belirtilen <strong>form</strong>’un yani <strong>BeginForm</strong> ile başlayan kısımın <strong>metot özelliğini “Post”</strong> olarak atıyoruz(Parametrelerden diğer ikisi ise <strong>ActionName</strong> ve <strong>Controller Name</strong>’i belirtiyor). Belirtilen bu metodun çalışması için <strong>Controller </strong>sınıfı içerindeki <strong>Login </strong>metodu üzerinide <strong>[AcceptVerbs(HttpVerbs.Post)] </strong>niteliğini tanımlıyoruz.</div>
<div>Şimdi geldi buraya kadar yaptıklarımızı denemeye. Hemen <strong>HomeController</strong> sınıfımıza giriyoruz ve <strong>About </strong>isimli <strong>metodumuzun </strong>üzerinde <strong>niteliğimizi </strong>yazıyoruz.</div>
<div>
<pre class="brush:csharp">[Authentication(Roles = Role.User)]
public ActionResult About()
{
  return View();
}</pre>
</div>
<div>Eğer istersek kullanıcı <strong>rollerinide</strong> belirtip <strong>role </strong>göre login işlemlerini gerçekleştirebiliriz.</div>
<div><img class="aligncenter" src="http://www.ceturk.com/images/attributemvcsamp2.png" alt="" width="500" height="342" /></div>
<div><img class="aligncenter" src="http://www.ceturk.com/images/attributemvcsamp3l.png" alt="" width="500" height="315" /></div>
<div>Geldik bir yazımızın sonuna daha&#8230; Farkı bir konuda, farklı bir yazıda görüşmek üzere esen kalın.</div>
<div>Örneği indirmek için <a href="http://www.ceturk.com/images/MvcCustomMembership.rar">tıklayın</a>.</div>
<p><strong>Mehmet Gökay Okutucu</strong><br />
<strong>Email : </strong><a href="mailto:gokayokutucu@gmail.com">gokayokutucu@gmail.com</a><br />
<strong>Blog : </strong><a href="http://gokayokutucu.blogspot.com">http://gokayokutucu.blogspot.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ceturk.com/asp-net-mvc-ile-kendi-dogrulama-niteligimizi-yazalim/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

