Üye GİRİŞİ

Son eklenen makale ve haberler

  Programlama » PHP

3 KATMANLI MİMARİ VE PHP

Ceviz.Net Pdf Çıktısı Al
 
Ceviz.Net Doc Çıktısı Al
 

Öncelikle makaleyi okumaya başlamadan önce dosyaları indirip dosyalardan takip etmenizi tavsiye ederim dosyaları indirmek için tıklayın. Bu makale yeni başlayanlar için değildir.

Bu mimariye göre projemiz 3 ayrı katmana bölünür.

Bunlar :

1. Sunum Katmanı (Presentation Layer)

Sunum katmanı, İş katmanı ve Veri katmanından gelen bilgilerin kullanıcılara gösterildiği kısımdır. Yani bir arayüz denebilir. HTML sayfalar bu katmana örnek verilebilir.

2. İş Katmanı (Business Layer)

İş katmanı, tüm işlemlerin yapıldığı kısımdır. Her türlü denetim burada yapılır. Sunum katmanından gelen istekleri hazırlayan ve veri katmanına gönderen kısımdır.

3. Veri Katmanı (Data Layer)

Veritabanı katmanı, projemizin veritabanı ile ilişkisini sağlar. kendisinden istenen verileri işler, hazırlar ve iş katmanına gönderir.

Nasıl Çalışır

 

Niye 3 katmanlı mimari ?

Mesela veritabanı olarak mysql kullanıyoruz ve bazı sebeplerden dolayı Mssql, PostgreSQL vb. başka bir veritabanı kullanacağız.  İşte bu noktada sadece Veri Katmanını değiştirmemiz yetecektir.

Bu örnek iş katmanı içinde geçerli ufak değişiklerle tüm sistem üzerinde büyük değişiklikler yapmamıza olanak sağlar ve güvenlik açısından önemlidir.

Peki 3 katmanlı mimari kullanmak çokmu zor?

Hayır hiçte zor değil. Fakat projeye başlarken biraz daha fazla kod yazmanıza sebep olur.

Bu öğrendiğimiz bilgileri bir proje üzerinde uygulayalım.

Projemizde veritabanı olarak mysql, sunum katmanı olarak ise Smarty kullanacağız. Smarty ile ilgili ayrıntılı bilgiyi http://smarty.php.net sayfasından alabilirsiniz.

ÖRNEK PROJE :

Örnek proje olarak bir haber portalı yapmaya başlayalım.

KULLANILACAK CLASS YAPISI

SMARTY KURULUMU

http://smarty.php.net/download.php adresinden Smarty'nin son versiyonunu indiriyoruz. Ben en son yayınlanan 2.6.18 versiyonunu indirdim. İndirdiğimiz zip dosyasının içindeki libs/ klasorunu ana dizinimize atıyoruz.

DİZİNLER

 

cache/ (chmod 777)
class/
libs/ <- smarty dosyaları bu dizinde olacak
sistem/
temp/page/ (chmod 777)
templates/
uploads/ (chmod 777)

 


VERİ KATMANI


jure.sql

 

-- --------------------------------------------------------

--
-- Tablo yapısı: `jure_news`
--

CREATE TABLE `jure_news` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `category` smallint(5) unsigned NOT NULL,
  `title` text NOT NULL,
  `info` text NOT NULL,
  `more` text NOT NULL,
  `picture` varchar(255) NOT NULL,
  `active` tinyint(1) unsigned NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin5 AUTO_INCREMENT=1;

--
-- Tablo döküm verisi `jure_news`
--

