Tek dosyalı projeler (siteler) üretmek

18 Şubat Pazartesi ´08
Dikkat: Bu yazının yazılma tarihinin üzerinden en az 60 gün geçmiş. İçerisindeki bilgiler güncelliğini yitirmiş olabilir. Yorumları ve güncellemeleri göz önünde bulundurarak yazıyı takip ediniz.
Bazen yazdığınız/yazacağınız modül/sayfa/proje çok işlem ve bölüm içermeyebilir. Farklı içeriğe sahip kısa ama çok metin olabilir elinizde. Ya da modülünüzde işlemler kısadır. Ya da tamamen ilginçlik olsun diye tek dosyada birçok işi yaptırmak isteyebilirsiniz.

Mesela sadece bir dizini listeleyip, dosyalar üzerinde ufak işlemler yaptıran bir betik yazıyor olabilirsiniz. Ya da bir reklam kampanyası için reklam sayfasının yanında ufak bir bilgi (hakkında) sayfası ve iletişim formu olan bir site-cik yapıyor olabilirsiniz.

Ufak işlemler içeren sayfalara bir sürü dosya oluşturup dosya kalabalığı yaptırmaktansa tek dosyada toplayabilirsiniz. Bu dökümanda ufak bir örnekle tek dosyadan oluşan bir site/sayfa yapacağım.

Başlıyoruz

Önce basit html yapınızı modüler yapıdaki gibi hazırlayalım.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8">
    <title>Tek dosyadan oluşan sayfam</title>
  </head>
<body>
  <h1>Fatih'in sitesi</h1>
  <ul>
    <li><a href="index.php">Anasayfa</a></li>
    <li><a href="index.php?bolum=hakkimda">Hakkımda</a></li>
    <li><a href="index.php?bolum=projeler">Projeler</a></li>
    <li><a href="index.php?bolum=iletisim">İletişim</a></li>
  </ul>
  <hr>
  <div>
    içerik kısmı
  </div>
  <hr>
  Mehmet Fatih YILDIZ 2008
</body>
</html>
gördüğünüz gibi oldukça basit. Site başlığı, ufak bir menü iki HR arasında sayfa içeriği ve sayfa sonu notu. Sayfa içeriği kısmına modüler yapıdaki gibi içerğimizi basacağız.

Şimdi 4-5 tane sayfamız var bunların içeriklerini gömeceğiz dosyamızın içine. Aslında hepsi basit bir kontrol mekanizması ile hallolacak.
<?php

// bilgiler
$bolum = $_GET["bolum"];
$islem = $_GET["islem"];

// ekrana basilani tamponlayalim
ob_start();
// sayfa icerikleri
if( $bolum == 'hakkimda' ){
echo <<<HTML_SON

<h2>Hakkımda</h2>

Ben buyum şunları bunları yaparım falan feşmekan.<br>
<br>
Şurada okudum, burada okuyorum büyüyünce X olacağım<br>
<br>
siteyi şöyle yaptım böyle ettim.

HTML_SON;
}else if( $bolum == 'projeler' ){
echo <<<HTML_SON

<h2>Projelerim</h2>

PHP ile şu projelerin altyapısıyla uğraşıyorum.
Hede hödö

HTML_SON;
}else if( $bolum == 'iletisim' ){
echo <<<HTML_SON

<h2>İletişim</h2>

İletişim bilgilerim : [email protected]<br>
<br>

<form action="index.php?islem=iletisim" method="post">
  Ad : <input type="text" name="ad">
  <br>
  E-posta : <input type="text" name="ad">
  <br>
  Mesaj : <textarea name="ad"></textarea>
  <br>
  <input type="submit" value="Mesajı gönder">
</form>

HTML_SON;
}else{ // anasayfa
echo <<<HTML_SON

Siteme hoşgeldiniz

HTML_SON;
}
// tamponlanan icerigi alalim
$icerik = ob_get_contents();
// tamponu bosaltalim, ekrana basilmasin
ob_end_clean();

?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  "http://www.w3.org/TR/html4/loose.dtd">
...
Yukarıda gördüğünüz gibi sayfa içeriklerini kontrole göre ekrana bastık. Burada dikkatinizi 2 şey çekmiştir. ob_start, ob_get_contents ve ob_end_clean fonksiyonlarını ekrana basılan şeyleri $icerik değişkenine aktarabilmek için yaptım.

echo'daki
echo <<<HTML_SON
...
HTML_SON;
kullanımı ise "HTML_SON" kelimesini bitirme kelimesi olarak görerek içeride tırnakları istediğimiz gibi kullanma özgürlüğü sunduğu için yaptım. Yani HTML_SON'ların arasında özgürce istediğiniz her karakteri kullanabilirsiniz. Bu sayede html olarak hazırladığınız sayfa içeriklerini 1-1 kopyala yapıştırarak rahatça işinizi halledebilirsiniz.