INSERT INTO `jure_news` VALUES (1, 1, 'Tiryakilere elektronik sigara!', 'Nikotin bağımlılığından kurtulmanın alternatif yolu elektronik sigara. Tirkayilere ger&ccedil;ek sigara i&ccedil;iyorlarmış hissi veren elektronik sigara T&uuml;rkiye&rsquo;de de satılıyor.', 'İSTANBUL - Sigara alışkanlığından vazge&ccedil;meye &ccedil;alışan ama bunu bir t&uuml;rl&uuml; başaramayanlar i&ccedil;in alternatif bir &ccedil;&ouml;z&uuml;m geliştirildi. Hong Kong&rsquo;taki bir firma elektronik sigara &uuml;retti.<br /><br />Hong Kong&rsquo;da bir firma sigarayı bırakmaya &ccedil;alışan tiryakilere, nikotin bandı ve sakızı dışında farklı bir alternatif sunuyor. Elektronik sigara... Elektronik sigara, tiryakilere ger&ccedil;ek sigara i&ccedil;iyorlarmış hissi veriyor. &Uuml;retici firma, pille &ccedil;alışan elektronik sigaranın alternatiflerinden &ccedil;ok daha etkili olacağı konusunda iddialı. 208 dolara satılan elektronik sigaranin piyasa s&uuml;r&uuml;ld&uuml;ğ&uuml; &uuml;lkeler arasında T&uuml;rkiye de bulunuyor. &Uuml;retici firmanın yetkilileri, son 12 ayda gelirlerini 2 katına &ccedil;ıkardıklarını s&ouml;yl&uuml;yor.', 'uploads/saglik/265971.jpg', 1);
INSERT INTO `jure_news` VALUES (2, 1, 'Aspirin, bağırsak kanserinden koruyor', 'İngiliz bilim adamları, uzun s&uuml;reli aspirin kullanımının bağırsak kanserini &ouml;nleyebildiğini tespit etti.', 'LONDRA - Oxford &uuml;niversitesi bilim adamları, sonu&ccedil;larını tıp dergisi The Lancet&rsquo;de yayımladıkları araştırmalarında, beş yıl s&uuml;reyle g&uuml;nde 300 miligramlık doz aspirin kullanımının, bu s&uuml;reyi takip eden 15 yılda bağırsak kanserine yakalanma ihtimalini y&uuml;zde 74 oranında azalttığını g&ouml;rd&uuml;. <br /><br />Mide rahatsızlıkları ve hatta mide kanamasına kadar varan yan etkilerinden dolayı uzun s&uuml;reli aspirin kullanımının ancak bağırsak kanserine yakalanma riski y&uuml;ksek olan kişilere tavsiye edilebileceğini belirten bilim adamları, araştırmalarını 7500 kişi &uuml;zerinde yaptı. <br /><br />1970&rsquo;li ve 80&rsquo;li yıllarda başlayan araştırmaya katılanlara, g&uuml;nl&uuml;k 300, 500, 1200 miligramlık doz olarak aspirin ve bir gruba placebo verildi. Araştırmaya katılanlara aspirin beş ve yedi yıl s&uuml;reyle kullandırıldı. Daha sonra katılımcıların sağlık durumu 20 yıl s&uuml;reyle izlendi.', 'uploads/saglik/265985.jpg', 1);
INSERT INTO `jure_news` VALUES (3, 1, 'Prostat kanseri yaşı düşüyor', 'Prostat kanseri, erkeklerde en sık g&ouml;r&uuml;len kanser t&uuml;rlerinden biri. Aynı zamanda sinsi bir hastalık olarak da değerlendirilen prostat kanseri vakalarında son yıllardaki artış dikkat &ccedil;ekiyor.', 'İSTANBUL - Artışın yanı sıra, şimdiye kadar 60&rsquo;lı yaşlardan sonrası i&ccedil;in risk olarak değerlendirilen bu kanser t&uuml;r&uuml;, son yıllarda daha erken yaşlar i&ccedil;in de bir risk haline geldi. <br /><br />&Uuml;roloji Uzmanı Opr. Doktor Mehmet Kırdar, prostat kanseri tanısında ve takibinde &ouml;nemli bir test olarak değerlendirilen PSA&rsquo;nın (Prostat Spesifik Antijen) kanser taramasında kullanımı arttık&ccedil;a tespit edilen vaka sayısında da artış olduğunu vurguluyor. Kırdar, bunun prostat kanserinin daha erken yaşlarda teşhisini ortaya &ccedil;ıkaran bir başka nokta olduğunu belirtiyor. <br /><br />2006 yılında d&uuml;nyada 680 bin erkeğe prostat kanseri tanısı konuldu ve yaklaşık 200 bin erkek hastalık nedeniyle &ouml;ld&uuml;. 0 yaş &uuml;st&uuml; erkeklerin y&uuml;zde 9&rsquo;unda prostat iltihabı bulunuyor ve seks&uuml;el ge&ccedil;işli hastalıklarda prostat kanseri riski artıyor. <br /><br />Antienflamatuar ajanlar, antioksidanlar, d&uuml;ş&uuml;k yağlı diyet meyve sebze ve lifli diyet likopen i&ccedil;eren domates gibi besinlerin t&uuml;ketiminin bu riski azalttığını belirten Kırdar, prostat kanserinin genellikle ge&ccedil; belirti verdiğine dikkat &ccedil;ekiyor.', 'uploads/saglik/264974.jpg', 1);
INSERT INTO `jure_news` VALUES (4, 1, 'Nikotin bandını doktor kontrolünde kullanın', 'ABD&rsquo;de yapılan araştırmada aşırı strese maruz kalanların beyin h&uuml;crelerinin &ouml;ld&uuml;ğ&uuml; belirlendi.', 'Stresin insan v&uuml;cudu &uuml;zerindeki etkilerini araştıran ABD&rsquo;li bilimadamları şiddetli stresin başta depresyon olmak &uuml;zere ciddi sağlık sorunlarını nasıl ortaya &ccedil;ıkardığını belirledi. Chicago&rsquo;daki Rosalind Franklin &Uuml;niversitesi bilimadamlarınca yapılan araştırmada şiddetli stresin beyin h&uuml;crelerinin &ouml;l&uuml;m&uuml;ne neden olduğu ortaya &ccedil;ıktı. <br /><br />Aşırı stres beynin hafıza, &ouml;ğrenme ve duygulardan sorumlu hipocampus b&ouml;l&uuml;m&uuml;nde &uuml;retilen yeni h&uuml;creleri &ouml;ld&uuml;r&uuml;yor, yeni h&uuml;crelerin yetersizliği de depresyonla sonu&ccedil;lanıyor. <br /><br />Bilimadamları fareler &uuml;zerinde yaptıkları deneylerde aşırı stresin hipocampus b&ouml;lgesinin yeni h&uuml;cre &uuml;retme yeteneğine zarar vermediğini, ancak &uuml;retilen yeni h&uuml;crelerin 24 saat sonra &ouml;lmeye başladığını belirledi. <br /><br />Elde edilen bu yeni bilginin depresyon tedavisinde yeni bir &ccedil;ığır a&ccedil;ması bekleniyor. Stresin yeni h&uuml;creleri derhal değil, &uuml;retildikten 24 saat sonra &ouml;ld&uuml;rmeye başladığına dikkat &ccedil;eken uzmanlar, bu s&uuml;re&ccedil;te kullanılabilecek bir ila&ccedil; geliştirilerse h&uuml;vrelerin &ouml;l&uuml;m&uuml;n&uuml;n engellenebileceğine dikkat &ccedil;ekiyor. <br /><br />Aşırı stresin insan v&uuml;c&uuml;dunda fiziksel bir etkisi olduğunu kanıtlayan ABD&rsquo;li bilimadamları, &ccedil;ok d&uuml;ş&uuml;k miktarlardaki stresinse insan beynini uyanık ve tetikte tutacağı i&ccedil;in faydalı olabileceğini belirtiyor.', 'uploads/saglik/263096.jpg', 1);
INSERT INTO `jure_news` VALUES (5, 1, 'Stresi yenmek için çay için', 'Psychopharmacology dergisinde yayımlanan araştırma &ccedil;er&ccedil;evesinde, 6 hafta boyunca g&uuml;nde 4 bardak &ccedil;ay i&ccedil;en erkeklerde, &ccedil;ay yerine başka bir i&ccedil;ecek t&uuml;ketenlere oranla stres hormonu kortizol seviyesinin daha d&uuml;ş&uuml;k olduğu tespit edildi.', 'İngiliz bilimadamlarının yaptığı araştırma bu kişilerin stres seviyelerinin y&uuml;kseltilmesi i&ccedil;in verilen g&ouml;revlerden sonra b&uuml;y&uuml;k bir rahatlama hissettiklerini g&ouml;sterdi. <br /><br />Araştırmanın yazarlarından, London College &Uuml;niversitesi&rsquo;nde Epidomoloji ve Kamu Sağlığı b&ouml;l&uuml;m&uuml;nde g&ouml;revli Andrew Steptoe, araştırmanın sonu&ccedil;larının &ouml;nemini vurgulayarak, akut stresin yavaş atlatılmasının koroner kalp hastalığı gibi kronik hastalıklarla bağdaştırılma riskinin y&uuml;ksek olduğuna dikkati &ccedil;ekti. <br /><br />Steptoe, &ccedil;ayın stres hormonunun normal seviyeye gerilemesine yardımcı olduğunu ifade etti.<br /><br />Araştırma kapsamında 75 erkeğin iki gruba ayrıldığı, bunlardan birine meyve aromalı siyah &ccedil;ay, diğerine ise &ccedil;ay tadan başka bir kafeinli i&ccedil;ecek verildiği belirtildi. Araştırmacılar, 6 haftanın sonunda katılımcılara, 5 dakikada sunum hazırlamak ve teslim etmek gibi stres seviyelerini y&uuml;kseltmeyi ama&ccedil;layan testler verildiğini, bu testler sırasında her iki gruptaki kişilerin stres sevileri, tansiyon ve kalp atışlarının benzer &ccedil;ıktığını kaydettiler. Ancak verilen g&ouml;revlerin sona ermesinden 50 dakika sonra &ccedil;ay i&ccedil;enlerde kortizol seviyesinin ortalama y&uuml;zde 47 oranında d&uuml;şt&uuml;ğ&uuml;, bunun diğer grupta y&uuml;zde 27&rsquo;de kaldığı saptandı. <br /><br />Steptoe, &ccedil;ayın i&ccedil;indeki hangi maddelerin buna yol a&ccedil;tığının ise hen&uuml;z bilinmediğini s&ouml;yledi.', 'uploads/saglik/248204.jpg', 1);
INSERT INTO `jure_news` VALUES (6, 1, 'Sigaradan kurtulma rehberi', 'Sağlık Bakanlığı Temel Sağlık Hizmetleri Genel M&uuml;d&uuml;rl&uuml;ğ&uuml;, sigara i&ccedil;enleri bırakmaya teşvik etmek ve bilgilendirmek amacıyla bir &ldquo;rehber&rdquo; hazırladı.', '<p class="textBodyBlack">Rehberde, sigarayı bırakmanın ilk etkileri ş&ouml;yle sıralandı: <br />&ldquo;Bıraktığınız ilk g&uuml;nden itibaren, artık karbonmonoksitli hava solumadığınız i&ccedil;in eritrositleriniz dokularınıza oksijeni yeniden ve tam kapasite ile taşıyabilecek. 6 binden fazla zehirli maddeyi g&uuml;n boyunca solumayacaksınız. Dolayısıyla iştah bozuklukları, solukluk, &ccedil;abuk yorulma başta olmak &uuml;zere bir &ccedil;ok sağlık sorununuz bir anda d&uuml;zelecek, y&uuml;z&uuml;n&uuml;zdeki &ccedil;izgiler hafifleyecek, g&ouml;zaltınızdaki torbalanmalar inecek, sesinizdeki kalınlaşma ve bozulma d&uuml;zelecek, nefesiniz k&uuml;ll&uuml;k gibi değil, normal insan gibi kokacak.&rdquo;<br /><br />Sigarayı alışkanlığından vaz ge&ccedil;mede sabır ve bırakmanın getireceği zorlukların nasıl aşılacağı konusunda bilin&ccedil;li olmanın yeterli olduğu ifade edilen rehberde, sigara i&ccedil;me isteğinin &ouml;nce zayıflayacağı, sonra da s&ouml;neceği vurgulandı. <br /><br />Rehberde, sigarayı bırakan kişinin bazen &ccedil;ok sinirli, mutsuz ya da keyifli olabileceği, bu durumlarda sigara i&ccedil;me isteğinin artacağı belirtilerek, bu isteğin 3-5 dakika s&uuml;receği ve zamanla yok olacağı anlatıldı. <br /><br /><font face="Verdana" size="2"><strong>BİR SAĞLIK KURULUŞUNDAN YARDIM ALINABİLİR</strong></font><br />Rehberde, sigarayı bırakmak isteyen kişinin daha y&uuml;ksek başarı elde etmek i&ccedil;in sağlık kuruluşlarından yardım alabileceği belirtildi.<br /><br />Rehberde, sigarayı bırakanlara, kilo almamak i&ccedil;in beslenmeye &ouml;zen g&ouml;stermeleri &ouml;nerildi. Kilo almamak i&ccedil;in spor yapılabileceği vurgulanan rehberde, sporun, sigaranın bırakıldığı ilk g&uuml;nlerde ortaya &ccedil;ıkabilecek sıkıntının aşılmasına da yardımcı olacağı hatırlatıldı.<br /><br />Daha &ouml;nce bırakmayı deneyip başaramayanlara tavsiyelerin yer aldığı rehberde, bu kişilere yeniden denemeleri &ouml;nerisinde bulunuldu. Sigarayı bırakmanın ilk deneme de başarısız olmasının &ldquo;&ccedil;ok doğal olduğu&rdquo; belirtilen rehberde, bu konuda kararlı olunması gerektiği hatırlatıldı. <br /><br /><font face="Verdana" size="2"><strong>&ldquo;HAZIRLIK D&Ouml;NEMİ&rdquo; İ&Ccedil;İN TAVSİYELER</strong></font><br />Rehberde, ilk işin bırakma g&uuml;n&uuml;ne karar verilmesi olacağı belirtildi. Hazırlık i&ccedil;in bir haftanın yeterli olacağı vurgulanan rehberde, bırakma zamanı olarak doğum g&uuml;n&uuml;, evlilik yıl d&ouml;n&uuml;m&uuml; gibi &ouml;zel g&uuml;nlerin belirlenmesi ve bunun yakın &ccedil;evreye ilan edilmesi &ouml;nerildi. Rehberde aile ve yakın &ccedil;evrenin psikolojik ve sosyal olarak destek olmasının bırakma eyleminin s&uuml;rmesinde etkili olacağı belirtildi.<br /><br />Sigarayı bırakmaya karar veren kişinin kendisini &ouml;d&uuml;llendirmesi de &ouml;nerilen rehberde, bunun sigara i&ccedil;ilmeden tamamlanan ilk g&uuml;n&uuml;n, ilk haftanın, ilk ayın sonunda tekrar edilmesinin yararlı olacağı ifade edildi. <br /><br />Rehberde, sigarayı bırakmak isteyenlerin, bu kararın nedenlerini &ouml;nem sırasına g&ouml;re bir kağıda yazmaları ve bunu yanlarında taşımaları istenerek, zaman zaman okumalarının yararlı olacağı vurgulandı.<br /><br />Evdeki sigara, &ccedil;akmak, k&uuml;ll&uuml;k gibi nesnelerin atılması ya da g&ouml;zden uzaklaştırılması da tavsiye edilen rehberde, bu nesnelerin k&ouml;kleşmiş sigara i&ccedil;me isteği s&ouml;n&uuml;nceye kadar sigarayı bırakan kişi i&ccedil;in tehlikeli olduğu kaydedildi. <br /><br /><font face="Verdana" size="2"><strong>PSİKOLOJİK OLARAK HAZIRLANMA</strong></font><br />Rehberde, sigara i&ccedil;me isteğinin bir&ccedil;ok uyaranın etkisiyle ortaya &ccedil;ıktığı vurgulandı. Bu nedenle sigarayı bırakmak isteyenlerin birka&ccedil; g&uuml;n sigara i&ccedil;me davranışlarını takip etmeleri gerektiğine işaret edilen rehberde, bu işlemi, d&uuml;zenleyecekleri bir &ccedil;izelge yardımıyla daha kolay yapabilecekleri ifade edildi. <br /><br />Rehberde, sigarayı bıraktıktan sonra, i&ccedil;me isteği hissedildiği de hatırlatılarak, şu tavsiyelerde bulunuldu. <br /><img height="7" alt="*" hspace="1" src="http://www.ntvmsnbc.com/Site_Elements/dotBlack.gif" width="7" vspace="1" border="0" /> 3-5 dakika s&uuml;ren i&ccedil;me isteği dalgaları geldiğinde yanınızda taşıdığınız, &uuml;zerine bırakma nedenlerinizi kaydettiğiniz kağıdı &ccedil;ıkartıp, zihninizi bırakma nedenlerinize yoğunlaştırın. Bulunduğunuz yer ve durumu değiştirin. Dikkatinizi başka şeylere y&ouml;neltmeye &ccedil;alışın, yerinizden kalkıp gezinin, meyve suyu ya da su i&ccedil;in, bir arkadaşınızla birka&ccedil; dakika sohbet edin. <br /><img height="7" alt="*" hspace="1" src="http://www.ntvmsnbc.com/Site_Elements/dotBlack.gif" width="7" vspace="1" border="0" /> Ellerinizi ve zihninizi meşgul edecek yeni uğraşlan bulun. Kolay ulaşılabilir bir yerde meyve ve sebze bulundurun. Sigara i&ccedil;me isteği duyduğunuzda ağzınızı bunlarla meşgul edin. B&ouml;ylelikle hem vitamin ihtiyacınızı karşılamış, hem de kilo almayı engellemiş olursunuz. <br /><img height="7" alt="*" hspace="1" src="http://www.ntvmsnbc.com/Site_Elements/dotBlack.gif" width="7" vspace="1" border="0" /> Sigara i&ccedil;me isteği uyandıracak arkadaş &ccedil;evresi ve ortamlarından bir s&uuml;re uzak kalmanız bırakma başarısını s&uuml;rd&uuml;rmenizde etkili olacaktır. D&uuml;zenli spora başlayın. Kaldırabileceğinizden fazla sorumluluk y&uuml;klenmekten ka&ccedil;ının. G&uuml;nl&uuml;k işlerinizi yaparken zamanınızı iyi kullanmaya &ccedil;alışın. İşlerinizi son g&uuml;ne bırakmayın. Sizi strese sokabilecek kişilerden uzak durun ve her olayda mutlu olacak pozitif bir y&ouml;n arayın.<br /><img height="7" alt="*" hspace="1" src="http://www.ntvmsnbc.com/Site_Elements/dotBlack.gif" width="7" vspace="1" border="0" /> Kendinizi keşfedin, zayıf ve g&uuml;&ccedil;l&uuml; y&ouml;nlerinizi g&ouml;zden ge&ccedil;irin, g&uuml;&ccedil;l&uuml; olan yanlarınızı &ouml;ne &ccedil;ıkarın ve bunlarla &ouml;v&uuml;n&uuml;n. Bıraktıktan sonra ge&ccedil;en s&uuml;re ne olursa olsun bir tek sigara bile i&ccedil;meyi denemeyin.<br /><br /><font face="Verdana" size="2"><strong>BIRAKMANIN YARARLARI</strong></font><br />Sigaraya bırakan kişinin kalp, akciğer, solunum yolları hastalıkları ve kanserler gibi hastalık risklerinin bir anda azalacağına dikkat &ccedil;ekilen rehberde, bunun kişinin yaşam s&uuml;resi ve kalitesini kendisinin belirlemesi anlamına geleceği ifade edildi.<br /><br />Sigara i&ccedil;meyi 35 yaşından &ouml;nce bırakanlarda erken &ouml;l&uuml;m riskinin hemen hemen yok olacağının altı &ccedil;izilen rehberde, sigarayı bıraktıktan sonra v&uuml;cutta meydana gelecek değişiklikler de ş&ouml;yle sıralandı:<br /><img height="7" alt="*" hspace="1" src="http://www.ntvmsnbc.com/Site_Elements/dotBlack.gif" width="7" vspace="1" border="0" /> 20 dakika sonra kan basıncı ve nabız normale d&ouml;ner, el ve ayaklarda kan dolaşımı d&uuml;zelir. 8 saat sonra, kanda oksijen d&uuml;zeyi normale d&ouml;ner, kalp krizi ge&ccedil;irme riski azalır.<br /><img height="7" alt="*" hspace="1" src="http://www.ntvmsnbc.com/Site_Elements/dotBlack.gif" width="7" vspace="1" border="0" /> 24 saat sonra, v&uuml;cut karbonmonoksitten arınır. 48 saat sonra, kanda nikotin d&uuml;zeyi azalır, tat ve koku duyusu artar, peptik &uuml;lserli hastaların tedaviye verdiği cevap artar. <br /><img height="7" alt="*" hspace="1" src="http://www.ntvmsnbc.com/Site_Elements/dotBlack.gif" width="7" vspace="1" border="0" /> 72 saat sonra, solunum yollarının gevşemesi sonucu nefes alıp verme rahatlar, solunum yolları fonksiyon g&ouml;rmeye başladığı i&ccedil;in sekresyon miktarı artar.<br /><img height="7" alt="*" hspace="1" src="http://www.ntvmsnbc.com/Site_Elements/dotBlack.gif" width="7" vspace="1" border="0" /> 2-12 hafta sonra, v&uuml;cuttaki t&uuml;m dolaşım d&uuml;zelir, solunum yolu enfeksiyonlarına yakalanma riski azalır, y&uuml;r&uuml;rken yorulma ve tıkanma daha az g&ouml;r&uuml;l&uuml;r. <br /><img height="7" alt="*" hspace="1" src="http://www.ntvmsnbc.com/Site_Elements/dotBlack.gif" width="7" vspace="1" border="0" /> 3-9 ay sonra &ouml;ks&uuml;r&uuml;k, kısa aralıklarla nefes alıp verme ve hırıltılı ya da ıslık sesli soluk alıp verme gibi solunum yolu problemleri d&uuml;zelir. Akciğer fonksiyonları y&uuml;zde 5-10 artar. <br /><img height="7" alt="*" hspace="1" src="http://www.ntvmsnbc.com/Site_Elements/dotBlack.gif" width="7" vspace="1" border="0" /> Bir yıl sonra, koroner kalp hastalığı riski yarı yarıya azalır. 12-36 ay sonra mesane kanseri riski y&uuml;zde 50 azalır. <br /><img height="7" alt="*" hspace="1" src="http://www.ntvmsnbc.com/Site_Elements/dotBlack.gif" width="7" vspace="1" border="0" /> 5 yıl sonra, kalp krizi ge&ccedil;irme riski ile yemek borusu ve ağız boşluğu kanseri riski y&uuml;zde 50 azalır. <br /><img height="7" alt="*" hspace="1" src="http://www.ntvmsnbc.com/Site_Elements/dotBlack.gif" width="7" vspace="1" border="0" /> 10-15 yıl sonra, kalp krizi ge&ccedil;irme riski i&ccedil;meyenlerle aynı seviyeye iner, akciğer kanseri riski i&ccedil;enlere oranla y&uuml;zde 50 azalır.<br /><br />Rehberde, bu alışkanlığından vazge&ccedil;mek istemeyenlerin de &ldquo;sigara i&ccedil;meyen kişilerin temiz hava soluma haklarına saygı g&ouml;stermeleri, &ccedil;ocukların &ouml;n&uuml;nde sigara i&ccedil;memeleri ve gen&ccedil;lere ve &ccedil;ocuklara olumsuz model oluşturmamaları&rdquo; istendi.<br /></p>', 'uploads/saglik/19924.jpg', 1);
INSERT INTO `jure_news` VALUES (7, 1, 'Ağır tiryakiliğin nedeni de genler', 'Osaka &Uuml;niversitesi&rsquo;nde g&ouml;revli bilim adamlarının, sabah yataktan kalkar kalkmaz sigara yakan tiryakiler arasında yaptığı araştırma, bu kişilerde nikotini par&ccedil;alayan enzimin &uuml;retimden sorumlu genin daha aktif olduğunu g&ouml;sterdi.', 'Nihon Keizai Shimbun&rsquo;da yayımlanan araştırmada, CYP2A6 geninin, 300 tiryaki ve ge&ccedil;mişte sigara i&ccedil;enlerde incelenmesi sonucunda genin &ccedil;ok aktif bi&ccedil;imine sahip olanların y&uuml;zde 70&rsquo;inin &ccedil;ok ağır tiryakiler olduğu tespit edildi. <br /><br />Araştırmanın, sigara i&ccedil;enlerin bu alışkanlıktan kurtulmasında daha etkili y&ouml;ntemlerin bulunmasına yardımcı olmasının beklendiği kaydedildi.', 'uploads/saglik/254596.jpg', 1);

-- --------------------------------------------------------

--
-- Tablo yapısı: `jure_news_category`
--

CREATE TABLE `jure_news_category` (
  `id` smallint(5) unsigned NOT NULL auto_increment,
  `parent` smallint(5) unsigned NOT NULL,
  `title` varchar(255) NOT NULL,
  `active` tinyint(1) unsigned NOT NULL,
  `posi` smallint(5) unsigned NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin5 AUTO_INCREMENT=1;

--
-- Tablo döküm verisi `jure_news_category`
--

INSERT INTO `jure_news_category` VALUES (1, 0, 'Sağlık', 1, 1);
INSERT INTO `jure_news_category` VALUES (2, 0, 'Ekonomi', 1, 2); 

 


class/database.class.php

 

<?php

class 
Result
{
    var 
$_result
;

    
/**
     *
     * @param $result
     * @return Result
     */
    
function Result($result
)
    {
        
$this->_result $result
;
    }

    
/**
     * Veritabanından gelen veriyi object olarak döndürür...
     *
     * @return object
     */
    
function FetchRow
()
    {
        return @
mysql_fetch_object($this->_result
);
    }
    
    
/**
     * Veritabanından gelen veri sayısını döndürür...
     *
     * @return int
     */
    
function NumRows
()
    {
        return @
mysql_num_rows($this->_result
);
    }

    
/**
     * İstenilen alanın sonucunu verir
     *
     * @param string $field
     * @return string
     */
    
function ReturnQuery($field
)
    {
        
$row $this->FetchRow
();
        return 
$row->$field
;
    }
    
    
/**
     * Veritabanında veri olup olmadığını kontrol eder...
     *
     * @return bool
     */
    
function BoolQuery
()
    {
        if(
$this->NumRows
())
            return 
true

        else
            return 
false
;             
    }
    
    
/**
     * Veritabanından gelen tek veriyi object olarak döndürür... 
     * Bu fonksiyon fetchrow ile aynıdır fakat ileride projemiz genişlediğinde bunun yararını göreceğiz.
     * @return object
     */
    
function SingleRow
()
    {
        
$row $this->FetchRow
();
        return 
$row
;        
    }
    
    
/**
     * Veritabanından gelen cogul veriyi dizi olarak döndürür...
     *
     * @return object
     */
    
function MultipleRow
()
    {
        
$array 
= array();
        while(
$row $this->FetchRow
())
        {
            
array_push($array,$row
);
        }
        return 
$array
;        
    }    

    
/**
     * Kullanılan veriyi siler...
     *
     * @return null
     */
    
function FreeResult
()
    {
        
$r = @mysql_free_result($this->_result
);
        unset(
$this
);
        return 
$r
;
    }
}

class 
Datalayer
{
    var 
$prefix
;
    var 
$lang
;
     var 
$debug

    var 
$host

    var 
$user

    var 
$password

    var 
$database

    var 
$conn
;      
    
/**
     * Constructor. Veritabanı bağlantısı yapılır.
     *
     * @return Datalayer
     */
    
function Datalayer
()
    {

        
$this->prefix     "jure"
;
        
$this->debug    true
;
        
$this->host        "localhost"
;
        
$this->user        "root"
;
        
$this->database    "database"
;
        
$this->password    "password"
;
        
        
$this->Connect
();
        
$this->selectDatabase($this->database
);
        
$this->setCharset
();
         
    }
    
    
/**
     * Veritabanı bağlantısı...
     *
     */
    
function Connect
() 
    { 
        if(
$this->host && $this->user && $this->database

            
$this->conn mysql_connect($this->host,$this->user,$this->password) or $this->error("Could not connect to server","Connect to $this->host $this->user:$this->password"
);          
    } 
    
    
/**
     * Mysql Charseti...
     *
     */
    
function setCharset
()
    {
        
mysql_query("SET NAMES 'latin5'"
);
        
mysql_query("SET CHARACTER SET latin5"
);
        
mysql_query("SET COLLATION_CONNECTION = 'latin5_turkish_ci'"
);        
    }
    
    
/**
     * Veritabanı seç...
     *
     * @param string $database
     */
    
function selectDatabase($database

    { 
        
$this->database $database

        
mysql_select_db($database$this->conn) or $this->MysqlError(mysql_error(), "no database"
); 
    } 
     
    
/**
     * sql sorgusunu veritabanına gönderir.
     *
     * @param string $sql
     * @return object
     */
    
function LiteQuery($sql
)
    {
        
$result mysql_query($sql$this->conn) or $this->MysqlError(mysql_error(), $sql
);
        return new 
Result($result
);
    }

    
/**
     * sql sorgusunu veritabanına gönderir...
     *
     * @param array $fields
     * @param array $tables
     * @param array $where
     * @param array $order
     * @param array $group
     * @param string $limit
     * @return object
     */
    
function Query($fields$tables$where = array(), $order = array(), $group=array(),$limit ""
)
    { 

        foreach (
$tables as $tbl
)
        {
            
$tablos[] = $this->prefix."_".$tbl
;
        }
        
        
$fields implode(",",$fields
); 
        
$tables implode(","$tablos
); 
        
$where     implode(" AND "$where
); 
        
$order     implode(",",$order
); 
        
$group     implode(",",$group
); 
     
        
$sql "SELECT $fields FROM $tables"
;
        
        if(!empty(
$where)) $sql .= ' WHERE '.$where

        if(!empty(
$order)) $sql .= ' ORDER BY '.$order

        if(!empty(
$group)) $sql .= ' GROUP BY '.$group

        if(!empty(
$limit)) $sql .= ' LIMIT '.$limit

     
        
$result mysql_query($sql$this->conn) or $this->MysqlError(mysql_error(), $sql
); 
     
        return new 
Result($result
);
    } 
     
    
/**
     * Veritabanı hatasını ekrana yazdırır
     *
     * @param string $error
     * @param string $query
     */
    
function MysqlError($error$query
)
    {
        if(
$this->debug

        { 
            echo 
"SQL: $query<br />Error: $error"

        } 
    }

    
/**
     * Veritabanına eklenen satırın id sini verir.
     *
     * @return int
     */
    
function InsertId
()
    {
        return 
mysql_insert_id
();
    }
    
    
/**
     * Veritabanı bağlantısı kapat
     *
     */
    
function Close
()
    {
        
mysql_close($this->conn
); 
    }




}
?>

 

 

@mysql_connect("localhost","user","password")
@mysql_select_db("database")

kısımlara kendi veritabanı bilgilerimizi yazıyoruz.

 

Böylece veri katmanımız tamamlanmış oldu.

Smarty çalışması için bazı ayarların yapılması gerekli. Bunu smarty dosyalarının içindede yapabilirsiniz veya yeni bir class türeterek türeterek yapabilirsiniz. Biz yeni bir class türeterek gerçekleştireceğiz.

SUNUM KATMANI

class/page.class.php

 

<?php
Class Page extends 
Smarty
{
    var 
$page
;
    var 
$tpl
;
        
    
/**
     * Constructor...
     *
     * @return Page
     */
    
function Page
() 
    {
        
$_REQUEST['page'] = (isset($_REQUEST['page'])) ? $_REQUEST["page"] : "index"
;
        
        
$this-compile_dir     'temp/page';                     
// compile edilecek temaların kopyalanacağı dizin 
        
$this->template_dir 'templates';                     
// tema dosyalarının bulunacağı dizin
        
$this->page $this->ClearPage($_REQUEST['page']);    
// sayfadaki zararlı karakterleri temizleyelim
        
$this->ClearGlobals();                                
// globallerden gelen zararlı değişkenleri temizleyelim
        
$this->tpl $this->IncludeTemplate();                
// sitemizin kullanacağı ana temayı belirleyelim
    
}

    
/**
     * Sayfaya göre ana temayı yükler...
     *
     * @return string
     */
    
function IncludeTemplate
()
    {

        switch (
$this->page

        {
            case 
"index" :
                
$template $this->AddTemplate("main"
);            
            break;
            
             
            default : 
                   
$template $this->AddTemplate("main"
);    
        }
        
        
        return 
$template
;
    }
    
    
/**
     * Ana tema yolu...
     *
     * @param string $param
     * @return string
     */
    
function AddTemplate($param
)
    {
        
$thetpl "main/" $param ".tpl"
;
        return 
$thetpl
;
    }
    
    
/**
     * ":", "/", "..", ".", ";", "\\", "http", "ftp" karakterlerini temizler...
     *
     * @param string $page
     * @return string
     */
    
function ClearPage($page
)
    {
        
$page         = (!isset($page)) ? "index" $page
;
        
$page         str_replace(array(":""/""..""."";""\\""http""ftp"), ""$page
);    
        
        return 
$page
;    
    }
    
    
/**
     * Gelen dizideki ' karakterlerini /' olarak değiştir...
     *
     * @param array $array
     * @return array
     */
    
function Escape($array

    {
        
reset($array
);
        while (list(
$key$val) = each($array
)) {
            if (
is_string($val
)) {
                
$array[$key] = addslashes($val
);
            } else {
                if (
is_array($val
)) {
                    
$array[$key] = $this->Escape($val
);
                }
            }
        }
        return 
$array
;
    }
        
    
/**
     * Global'den gelen değerler escape fonksiyonuna gönderilir...
     *
     */
    
function ClearGlobals
()
    {
        if (!
get_magic_quotes_gpc
()) 
        {
            @
$_REQUEST  $this->Escape($_REQUEST
);
            @
$_POST     $this->Escape($_POST
);
            @
$_GET      $this->Escape($_GET
);
            @
$_COOKIE   $this->Escape($_COOKIE
);
            @
$_SESSION  $this->Escape($_SESSION
);
            @
$_SERVER   $this->Escape($_SERVER
);
        }

    }
}
?>

 


Sunum katmanıda tamamlanmış oldu. . 

İŞ KATMANI

class/functions.php

 

<?php
function int($param
)
{
    return 
intval($param
);
}

/**
 * Dosyanın olup olmadığını kontrol eder...
 *
 * @param string $path
 * @return bool
 */
function isfile($path
)
{
    if (!
is_file($path)) return false; else    return true
;
}

/**
 * HTML taglarınız geçersiz hale getirir...
 *
 * @param string $string
 * @return string
 */
function clearhtml($string
)
{
    return 
htmlspecialchars($string
);
}

/**
 * yönlendirme yapar...
 *
 * @param string $page
 */
function location($page
)
{
    
header("Location: $page"
);
    exit();
}
?>

 


class/thumb.class.php

 

<?php
/**
 * 
 * @author         Ian Selby (ian@gen-x-design.com)
 * @copyright     Copyright 2006
 * @version     1.1 (PHP4)
 * 
 */
class 
Thumbnail 
{

    var 
$errmsg
;
    var 
$error
;
    var 
$format
;
    var 
$fileName
;
    var 
$imageMeta
;
    var 
$currentDimensions
;
    var 
$newDimensions
;
    var 
$newImage
;
    var 
$oldImage
;
    var 
$workingImage
;
    var 
$percent
;
    var 
$maxWidth
;
    var 
$maxHeight
;
    
    function 
Thumbnail($fileName

    {
        if(!
function_exists("gd_info"
)) 
        {
            echo 
'You do not have the GD Library installed.  This class requires the GD library to function properly.' "\n"
;
            echo 
'visit http://us2.php.net/manual/en/ref.image.php for more information'
;
            exit;
        }
        
//initialize variables
        
$this->errmsg               ''
;
        
$this->error                false
;
        
$this->currentDimensions    
= array();
        
$this->newDimensions        
= array();
        
$this->fileName             $fileName
;
        
$this->imageMeta            
= array();
        
$this->percent              100
;
        
$this->maxWidth             0
;
        
$this->maxHeight            0
;
        
$this->watermarkImg         ''
;
        
//check to see if file exists
        
if(!file_exists($this->fileName
)) 
        {
            
$this->errmsg 'File not found'
;
            
$this->error true
;
        } elseif(!
is_readable($this->fileName
)) {
            
$this->errmsg 'File is not readable'
;
            
$this->error true
;
        }

        
//if there are no errors, determine the file format
        
if($this->error == false

        {
            
//check if gif
            
if(stristr(strtolower($this->fileName),'.gif')) $this->format 'GIF'
;
            
//check if jpg
            
elseif(stristr(strtolower($this->fileName),'.jpg') || stristr(strtolower($this->fileName),'.jpeg')) $this->format 'JPG'
;
            
//check if png
            
elseif(stristr(strtolower($this->fileName),'.png')) $this->format 'PNG'
;
            
//unknown file format
            
else {
                
$this->errmsg 'Unknown file format'
;
                
$this->error true
;
            }
        }

        
//initialize resources if no errors
        
if($this->error == false

        {
            switch(
$this->format

            {
                case 
'GIF'
:
                    
$this->oldImage ImageCreateFromGif($this->fileName
);
                    break;
                case 
'JPG'
:
                    
$this->oldImage ImageCreateFromJpeg($this->fileName
);
                    break;
                case 
'PNG'
:
                    
$this->oldImage ImageCreateFromPng($this->fileName
);
                    break;
            }

            
$size GetImageSize($this->fileName
);
            
$this->currentDimensions = array('width'=>$size[0],'height'=>$size[1
]);
            
$this->newImage $this->oldImage
;
            
$this->gatherImageMeta
();
        }

        if(
$this->error == true

        {
            
//$this->showErrorImage();
            
break;
        }
    }
    function 
destruct
() 
    {
        if(
is_resource($this->newImage)) @ImageDestroy($this->newImage
);
        if(
is_resource($this->oldImage)) @ImageDestroy($this->oldImage
);
        if(
is_resource($this->workingImage)) @ImageDestroy($this->workingImage
);
    }
    function 
getCurrentWidth
() 
    {
        return 
$this->currentDimensions['width'
];
    }
    function 
getCurrentHeight
() 
    {
        return 
$this->currentDimensions['height'
];
    }
    function 
calcWidth($width,$height

    {
        
$newWp = (100 $this->maxWidth) / $width
;
        
$newHeight = ($height $newWp) / 100
;
        return array(
'newWidth'=>intval($this->maxWidth),'newHeight'=>intval($newHeight
));
    }
    function 
calcHeight($width,$height

    {
        
$newHp = (100 $this->maxHeight) / $height
;
        
$newWidth = ($width $newHp) / 100
;
        return array(
'newWidth'=>intval($newWidth),'newHeight'=>intval($this->maxHeight
));
    }
    function 
calcPercent($width,$height

    {
        
$newWidth = ($width $this->percent) / 100
;
        
$newHeight = ($height $this->percent) / 100
;
        return array(
'newWidth'=>intval($newWidth),'newHeight'=>intval($newHeight
));
    }
    function 
calcImageSize($width,$height

    {
        
$newSize = array('newWidth'=>$width,'newHeight'=>$height
);

        if(
$this->maxWidth 0

        {

            
$newSize $this->calcWidth($width,$height
);

            if(
$this->maxHeight && $newSize['newHeight'] > $this->maxHeight

            {
                
$newSize $this->calcHeight($newSize['newWidth'],$newSize['newHeight'
]);
            }

            
//$this->newDimensions = $newSize;
        
}

        if(
$this->maxHeight 0

        {
            
$newSize $this->calcHeight($width,$height
);

            if(
$this->maxWidth && $newSize['newWidth'] > $this->maxWidth

            {
                
$newSize $this->calcWidth($newSize['newWidth'],$newSize['newHeight'
]);
            }

            
//$this->newDimensions = $newSize;
        
}

        
$this->newDimensions $newSize
;
    }
    function 
calcImageSizePercent($width,$height

    {
        if(
$this->percent 0

        {
            
$this->newDimensions $this->calcPercent($width,$height
);
        }
    }
    function 
showErrorImage
() 
    {
        
header('Content-type: image/png'
);
        
$errImg ImageCreate(220,25
);
        
$bgColor imagecolorallocate($errImg,0,0,0
);
        
$fgColor1 imagecolorallocate($errImg,255,255,255
);
        
$fgColor2 imagecolorallocate($errImg,255,0,0
);
        
imagestring($errImg,3,6,6,'Error:',$fgColor2
);
        
imagestring($errImg,3,55,6,$this->errmsg,$fgColor1
);
        
imagepng($errImg
);
        
imagedestroy($errImg
);
    }
    function 
resize($maxWidth 0$maxHeight 0

    {
        
$this->maxWidth $maxWidth
;
        
$this->maxHeight $maxHeight
;

        
$this->calcImageSize($this->currentDimensions['width'],$this->currentDimensions['height'
]);

        if(
function_exists("ImageCreateTrueColor"
)) 
        {
            
$this->workingImage ImageCreateTrueColor($this->newDimensions['newWidth'],$this->newDimensions['newHeight'
]);
        } else {
            
$this->workingImage ImageCreate($this->newDimensions['newWidth'],$this->newDimensions['newHeight'
]);
        }

        
ImageCopyResampled
(
            
$this->workingImage
,
            
$this->oldImage
,
            
0
,
            
0
,
            
0
,
            
0
,
            
$this->newDimensions['newWidth'
],
            
$this->newDimensions['newHeight'
],
            
$this->currentDimensions['width'
],
            
$this->currentDimensions['height'
]
        );

        
$this->oldImage $this->workingImage
;
        
$this->newImage $this->workingImage
;
        
$this->currentDimensions['width'] = $this->newDimensions['newWidth'
];
        
$this->currentDimensions['height'] = $this->newDimensions['newHeight'
];
    }
    function 
resizePercent($percent 0

    {
        
$this->percent $percent
;

        
$this->calcImageSizePercent($this->currentDimensions[ 'width'
],$this->currentDimensions['height']);

        if(
function_exists("ImageCreateTrueColor"
)) 
        {
            
$this->workingImage ImageCreateTrueColor($this->newDimensions['newWidth'],$this->newDimensions['newHeight'
]);
        } else {
            
$this->workingImage ImageCreate($this->newDimensions['newWidth'],$this->newDimensions['newHeight'
]);
        }

        
ImageCopyResampled
(
            
$this->workingImage
,
            
$this->oldImage
,
            
0
,
            
0
,
            
0
,
            
0
,
            
$this->newDimensions['newWidth'
],
            
$this->newDimensions['newHeight'
],
            
$this->currentDimensions['width'
],
            
$this->currentDimensions['height'
]
        );

        
$this->oldImage $this->workingImage
;
        
$this->newImage $this->workingImage
;
        
$this->currentDimensions['width'] = $this->newDimensions['newWidth'
];
        
$this->currentDimensions['height'] = $this->newDimensions['newHeight'
];
    }
    function 
cropFromCenter($cropSize

    {
        if(
$cropSize $this->currentDimensions['width']) $cropSize $this->currentDimensions['width'
];
        if(
$cropSize $this->currentDimensions['height']) $cropSize $this->currentDimensions['height'
];

        
$cropX intval(($this->currentDimensions['width'] - $cropSize) / 2
);
        
$cropY intval(($this->currentDimensions['height'] - $cropSize) / 2
);

        if(
function_exists("ImageCreateTrueColor"
)) 
        {
            
$this->workingImage ImageCreateTrueColor($cropSize,$cropSize
);
        } else {
            
$this->workingImage ImageCreate($cropSize,$cropSize
);
        }

        
imagecopyresampled
(
            
$this->workingImage
,
            
$this->oldImage
,
            
0
,
            
0
,
            
$cropX
,
            
$cropY
,
            
$cropSize
,
            
$cropSize
,
            
$cropSize
,
            
$cropSize
        
);

        
$this->oldImage $this->workingImage
;
        
$this->newImage $this->workingImage
;
        
$this->currentDimensions['width'] = $cropSize
;
        
$this->currentDimensions['height'] = $cropSize
;
    }
    function 
crop($startX,$startY,$width,$height

    {
        
//make sure the cropped area is not greater than the size of the image
        
if($width $this->currentDimensions['width']) $width $this->currentDimensions['width'
];
        if(
$height $this->currentDimensions['height']) $height $this->currentDimensions['height'
];
        
//make sure not starting outside the image
        
if(($startX $width) > $this->currentDimensions['width']) $startX = ($this->currentDimensions['width'] - $width
);
        if((
$startY $height) > $this->currentDimensions['height']) $startY = ($this->currentDimensions['height'] - $height
);
        if(
$startX 0$startX 0
;
        if(
$startY 0$startY 0
;

        if(
function_exists("ImageCreateTrueColor"
)) 
        {
            
$this->workingImage ImageCreateTrueColor($width,$height
);
        } else {
            
$this->workingImage ImageCreate($width,$height
);
        }

        
imagecopyresampled
(
            
$this->workingImage
,
            
$this->oldImage
,
            
0
,
            
0
,
            
$startX
,
            
$startY
,
            
$width
,
            
$height
,
            
$width
,
            
$height
        
);

        
$this->oldImage $this->workingImage
;
        
$this->newImage $this->workingImage
;
        
$this->currentDimensions['width'] = $width
;
        
$this->currentDimensions['height'] = $height
;
    }
    function 
show($quality=100,$name ''

    {
        switch(
$this->format

        {
            case 
'GIF'
:
                if(
$name != ''

                {
                    
ImageGif($this->newImage,$name
);
                } else {
                   
header('Content-type: image/gif'
);
                   
ImageGif($this->newImage
);
                }
                break;
            case 
'JPG'
:
                if(
$name != ''

                {
                    
ImageJpeg($this->newImage,$name,$quality
);
                } else {
                   
header('Content-type: image/jpeg'
);
                   
ImageJpeg($this->newImage,'',$quality
);
                }
                break;
            case 
'PNG'
:
                if(
$name != ''

                {
                    
ImagePng($this->newImage,$name
);
                } else {
                   
header('Content-type: image/png'
);
                   
ImagePng($this->newImage
);
                }
                break;
        }
    }
    function 
save($name,$quality=100

    {
        
$this->show($quality,$name
);
    }
    function 
gatherImageMeta
() 
    {

        if(
function_exists("exif_read_data") && $this->format == 'JPG'

        {
            
$imageData exif_read_data($this->fileName
);
            if(isset(
$imageData['Make'
])) 
                
$this->imageMeta['make'] = ucwords(strtolower($imageData['Make'
]));
            if(isset(
$imageData['Model'
])) 
                
$this->imageMeta['model'] = $imageData['Model'
];
            if(isset(
$imageData['COMPUTED']['ApertureFNumber'
])) 
            {
                
$this->imageMeta['aperture'] = $imageData['COMPUTED']['ApertureFNumber'
];
                
$this->imageMeta['aperture'] = str_replace('/','',$this->imageMeta['aperture'
]);
            }
            if(isset(
$imageData['ExposureTime'
])) 
            {
                
$exposure explode('/',$imageData['ExposureTime'
]);
                
$exposure round($exposure[1]/$exposure[0],-1
);
                
$this->imageMeta['exposure'] = '1/' $exposure ' second'
;
            }
            if(isset(
$imageData['Flash'
])) 
            {
                if(
$imageData['Flash'] > 0

                {
                    
$this->imageMeta['flash'] = 'Yes'
;
                } else {
                    
$this->imageMeta['flash'] = 'No'
;
                }
            }
            if(isset(
$imageData['FocalLength'
])) 
            {
                
$focus explode('/',$imageData['FocalLength'
]);
                
$this->imageMeta['focalLength'] = round($focus[0]/$focus[1],2) . ' mm'
;
            }
            if(isset(
$imageData['DateTime'
])) 
            {
                
$date $imageData['DateTime'
];
                
$date explode(' ',$date
);
                
$date str_replace(':','-',$date[0]) . ' ' $date[1
];
                
$this->imageMeta['dateTaken'] = date('m/d/Y g:i A',strtotime($date
));
            }
        }
    }


    
}
?>

 

 Thumb class'ı ile ayrıntılı bilgiye http://www.gen-x-design.com/projects/php-thumbnailer-class/  adresinden ulaşabilirsiniz.


class/general.class.php

 


<?php
Class 
General
{
    var 
$db
;
    
    
/**
     * Enter description here...
     *
     * @param unknown_type $db
     * @return General
     */
    
function General(&$db
)
    {
        
$this->db = &$db
;
    }
    

    
/**
     * Sayfalama fonksiyonu...
     *
     * @param string $index
     * @param string $page
     * @param string $action
     * @param string $static
     * @param int $p
     * @param int $num
     * @param int $limit
     * @return string
     */
    
function Pagination($index,$page,$action,$static,$p,$num,$limit

    {
        
$nav ""
;
        if(
$num $limit
)
         {
             
$p            = (int) $p
;
              
$total_page ceil($num $limit
);
            
$tpl_on     "<li><a href=\"".$index."?page=".$page."&action=".$action.$static."&p={s}\">".$p."</a></li>"
;
            
$tpl_off     " <li><a href=\"".$index."?page=".$page."&action=".$action.$static."&p={s}\">{t}</a></li> "
;
                   
            
$pages         = array ($p-3,$p-2,$p-1,$p,$p+1,$p+2,$p+3
);
            
$pages         array_unique($pages
);
            
// 
            
$nav .= "<div class=\"pagination\"><ul>"
;
                
            if(
$total_page && $p != 1
)    
                
$nav .= str_replace("{t}""İlk"str_replace("{s}"1$tpl_off
));
                    
            if(
$p 1
)         
                
$nav .= str_replace("{t}""<"str_replace("{s}", ($p-1), $tpl_off
));
                
            while(list(
$key,$val) = each($pages
)) 
            {
                if(
$val >= && $val <= $total_page

                {
                    if(
$p == $val

                        
$nav .= str_replace(array("{s}""{t}"), $val$tpl_on
);
                    else
                        
$nav .= str_replace(array("{s}""{t}"), $val$tpl_off
);
                }
            }
                
            if(
$p $total_page

                
$nav .= str_replace("{t}"">"str_replace("{s}", ($p+1), $tpl_off
));        
                    
            if(
$total_page && $p != $total_page
)        
                
$nav .= str_replace("{t}""Son"str_replace("{s}"$total_page$tpl_off
));
                        
            
$nav    .= "</ul></div>"
;                    
         }
           return 
$nav
;
    }
    
    
/**
     * Cache yapilan resimler için Md5 isim olusturur...
     *
     * @param string $param
     * @param int $height
     * @param int $width
     * @return string
     */
    
function CacheHash($param,$height="",$width=""
)
    {
        
$hash md5($param.$height.$width
);
        
        return 
$hash
;
    }

}
?>

 


Buraya kadar yazdığımız class ve fonksiyonlar sistemin ana işleyişi ile iligli kısımdı. Şimdi haber sistemini yapmaya başlayabiliriz.



 


Emre 20.05.2007
Sayfalar: 1 2 3


co.mments  del.icio.us  digg  Furl  NewsVine  Reddit  Spurl  TailRank  Wists   



Rating : 10 üzerinden 9.43
 



Tümünü Göster / Sadece Başlıklar Yorumlar

Akifemre Makale...
Gercekten cok guzel bir makale, tesekkurler jure.
Artik basma kalip, gelisi guzel kod yazan web programcilarinin fonksiyonel ve nesneye yonelik profesyonel kod yazimina gecmeleri acisindan epey egitici olmus.

Nesneye yonelik programlama konusunda bilgi eksigi olanlar http://www.ceviz.net/php-ve-nesneye-yonelik-programlama_a77.html veSmarty kullanmak istemeyenler dehttp://www.ceviz.net/php-nesneleri-template_a270.html makalelerini inceleyebilirler.


 
anov Server-side kontrol mantığı var mıdır?
Php bilmem, sadece merak ettiğim için soruyorum.
asp.net te Bir textbox un içerdiği değere .Text diyerek ulaşabilirsiniz. Smarty ile 3 katmanlı mimari kullandığımda php bana bu tip imkanları sağlayabilir mi?
 
Mehmet AK OOP tabanında bir açıklama olmuş
Gerçekten bilinçli ve doğru kodlamanın temellerini anlatmışsın

tebrik ediyorum
 
jure asp.net vs smarty
asp.net ile php yi bu açıdan kıyaslamak mümkün değildir. bende asp.net'i çok iyi bilmem ama bildiğim karadıyla object oriented temel üzerine kuruldu yani herşey nesnedir mantığıyla çalışıyor.

ayrıca asp.net ile karşılaştırma yapacak olursak

.aspx -> .tpl (smarty )
.aspx.cs -> .php
.cs -> .php (class)

dosyaları olarak birbirine karşılık gelir. yani sonuç olarak bunu smarty ile değilde php kısmında yapmak gerekecektir. çünkü asp.net te tex1.Text aspx.cs dosyasında yapılıyor. bir form classı yapıldığında php dede bu mümkün olabilir.
 
anov Tebrikler, fakat...
Öncelikle tebrik etmek istiyorum, bir makale için oldukça iyi bir uygulama olmuş. Fakat katmanlar ile ilgili bazı problemler olduğunu düşünüyorum. Biraz eleştiri yazayım bu kadar övgünün üstüne

1- Hiç bir zaman veri katmanının yaptığı işler, iş katmanında bulunmaz. Yani iş katmanı veri/veritabanı/veri kaynağı hakkında hiç bir şey bilmez. Sizin iş katmanı olarak tanıttığınız sınıflarınızda SQL kodları var, bu mimari açıdan yanlıştır. Database layer bir dosya olarak belirtilmiş, aslında o dosya da veritabanına erişimi kolaylaştıran bir Helper nesne ve iş katmanı olarak belirtilen sınıfların bir kısmı da aslında veri katmanına dahil edilmeli.

Ayrıca sistem klasörü içindeki dosyalar hangi katmana dahil oluyor? Belirtilmemiş.

Sınıfların tasarımı ile de ilgili problemler var, sınıfların içindeki metodlar birbirini kullanmıyor hiç ve hemen hemen hiç sınıf attribute'u ve property'si tanımlanmamış. Sınıflar kabaca sadece namespace görevi görüyor gibi.

Bana kalırsa OOP'un faydalarını kullanabilmek için Design Patterns incelenmeli ve o pattern'leri kullanan sınıflar tasarlanmalı. Heralde OOP'a en temiz geçiş bu olur.

 
jure eksiklikler
evet haklsısınız bazı problemler olabilir, ben çok iyi bişey yaptım demiyorum fakat yararlı olacağı sanıyorum. Bu tip bilgileri bulmanız çok zor özelikle türkçe kaynak açısından.

" Ayrıca sistem klasörü içindeki dosyalar hangi katmana dahil oluyor? Belirtilmemiş."

"iş katmanına dahil elbette gerekli olacağını düşünememiştim".

"Hiç bir zaman veri katmanının yaptığı işler, iş katmanında bulunmaz."

Aslında sql kodları yoktu

$db->query($table,$fields,$values,$where);

gibi idi fakat ben bunu yetiştiremeyeceğim için (pazartesi finallerin başlıyor) böyle bir başlangıç yapma zorunluluğu hissettim.


" Sınıfların tasarımı ile de ilgili problemler var, sınıfların içindeki metodlar birbirini kullanmıyor "

ilk baştaki sınıf şemasına bakarsanız bunu bir başlangıç olduğunu görürsünüz. İlerleyen yerlerde methodlar birbirini elbet kulanacaktır ama yine dedigim gibi bunu asp.net ile kıyaslamamak lazım.

php4 ve classlar ile ilgili ayrıntılı bilgi http://www.php.net/manual/en/language.oop.php buradan alınabilir.

Sonuçta bu projenin iş katmanında su anda 3-5 fonksiyondan kullanıyor şu aşamada bu giriş için yazılmıştır ileride biraz daha gelişecektir tabi bunu derken bu benim bakış açım olduğu için yanlış şeylerde illaki yapılacaktır. Bunlarıda siz söyleyince öğreneceğiz.

Teşekkürler
 
turansoylu Elinize Sağlık
Konunun özellikle ilk kısmı oldukça anlaşılır. PHP bilmediğim için öyle söylüyorum. Gerçekten çok güzel çalışmalar bunlar.. Yazan tüm arkadaşlardan Allah razı olsun.
 
ali mvc
flash tabanlı ria geliştiricisi olarak bahsettiğiniz model bizimde kendi web tabanlı projelerde kullandığımız modeldir.Buna kısaca mvc ingilizce olarak model view controller olarak ifade edilmektedir.Yanlız ben oldum olası php ile kod yazmayı sevemediğimden bu mimariyi phpde uygulama fırsatım olmadı.Makaleniz umarım buna bir önayak olacaktır.
Flash uygulamaları geliştiren arkadaşlar model kısmında amfphp projesinden faydalanarak, çok daha ayrık uygulamalar geliştirebilmektedir.Nitekim flash componentleri tamamıyla bu mimari üzerine geliştirilmiştir.
Bunu dışında mvc tek başına bir pattern olmaktan daha ziyade Observer ve Singleton gibi patternları kendi yapısında derlemiş karma bir patterndir.Mvc yanı sıra bu patternlara da gözatmanın faydası olacaktır.
 
Can Asp.net versiyonu
Elinize saglik baya bir emek harcanarak yazilmis bir makale. ben php ile ilgilenmedigim icin kodu incelemedim ama n-tier mimarilerde pattern kullanimini ögrenmek istiyorum.bu makalenin yada benzerinin asp.net versiyonu yazilsa tam süper olucak. birde pattern ler kullanilirsa dadindan yinmez. :)
 
jure makalede değişiklik
anov'un söylemesi üzerine veritabanı sınıfında (database.class.php) bazı değişiklikler yaptım. bundaki değişiklikler nedeniyle news.class.php ve news.php dede bazı değişiklikler oldu. bilginize. 23.05.2007
 
anov Bu tür çalışmaların devamını dilerim
Yanlış anlaşılmak istemem, php ile asp.net karşılaştırılamaz tabii bunun için erken olabilir. Ancak bir gün php nin o güce erişebileceğini tahmin edebiliyorum. Bu tip bilgilendirici çalışmaların devamı ile ancak biz bu yöne yönelebiliriz. template mantığından ziyade tam anlamıyla (render) mantığını içinde bulunduran ve kolay kullanılabilen (kod ve html i veya kod ve sql i iç içe barındırmayacak) bir yapıyı bir gün gerçekleştireceğini ümit ediyorum. Bu durumda php yi "henüz yeterince olgunlaşmamış" olarak görmemi umarım anlayışla karşılayacaksınız. Kolay gelsin.
 
Ahmet Guzel çalışma
İyi bir çalışma olmuş, bayağıdır patTemplate takıntısından kurtulup smarty ile siteler yapmaya başlasam dediğim zamanda okudum makalenizi, direkt elimdeki bir işi smarty ile yapmaya başladım, smarty nin hızı konusunda aklıma takılan birkaç durum vardı ama dün yaptığım testlerden sonra, sabit bölümleri(menuler, ust bar vb.) cache atarak yaptığım ölcümlerde hız kaygımın boşa olduğu ortaya çıktı.
 
jure ahmet : smarty
\libs\plugins içerisinden kullanmadiginiz veya kullanmayacaginiz pluginleri silebilirsiniz.
 
ismail teşekkürler
güzel ve aydınlatıcı bir makale olmuş. teşekkürler
 
o--d Devamını bekliyoruz
Makalenin devamını diliyorum. Tesekkurler paylastığın icin.
 
Lisans Güzel
Devamını bekliyoruz gerçekten hoş bir makale.
 
emin eyvallah
çok sağolun tam smarty nedir onu araştırıyordum üstüne bu makaleyi buldum ALLAH razı olsun
 
anılkan gayet başarılı bir çalışma..
Emeğinize sağlık. Bence makalenizin devamını yazmaya hemen başlamalısınız.
 
zekeriya thnks
emeğenize sağlık çok güzel teşekkürler....
 
Sinan Eldem Tebrikler...
Gerçekten açıklamalar ve örnekler çok güzel hazırlanmış, kutlarım...
 
Sahin Tebrikler ve tesekkurler
Özellikle smarty ile ilgili örnek türkçe kaynak bulmak oldukca zor eger ki yeterince kaynak olsa daha cok kisi smarty ile proje gelistirmeye basliyacaktir tebrik ederim Emre güzel calisma.
 
Emre projenin devamı
artık bu sistem üzerinde çalışmadığımdan bu projeyi devam ettiremiyorum. codeigniter (codeigniter.com) + smarty (smarty.php.net) tabanlı bir sistem üzerinde calısmalarım sürüyor. Eğer zaman bulabilirsem bunlar ile alakalı da bir yazı yazmaya çalışırım.
 
freestyle teşekkürler
bunun gibi türkçe makaleler bulmak gerçekten güç.böyle bir girişimde bulunduğunuz için tebrik ediyorum.bizlerin eleştirileriyle de daha anlaşılır ve doğru makaleler yazacağınızı umuyorum.
 
mehmet ellerine sağlık
makale için teşekkurlerimi iletmeyi kendime bir borç bilirim
 
eDe teşekkür
makalenizden faydalandım.
teşekkürler ediyorum..
 
deNİs tsk
gercektende cok yayarı dokundu
 
deNİs tsk
gercektende cok yayarı dokundu
 
serkan teşekürler
teşekürler...
 
eDe yardım
makalenin devamını yazmayacağınızı söylemişsiniz.
makaleyi uyguladım ve şu anda kendimi yarım bırakılmış hissediyorum. bu makaledeki diğer dosyaları bulabileceğimiz -yabancı kaynak- var mı acaba.?
teşekkürler...
 
Emre dosyalar
bu dosyaları ben olusturdugum icin baska yerde bulamazsınız. ayrıca programlamayı tamamen bırakmıs durumdayım. devam etmesi gibi bir olasılık hiç kalmadı. kolay gelsin.
 
eDe 1 teklif
Uygulamanın planını gösteren bir sınıf şeması vermiştiniz. O şemadaki dosyaların içerisinde olması gereken fonksiyon isimlerini yazsanız ve biz de o ipuçlarına göre uygulamanın devamını geliştirsek.?
Yani şöyle..:
search.class.php : (var bulunan; var bla bla; metod search; metod bla bla

bu şekilde ana planı çizebilirseniz sanırım uygulama geliştirmek adına bu siteyi takip eden birçok üyeye güzel bir alıştırma hediye etmiş olursunuz.?
teşekkürler...
 
elshad teshekkurler
gozel bir makale yapmişsiniz.Teşekkürler.Admin panel ile bilgi verseydiniz güzel olurdu.
 
esen güzel olmuş ama
ama ben henüz programcı olma yolundayım pek de bişey anlamadım ellerinize sağlık güzel bilgiler edindiğimde oluyor bi de bu işe yeni başlamaya adım atmış insanlar için ele alacak bi yazı yassanız daha da güzel olur programcı olmayı çok istiyorum ama bu işe nasıl nerden başlmalıyım bu tür sorulara cvb olabilecek bi yazı
 
Emre yeni başlayanlar için
sitede yeni başlayanlar için yazılmış bir sürü makale bulabilirsiniz.
 
asmode tam da vaktinde :)
gerçekten çok teşekkürler
tam da mvc ve php ile oop öğrenmeye başladığım dönemde ilaç gibi geldi :)
 
Doğruyu söylemek gerekirse çok iyi PHP bildiğim söylenemez. Ancak makalenizi oldukça başarılı buldum. Son derece anlaşılır. Tebrik ediyorum.
 
handan tebrik
sik sik sik
 
tqhobreipm ejuIYnFv
NduM1V <a href="http://lhgwchyyxpxi.com/">lhgwchyyxpxi</a>, [url=http://wncittmryhsc.com/]wncittmryhsc[/url], [link=http://mjssksrnpsxc.com/]mjssksrnpsxc[/link], http://rfswkjqfwjoj.com/
 
Cihan db.class
db modellemesinde neden 2 ayrı sınıf yazma ihtiyacı duydun jure ? yani tek bir class ile gerçekleştirsek sorun mu yaşarız yoksa tamamen keyfi bişeymidir ?
 
bilcelik oop kaynak
arkadaşlar oop yi sıfırdan anlatan bir kaynak varmı bildiğiniz ve tam olarak bu ne işe yarar ve avantajları nelerdir bilgilendirir seniz çok teşekkür ederiz
iyi çalışmalar
 
tebrikler, gerçekten mükemmel bir çalışma
 




yorum Yorum ekle
İsminiz:
Mailiniz:
Yorum Konu:
Soru: Gökyüzü ne renktir?
Cevap :
Bütün alanları doldurmanız gerekmektedir.

 
XHTML 1.0 CSS 2.1
Ceviz Reklam