Gelelim neden çıktıyı tamponladığıma, bu işlemi hiç echo, tamponlama kullanmadan şöyle de yapabilirdiniz :
if( $bolum == 'hakkimda' ){
$icerik = "<h2>Hakkımda</h2>

Ben buyum şunları bunları yaparım falan feşmekan.<br>
<br>
Şurada okudum, burada okuyorum büyüyünce X olacağım<br>
<br>
siteyi şöyle yaptım böyle ettim.";
}else if( $bolum == 'projeler' ){
$icerik = "<h2>Projelerim</h2>

PHP ile şu projelerin altyapısıyla uğraşıyorum.
Hede hödö";
}else if( $bolum == 'iletisim' ){
...
Ama bir sürü tırnak sorunu ile uğraşmanız gerekebilirdi.

Neyse içeriklerimizi get ile gelen bolum parametresine göre belirlediğimize göre htlm'imizde konumlandırabiliriz. Sayfanızdaki "içerik kısmı" yazan yere
...
  <hr>
  <div>
    <?=$icerik;?>
  </div>
  <hr>
...
$icerik değişkenini basıyoruz. Böylece tek sayfada içerik basabiliyoruz.

İşin bir de işlem kısmı var. Yani tek dosyada toplamaya çalıştığınız site/sayfa sadece içerikten oluşmak zorunda değil. Aynı zamanda php'ye bazı işler yaptırmanız gerekebilir. Hatta modül için bu tek dosya mantığını düşünürseniz işlem modüllerinde içerik değil sadece işlemler vardır. Aynı mantıkla bunu da yapabilirsiniz.

Örnekte gördüğünüz gibi iletişim bölümünde bir iletişim formu var. Bunu işleyen kısmı buraya gömmek için sayfa içeriklerini seçtirmeden önce işlemler için de bir kontrol bloüu koyuyoruz.
<?php

// bilgiler
$bolum = $_GET["bolum"];
$islem = $_GET["islem"];

// once islemler kontrol edilmeli
if( $islem == 'iletisim' ){

  // iletisim formunu eposta ile gonderen
  // veya veritabanina kaydeden kodu
  // buraya yerlesitiryorsunuz
  
  /* tabiki islemler bittikten sonra exit ile
  betigin calismasini durdurmaniz lazim.
  zaten bundan once işleminizin sonucunu
  ekrana basmis olmaniz lazim.
  "başarıyla gönderildi" veya gönderilemedi gibi */
  exit();

}

/*
Eğer birden fazla işleminiz varsa else if koyarak işlemlerinizi
tanımlayıp buraya ekleyebilirsiniz.

Fakat else koymayın. Çünkü işlem değişkeni olmak zorunda değil.
mesela sadece içerik gösteriliyorsa islem parametresi yoktur.
*/


...
...
işlemleri de sayfaya gömdükten sonra son sayfa şuna benzer olacak :
<?php

// bilgiler
$bolum = $_GET["bolum"];
$islem = $_GET["islem"];

// once islemler kontrol edilmeli
if( $islem == 'iletisim' ){

  // iletisim islemleri
 
  exit();

}

// ekrana basilani tamponlayalim
ob_start();
// sayfa icerikleri
if( $bolum == 'hakkimda' ){
echo <<<HTML_SON

<h2>Hakkımda</h2>

Ben buyum şunları bunları yaparım falan feşmekan.<br>
<br>
Şurada okudum, burada okuyorum büyüyünce X olacağım<br>
<br>
siteyi şöyle yaptım böyle ettim.

HTML_SON;
}else if( $bolum == 'projeler' ){
echo <<<HTML_SON

<h2>Projelerim</h2>

PHP ile şu projelerin altyapısıyla uğraşıyorum.
Hede hödö

HTML_SON;
}else if( $bolum == 'iletisim' ){
echo <<<HTML_SON

<h2>İletişim</h2>

İletişim bilgilerim : [email protected]<br>
<br>

<form action="index.php?islem=iletisim" method="post">
  Ad : <input type="text" name="ad">
  <br>
  E-posta : <input type="text" name="ad">
  <br>
  Mesaj : <textarea name="ad"></textarea>
  <br>
  <input type="submit" value="Mesajı gönder">
</form>

HTML_SON;
}else{ // anasayfa
echo <<<HTML_SON

Siteme hoşgeldiniz

HTML_SON;
}
// tamponlanan icerigi alalim
$icerik = ob_get_contents();
// tamponu bosaltalim, ekrana basilmasin
ob_end_clean();

?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8">
    <title>Tek dosyadan oluşan sayfam</title>
  </head>
<body>
  <h1>Fatih'in sitesi</h1>
  <ul>
    <li><a href="index.php">Anasayfa</a></li>
    <li><a href="index.php?bolum=hakkimda">Hakkımda</a></li>
    <li><a href="index.php?bolum=projeler">Projeler</a></li>
    <li><a href="index.php?bolum=iletisim">İletişim</a></li>
  </ul>
  <hr>
  <div>
    <?=$icerik;?>
  </div>
  <hr>
  Mehmet Fatih YILDIZ 2008
</body>
</html>

Modüler yapıya ne oldu?

Daha öncehttp://www.mfyz.com/?/dokuman/52/bir-sitenin-kod-d......il-olmali/ dökümanında bahsettiğim bir modüler yapı vardı. Her türlü projenizde bu mantığı kullanmanızı önermiştim. Bu dökümanın amacı ufak projeler için zaten. Farkındaysanız örnekte verdiğim kodlar müthiş kısa kodlar. Çok basit bir site bile yapsanız bu kodlar uzayıp gidecektir. Bir de şunu unutmayın : eğer kodlarınız (yani bölümler veya işlemlerdeki) genellikle 20-30 satırı geçen kodlar ise bu yöntem hata yakalamanızı, sorun yaşadığınızda çözme sürenizi, çalışabilirliğinizi ve kodun temizliğini kötüleştirecek/zorlaştıracaktır. Onun için çok paranoyak veya ihtiyaç duymadığnız sürece bu mantığı kullanmayın. Modüler yapıyla ilgili yazdığım döküman çok daha faydalı olacaktır.


Hazırlayan : Mehmet Fatih YILDIZ

Yorumlar

23 Şubat Cumartesi ´08 14:33
süpersin
Üye Resmi Mkrc
2 Mart Pazar ´08 00:08
guzel yontem ama bunun yerıne switch dongusu ve fonksiyonları kullanmamız daha iyi olmazmı?
2 Mart Pazar ´08 19:17
tabiki, hepsi de çalışan çözümler. alışkanlıkla ilgili şeyler sonuçta bunlar.
2 Mart Pazar ´08 22:00
Basit bir sitemi böyle yapmıştım (: vakt-i zamanında...

Döküman haline gelmesi güzel olmuş eline sağlık.
Üye Resmi Muhammed Han Çetin
16 Eylül Salı ´08 10:38
Mehmet bey yazılarınızı takip ediyorum.Çok yararlı içerikler sunuyorsunuz.Yalnız burda verdiğiniz bilgilerle ilgili bir sorum olacak.Bu yöntemi kullanmak sitenin hızlı çalışmasını sağlar mı ? Eğer sağlıyorsa daha önce yaptığım gibi bu yöntemi kullanmaya devam edicem.Yok herhangi bi yararı yoksa da kod karmaşasından başka bişey değil deyip eski usûl ayrı sayfalarla çalışmaya başlıcam.Şimdiden teşekkürler
18 Eylül Perşembe ´08 18:10
Bu çok ufak projeler için kullanılabilecek bir şey. Yoksa dediğiniz gibi tamamen kod kalabalığı oluşturacaktır.
Modüler ilerlemeye özen gösterin. İşleri yapan kısımları fonksiyon veya sınıflara dönüştürüp bunları HTML döken kısımlar için HTML dosyalarına php yazın.
Yani bir sistemin arkasındaki yapılan iş ile o sistemin arayüzünü ne kadar ayırabilirseniz o kadar iyi olacaktır.
15 Kasım Cumartesi ´08 17:07
Evet kodun yeniden kullanılabilir olması için size uğraştıracakda olsa modüler programlamayı tavsiye ediyorum.İşlevleri fonksiyonlara bölerek geliştirin.
Üye Resmi Ömer Çıtak
6 Temmuz Cuma ´12 07:57
herkes normalde swich case tavsiye eder ama ben inatla if kullanırdım. tek kullanan ben değilmişim demekki   :-D
Üye Resmi nuda nuda
25 Temmuz Perşembe ´13 09:11
anlatım  güzel   :-)
Üye Resmi havadan çekim
15 Nisan Çarşamba ´15 15:42
gerçekten yararlı oldu anlatımınız da çok sade ve anlaşılır teşekkürler
Üye Resmi Harun Alp
1 Eylül Salı ´15 09:12
Merhaba, ben html konusunda çok iyiyim öncelikle ve az da olsa C&#35; biliyorum. Ben en basit olarak html kodları ile birleştirerek bir sayfa yapmak istiyorum fakat taktir edersiniz ki henüz çaylak bile değilim php'de. Fakat öğrenme yeteneğim vardır ve kovalarım. Sizden ricam en basitinden ( echo komutu haric ) bir proje gibi bir fikir verirseniz veya yapılmış bir proje sunarsanız bana bende üzerinde çalışmalar yapsam ve daha iyi kavrasam. Yardımcı olursanız iyi olur. Teşekkürler bu arada sayfa çok faydalı, iyi çalışmalar.
Yeni Yorum *
İletişim Bilgileri
*
*
E-Posta adresiniz gösterilmeyecektir.
(unut)
Güvenlik Kodu *

Gönderiliyor