Bu makale ile joomlanın kodlarına girişyaparak kendimizi daha çok geliştirmeye çalışacağız. Öncelikle ilk dosyamızolan ve ana dizinde bulunan index.php yi incelemeyle joomla kodlarınagiriyoruz.
İlk satırından itibaren aşağılara doğruinmeye başladığımızda karşımıza çıkan ilk kod;<
Kod:
define( '_VALID_MOS', 1 );
Bu kod ile sitemizin diğer dosyalarınınher birisinde bulunan;
Kod:
defined( '_VALID_MOS' ) or die('Restricted access' );
kodunun tanımlamasını yapıyoruz. Böylecediğer joomla dosyalarının ancak ve ancak index.php içerisinde çağırıldığındaçalışması gerektiğini belirterek ilk güvenlik önlemimizi alıyoruz.
Daha sonra karşımıza gelen kod satırı iseşöyle;
Kod:
if (!file_exists( 'configuration.php' ) ||filesize( 'configuration.php' ) < 10) {
$self = rtrim( dirname( $_SERVER['PHP_SELF'] ), '/\\' ) . '/';
header("********: http://" . $_SERVER['HTTP_HOST'] . $self ."installation/index.php" );
exit();
}
Bu kodu anlatmak gerekirse; "eğerconfiguration.php dosyası yok ise veya dosyanın boyutu 10 byte tan küçük ise(ki bu dosyanın hatalı olduğu anlamına gelir) bizi installation/index.phpdosyasına götür" demek oluyor ki joomla bizi kurulum sayfasına götürüyor.
Daha sonraki kod ise;
Kod:
require( 'globals.php' );
require_once( 'configuration.php' );
gerekli olan 2 önemli dosyayı globals.phpyi (ki ilerleyen yazılarımda bu dosyayı da anlatacağım) ve elbette sitemizintüm yapılandırmasının bulunduğu configuration.php dosyasını index.php içerisineaktarıyor.
Kod:
$http_host = explode(':',$_SERVER['HTTP_HOST'] );
if( (!empty( $_SERVER['HTTPS'] )&& strtolower( $_SERVER['HTTPS'] ) != 'off' || isset( $http_host[1] )&& $http_host[1] == 443) && substr( $mosConfig_live_site, 0, 8) != 'https://' ) {
$mosConfig_live_site = 'https://'.substr( $mosConfig_live_site, 7 );
}
bu kod ise sitemizin https desteğinisağlar. Bu koddan sonra gelen ve joomla için en can alıcı kısım;
Kod:
require_once( 'includes/joomla.php' );
bu kod ile joomlanın birçok temelfonksiyonlarını barındıran joomla.php yi index.php içerisine aktarıyoruz.joomla.php dosyası includes klasörü içerisinde bulunur ve eğer joomla içinbirşeyler kodlayacaksanız, php bilginiz orta düzeyde ise ve bazı kodlamalardakolaylık istiyorsanız bu joomla.php yi mutlaka detaylı olarak incelemenizitavsiye ederim.
Bu önemli koddan sonra gelen satır ise;
Kod:
if (file_exists( 'installation/index.php') && $_VERSION->SVN == 0) {
define( '_INSTALL_CHECK', 1 );
include ( $mosConfig_absolute_path .'/offline.php');
exit();
}
joomla kurulum dosyalarının bulunupbulunmadığına, eğer bulunuyor ve kurulan site demo sitesi gibi bir site değilise ($_VERSION->SVN ile sitenin bir demo sitesi mi yoksa normal bir site miolduğunu belirleriz ve bu değer includes/version.php içerisinden değiştirilebilir.)offline.php ile sitemizin kapalı konuma geçirir.
Daha alt satırlara indiğimizde;
Kod:
if ($mosConfig_offline == 1) {
require( $mosConfig_absolute_path .'/offline.php' );
}
bu kodu görüyoruz. Bu kod eğer sitemizkapalı ise offline.php ile sitemizin kapalı konuma geçmesini belirtir.
Buraya kadarki kodlardan da anlaşılacağıüzere sitemize çeşitli durumlarda çeşitli dosyalar yardımı ile bazı özelliklerkazandırdık. Bundan sonraki satırlarda genellikle bu özelliklerin kullanımı ileilgili bazı kodlar yer alacaktır.
Kod:
$_MAMBOTS->loadBotGroup( 'system' );
bu satır ile sitemize system grubundakimambotları aktarıyoruz. Örneğin Joomfish bileşeninin system botu gibi...
Kod:
$_MAMBOTS->trigger( 'onStart' );
Bu satır ile joomlaya "onStart"eyleminde çalışması gereken mambotları aktarıyoruz. Henüz joomla sitemizgörüntülenmeye bile başlamadı. Eylemin adından da anlaşılacağı üzere "tambaşlangıçta" yız.
Sitemize SEF desteği verilen satırlar;
Kod:
if (file_exists( $mosConfig_absolute_path.'/components/com_sef/sef.php' )) {
require_once( $mosConfig_absolute_path .'/components/com_sef/sef.php' );
} else {
require_once( $mosConfig_absolute_path .'/includes/sef.php' );
}
ile belirtiliyor. Eğer sitemizde bircom_sef bileşeni (OpenSEF gibi) kullanıyorsak joomla bunu kullanacak, yok eğerbir bileşen kullanmıyorsak joomla kendi sef.php sini kullanacaktır.
Sitemizin açılış sayfasını yavaştanoluşturmaya başlıyoruz.
Kod:
require_once( $mosConfig_absolute_path.'/includes/frontend.php' );
bu satır ile sitemizin ana sayfasınıoluşturuyoruz. frontend.php dosyası ile sitemizin
<head>
...
</head>
etiketini ve kullandığımız temadaki modül pozisyonlarına bağlı olarakkullanılan modülleri yüklüyoruz.
Kod:
$option = strval( strtolower( mosGetParam($_REQUEST, 'option' ) ) );
$Itemid = intval( mosGetParam( $_REQUEST,'Itemid', null ) );
if ($option == '') {
if ($Itemid) {
$query = "SELECT id, link"
. "\n FROM #__menu"
. "\n WHERE menutype = 'mainmenu'"
. "\n AND id = " . (int) $Itemid
. "\n AND published = 1"
;
$database->setQuery( $query );
} else {
$query = "SELECT id, link"
. "\n FROM #__menu"
. "\n WHERE menutype = 'mainmenu'"
. "\n AND published = 1"
. "\n ORDER BY parent, ordering"
;
$database->setQuery( $query, 0, 1 );
}
$menu = new mosMenu( $database );
if ($database->loadObject( $menu )) {
$Itemid = $menu->id;
}
$link = $menu->link;
if (($pos = strpos( $link, '?' )) !== false) {
$link = substr( $link, $pos+1 ). '&Itemid='.$Itemid;
}
parse_str( $link, $temp );
/** this is a patch, need to rework when globals are handled better */
foreach ($temp as $k=>$v) {
$GLOBALS[$k] = $v;
$_REQUEST[$k] = $v;
if ($k == 'option') {
$option = $v;
}
}
}
if ( !$Itemid ) {
// when no Itemid give a default value
$Itemid = 99999999;
}
bu uzun satırlar ile sitemizde kullanılan2 önemli değeri $option ve $Itemid değerini belirliyoruz.
Buraya kadar olan bölümde modüller, açılışsayfası ve açılışta kullanılacak mambotları sitemize aktardık. Şimdi isesitemizin ana temelini oluşturan ziyaretçi bilgilerini oluşturalım ve gereklibilgileri hem veritabanına işleyelim hem de global olarak belirtelim.
Kod:
$mainframe = new mosMainFrame( $database,$option, '.' );
$mainframe->initSession();
bu satırın içerisinden de anlaşılacağıüzere sitemizin ana çerçevesini oluşturduk. Oturum durumunu initSessionfonksiyonu ile belirledik. initSession fonksiyonu ilerde de anlatacağım üzereincludes/joomla.php içerisinde bulunan bir fonksiyon olup siteye giren birkişinin oturumunu oluşturur. Böylece ilerde bu kişi siteye giriş yapmak isterseoluşturulan bazı bilgileri kullanma fırsatımız olacak.
Kod:
$_MAMBOTS->trigger( 'onAfterStart' );
bu satırın içerisinden de anlaşılacağı üzere"başlangıçtan sonra" aktarılacak mambotları siteye aktarıyoruz.
Bu yazımızda index.php dosyasınakaldığımız yerden devam ederek bitireceğiz. Daha sonra da ana dizinde bulunandiğer dosyalara teker teker göz atmaya devam edecez.
Ana dizinde bulunan index.php içerisindekaldığımız kodlar şöyle başlıyor;
Kod:
if ( $option == 'com_content' &&$Itemid === 0 ) {
$id = intval( mosGetParam($_REQUEST, 'id', 0 ) );
$Itemid = $mainframe->getItemid( $id );
}
/** do we have a valid Itemid yet?? */
if ( $Itemid === 0 ) {
/** Nope, just use the homepage then. */
$query = "SELECT id"
. "\n FROM #__menu"
. "\n WHERE menutype = 'mainmenu'"
. "\n AND published = 1"
. "\n ORDER BY parent, ordering"
;
$database->setQuery( $query, 0, 1 );
$Itemid = $database->loadResult();
}
// patch to lessen the impact on templates
if ($option == 'search') {
$option = 'com_search';
}
Bu kodlar içerik yazılarımızdaki Itemiddeğerinin doğru olarak tespit edilmesini sağlıyor.
Kod:
if ($mosConfig_lang=='') {
$mosConfig_lang = 'english';
}
include_once( $mosConfig_absolute_path.'/language/' . $mosConfig_lang . '.php' );
Bu kodlar sitenin dili tanımlanmamış isevarsayılan olarak ingilizceyi seçiyor.
Kod:
$return = strval( mosGetParam( $_REQUEST, 'return', NULL ) );
$message = intval( mosGetParam( $_POST, 'message',0 ) );
if ($option == 'login') {
$mainframe->login();
// JS Popup message
if ( $message ) {
?>
<script language="javascript"type="text/javascript">
<!--//
alert( "<?php echo addslashes( _LOGIN_SUCCESS ); ?>" );
//-->
</script>
<?php
}
if ( $return && !( strpos( $return, 'com_registration' ) ||strpos( $return, 'com_login' ) ) ) {
// checks for the presence of a return url
// and ensures that this url is not the registration or login pages
// If a sessioncookie exists, ******** to the given page. Otherwise,take an extra round for a cookiecheck
if (isset( $_COOKIE[mosMainFrame::sessionCookieName()] )) {
mos********( $return );
} else {
mos********( $mosConfig_live_site.'/index.php?option=cookiecheck&return=' . urlencode( $return ) );
}
} else {
// If a sessioncookie exists, ******** to the start page. Otherwise,take an extra round for a cookiecheck
if (isset( $_COOKIE[mosMainFrame::sessionCookieName()] )) {
mos********( $mosConfig_live_site .'/index.php' );
} else {
mos********( $mosConfig_live_site .'/index.php?option=cookiecheck&return='. urlencode( $mosConfig_live_site .'/index.php' ) );
}
}
} else if ($option == 'logout') {
$mainframe->logout();
// JS Popup message
if ( $message ) {
?>
<script language="javascript"type="text/javascript">
<!--//
alert( "<?php echo addslashes( _LOGOUT_SUCCESS ); ?>" );
//-->
</script>
<?php
}
if ( $return && !( strpos( $return, 'com_registration' ) ||strpos( $return, 'com_login' ) ) ) {
// checks for the presence of a return url
// and ensures that this url is not the registration or logout pages
mos********( $return );
} else {
mos********( $mosConfig_live_site.'/index.php' );
}
} else if ($option == 'cookiecheck') {
// No cookie was set upon login. If it is set now, ******** to the givenpage. Otherwise, show error message.
if (isset( $_COOKIE[mosMainFrame::sessionCookieName()] )) {
mos********( $return );
} else {
mosErrorAlert( _ALERT_ENABLED );
}
}
Bu uzunca kod ise siteye giriş ve çıkışyaparken gösterilen çeşitli uyarıları ve çerez (cookie) ayarlarını düzenliyor.
Kod:
$my = $mainframe->getUser();
İşte bu kod biz kodlamacı arkadaşlar içinönemli kodlardan bir tanesi. $my değeri ile sitedeki herhangi birisininkullanıcı adı, adı, üye numarası, oturum değeri gibi birçok bilgiyiçekebiliriz. Mesela;
göstermek mümkündür.
Kod:
$mainframe->detect();
bu kod siteyi ziyaret eden üyenintarayıcısı, ip adresi gibi çeşitli bilgilerini toplar.
Kod:
$cur_template =$mainframe->getTemplate();
bu kod sitede kullanılan varsayılan temayıbelirler.
Kod:
require_once( $mosConfig_absolute_path .'/editor/editor.php' );
bu kod sitemizde kullanacağımız metineditörünü belirler.
Kod:
ob_start();
if ($path = $mainframe->getPath('front' )) {
$task = strval( mosGetParam($_REQUEST, 'task', '' ) );
$ret = mosMenuCheck( $Itemid,$option, $task, $gid );
if ($ret) {
require_once( $path );
} else {
mosNotAuth();
}
} else {
header( 'HTTP/1.0 404 Not Found' );
echo _NOT_EXIST;
}
$_MOS_OPTION['buffer'] =ob_get_contents();
ob_end_clean();
Bu kodlar ile output buffering fonksiyonuçalıştırılır. Türkçeye çevirecek olursak gösterilecek içerik tamponlanır, yanidüzene sokulur diyebiliriz.
Kod:
initGzip();
Bu kod ile Gzip desteğini aktive ediyoruz.
Kod:
header( 'Expires: Mon, 26 Jul 199705:00:00 GMT' );
header( 'Last-Modified: ' . gmdate( 'D, dM Y H:i:s' ) . ' GMT' );
header( 'Cache-Control: no-store,no-cache, must-revalidate' );
header( 'Cache-Control: post-check=0,pre-check=0', false );
header( 'Pragma: no-cache' );
Sitemizin header bölümünü oluşturuyoruz.
Kod:
if (defined( '_ADMIN_OFFLINE' )) {
include( $mosConfig_absolute_path .'/offlinebar.php' );
}
Bu kod, eğer site kapalı fakat siteyegiriş yapan bir admin ise sitemizin üst bölümünde kırmızı bir alanda sitekapalı gibi bir uyarı ile siteyi bize gösteriyor.
Kod:
if ( !file_exists($mosConfig_absolute_path .'/templates/'. $cur_template .'/index.php' ) ) {
echo _TEMPLATE_WARN . $cur_template;
} else {
require_once( $mosConfig_absolute_path .'/templates/'. $cur_template.'/index.php' );
echo '<!-- '. time() .' -->';
}
Bu kod kullandığımıztemanın index.php dosyasını aktarıyor. Böylece sitemiz gösterime hazır halegeldi.
Kod:
if ($mosConfig_debug) {
echo $database->_ticker . ' queries executed';
echo '
<pre>';
foreach ($database->_log as $k=>$sql) {
echo $k+1 . "\n" . $sql . '<hr />';
}
echo '</pre>
';
}
Bu kod gösterilen sayfadaki tüm veritabanısorgulamalarını ve sorgulama süresini gösteriyor. $mosConfig_debug değeri ile(ki bu değer configuration.php içerisinde bulunur ve Genel yapılandırmadandeğiştirilebilir) bu fonksiyonu çalıştırabiliriz.
Buraya kadar ki yazımızda joomlanın index.phpdosyasını anlatmaya çalıştım. Kodlamada kullanılabilecek en önemli değerburada $my değeridir ki bu değer, sitedeki üyenin yukarıdasaydığım birçok bilgisini içerisinde barındırmaktadır.
Bu makalemizde joomla ana dizinindekiindex2.php dosyasından ve index2.php nin index.php den ayrılan en önemli 2özelliğinden bahsedeceğiz. Bunlardan bir tanesi do_pdf yani içeriği pdfformatına dönüştürme, diğeri ise içeriği temadan bağımsız gösterebilmedir.index2.php nin index.php den ayrılan özelliği sitemizdeki herhangi bir sayfayısitemizdeki modüllerden bağımsız, daha doğrusu modül pozisyonları olmadan gösterebilmemizdir.Örneğin;
Bu adrese baktın ve daha sonra index.phpyazan yeri index2.php olarak değiştirip tekrar bakın;
Umarım aradaki farkı anlamışsınızdır.
Şimdi gelin hep birlikte index2.phpdosyasını açalım ve teker teker kodları incelemeye başlayalım.
Kod:
define( '_VALID_MOS', 1 );
Bu kod ile index.php de olduğu gibi budosyanın ana dosya olduğunu belirtip ilk basit güvenlik önlemimizi alıyoruz.
Kod:
require( 'globals.php' );
require_once( 'configuration.php' );
Bu kod ile gerekli olan 2 dosyayıindex2.php dosyasına aktarıyoruz.
Kod:
$http_host = explode(':',$_SERVER['HTTP_HOST'] );
if( (!empty( $_SERVER['HTTPS'] )&& strtolower( $_SERVER['HTTPS'] ) != 'off' || isset( $http_host[1] )&& $http_host[1] == 443) && substr( $mosConfig_live_site, 0, 8) != 'https://' ) {
$mosConfig_live_site = 'https://'.substr( $mosConfig_live_site, 7 );
}
Bu kod ile sitemizde SSL kullanacaksakonun desteğini sağlıyoruz.
Kod:
require_once( 'includes/joomla.php' );
Bu kod ile sitemizde kullanacağımız temelve gerekli birçok joomla sınıf (Class olarak geçer) ve fonksiyonunu (Functionolarak geçer) aktarıyoruz.
Kod:
if ($mosConfig_offline == 1) {
require( $mosConfig_absolute_path .'/offline.php' );
}
Sitemiz kapalıysa offline.php yigösteriyoruz.
Kod:
$_MAMBOTS->loadBotGroup( 'system' );
Sistem grubundaki mambotları aktarıyoruz.
Kod:
$_MAMBOTS->trigger( 'onStart' );
Başlangıçta çalışacak mambotlarıçalıştırıyoruz.
Kod:
if (file_exists( $mosConfig_absolute_path.'/components/com_sef/sef.php' )) {
require_once( $mosConfig_absolute_path .'/components/com_sef/sef.php' );
} else {
require_once( $mosConfig_absolute_path .'/includes/sef.php' );
}
Bu kod ile eğer 3. parti dediğimizjoomlanın kendi yapısında olmayan bir SEF bileşeni varsa onu yoksa joomlanınkendi SEF desteğini aktarıyoruz.
Kod:
require_once( $mosConfig_absolute_path.'/includes/frontend.php' );
Bu kod ile modüllerimizi, sayfamızın
<head>
...
</head>
etiketini ve o sayfadaki bileşeni aktarıyoruz.
Kod:
$option = strtolower( strval( mosGetParam( $_REQUEST, 'option' ) ) );
$Itemid = intval( mosGetParam( $_REQUEST, 'Itemid', 0 ) );
$no_html = intval( mosGetParam( $_REQUEST,'no_html', 0 ) );
$act = strval( mosGetParam( $_REQUEST,'act', '' ) );
$do_pdf = intval( mosGetParam( $_REQUEST, 'do_pdf', 0 ) );
Bu kodlar ile çeşitli değerleribelirliyoruz. Burada kullandığımız mosGetParam fonksiyonuna dikkat etmeniziöneririm. mosGetParam ile kolayca bir yerden gönderilen bir değeri alabiliriz.Genelde $deger = $_GET['deger']; tarzında bir kod kullanmaktansa mosGetParamile bir değeri çekmek her zaman güvenlidir. Bunu daha da güvenli hale getirmekiçin intval ve strval fonksiyonlarını kullanıyoruz. intval integer value oluptürkçe karşılığını rakamsal değer olarak çevirebiliriz. strval ise string valueolup sıra değeri diye çevirebiliriz. Bu satırlarda dikkat etmemiz gereken diğerbir nokta ki bu nokta bence kodlamacı arkadaşlar dışında diğer arkadaşlara dayararlı görünüyor, no_html ve do_pdf değerleridir.
Bu değerleri makalemizin sonuna doğruörneklerle açıklayacağım. Böylece bu 2 güzel değerin aslında bazen ne kadarişimize yaracağını öğrenmiş olacağız.
Kod:
$mainframe = new mosMainFrame( $database,$option, '.' );
$mainframe->initSession();
Bu kodlar ile birçok çekirdek fonksiyonunuindex2.php içerisine alıyoruz. Oturumu oluşturuyoruz.
Kod:
$_MAMBOTS->trigger( 'onAfterStart' );
Bu kod ile başlangıçtan hemen sonrakimambotları çalıştırıyoruz.
Kod:
$my = $mainframe->getUser();
index.php dosyasını anlatırken bahsettiğimgibi siteye gelen kişinin tüm bilgilerini veritabanından alıp hepsini $my değerininiçerisine koyuyoruz.
Kod:
if ($mosConfig_lang=='') {
$mosConfig_lang = 'english';
}
include_once( $mosConfig_absolute_path.'/language/' . $mosConfig_lang . '.php' );
Bu kod ile eğer tanımlanmamış isevarsayılan olarak ingilizceyi yok tanımlanmışsa tanımlanan dili sitemizeaktarıyoruz.
Kod:
if ($option == 'login') {
$mainframe->login();
mos********('index.php');
} else if ($option == 'logout') {
$mainframe->logout();
mos********( 'index.php' );
}
Bu kod ile eğer sitemiziziyaret eden kişi giriş yapıyorsa $mainframe->login(); ile giriş yapmasınıyok eğer siteden çıkış yapıyorsa $mainframe->logout(); ile çıkış yapmasınısağlıyoruz ve mos******** fonksiyonu ile sitemizin ana sayfasınayönlendiriyoruz.
Kod:
if ( $do_pdf == 1 ){
include $mosConfig_absolute_path .'/includes/pdf.php';
exit();
}
Bu kod ile gösterdiğimiz içeriği pdfformatına getirmemize yarayan ve includes klasörü içerisinde bulunan pdf.phpdosyasını aktarıyoruz. Bu kodun detaylarını yukarıda söylediğim gibi makaleninsonunda bahsedeceğim.
Kod:
$mainframe->detect();
Bu kod ile sitemize giren kişinin tarayıcıbilgileri, ip adresi gibi çeşitli bilgilerini veritabanına kaydediyoruz.İstatistik tutmak amacıyla kullanılan bir fonksiyon olup eğer istatistiklerigenel yapılandırmadan açarsanız bu fonksiyon çalışmaya başlar.
Kod:
$gid = intval( $my->gid );
Bu kodu index.php yi anlatırken uzuncabahsetmiştim. Tekrar söylemek gerekirse siteye gelen kişinin üyelik seviyesinibelirliyoruz. 0,1,2 olmak üzere 3 seviyeden oluşur.
Kod:
$cur_template = $mainframe->getTemplate();
Kullanılan temayı aktarıyoruz.
Kod:
require_once( $mosConfig_absolute_path .'/editor/editor.php' );
Kullanılan metin editörünü aktarıyoruz.
Kod:
ob_start();
if ($path = $mainframe->getPath('front' )) {
$task = strval( mosGetParam($_REQUEST, 'task', '' ) );
$ret = mosMenuCheck( $Itemid,$option, $task, $gid );
if ($ret) {
require_once( $path );
} else {
mosNotAuth();
}
} else {
header("HTTP/1.0 404 Not Found");
echo _NOT_EXIST;
}
$_MOS_OPTION['buffer'] =ob_get_contents();
ob_end_clean();
initGzip();
header( 'Expires: Mon, 26 Jul 199705:00:00 GMT' );
header( 'Last-Modified: ' . gmdate( 'D, dM Y H:i:s' ) . ' GMT' );
header( 'Cache-Control: no-store, no-cache,must-revalidate' );
header( 'Cache-Control: post-check=0,pre-check=0', false );
header( 'Pragma: no-cache' );
// display the offline alert if an adminis logged in
if (defined( '_ADMIN_OFFLINE' )) {
include( $mosConfig_absolute_path .'/offlinebar.php' );
}
Bu uzun kodları index.php yi anlatırkenbahsettiğim için geçiyorum.
Kod:
if ( $no_html == 0 ) {
$customIndex2 = 'templates/'. $mainframe->getTemplate().'/index2.php';
if (file_exists( $customIndex2 )) {
require( $customIndex2 );
} else {
// needed to seperate the ISO number from the language file constant_ISO
$iso = split( '=', _ISO );
// xml prolog
echo '<?xml version="1.0" encoding="'. $iso[1].'"?' .'>';
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<?php echo $mainframe->getHead(); ?>
<linkrel="stylesheet" xhref="templates/<?php echo$cur_template;?>
/css/template_css.css" type="text/css" />
<link rel="shortcut icon" xhref="<?php echo$mosConfig_live_site; ?>
/images/favicon.ico" />
****** http-equiv="Content-Type" content="text/html;<?php echo _ISO; ?>" />
****** name="robots" content="noindex, nofollow"/>
<?php if ($my->id || $mainframe->get( 'joomlaJavascript' )) {?>
<script language="JavaScript" xsrc="<?php echo$mosConfig_live_site;?>/includes/js/joomla.javascript.js"type="text/javascript"></script>
<?php } ?>
</head>
<body class="contentpane">
<?php mosMainBody(); ?>
</body>
</html>
<?php
}
} else {
mosMainBody();
}
Bu uzun kodlar ise içeriğimizi kullandığımız temadanbağımsız olarak gösterir. Yani içeriğin etrafında ne bir modül ne de başkabirşey olmaz. Sadece içerik gösterilir.
Şimdi buraya kadar olan yazılardaindex2.php içerisindeki kodları anlattım. Gelelim ilk başta bahsettiğimiz 2güzel değer ve bunu nasıl kullanacağımıza... Birinci değer do_pdf idi. Budeğeri nasıl kullanabiliriz. Mesela yazılardan oluşan bir bileşenimiz var ve buyazıları üyelere istedikleri zaman pdf formatında göstermek istiyoruz. Yapmanızgereken içeriğin adresinin sonuna &do_pdf=1 şeklinde birekleme yapmak. Gerisini joomla kendisi yapıyor. Hatırlarsanız Joomla püfnoktaları yazı dizinde bahsettiğim bir &tp=1eklemesi vardı.Aynı şekilde &do_pdf=1 ile de o sayfadaki içeriği pdf formatındagösterebilirsiniz. Deneme için şöyle birşey yapabiliriz;
bu adrese tıklayın. Daha sonra adressatırının sonuna &do_pdf=1 ekleyin ve index.php yi index2.php olarakdeğiştirin, tekrar deneyin.
Umarım bu örnek sizlere yeterinceaçıklayıcı olmuştur. Bu özelliği yaptığınız çeşitli bileşenlerde dekullanabiliriz. Tabi ki kullanabilmeniz için includes/pdf.php dosyasınınbenzerini kendi bileşeniniz için değiştirerek uygun bir yere koymanız vebileşeninizin içerisine yukarıda bahsettiğim;
Kod:
if ( $do_pdf == 1 ){
include $mosConfig_absolute_path .'/includes/pdf.php';
exit();
}
benzeri bir kod eklemeniz gerekiyor.
Gelelim diğer bir değer olan $no_html yianlatmaya. Bu değer ile içeriğimizi temadan bağımsız gösterebiliriz demiştik.do_dpf ile aynı mantığa dayanır. Yapmanız gereken adres satırının sonuna&no_html=1 eklemek ve index.php yazan yeri index2.php olarak değiştirmek.Örnek ile anlatırsak;
Bu adresi şöyle değiştirelim;
ve değişikliği görelim. Bir diğerörneğimizi de şöyle verebiliriz;
Bu adrese bir bakın ve daha sonra adresişöyle değiştirip tekrar bakın ve aradaki farkı görün.
Umarım bu makalemizdeki do_pdf ve no_htmldeğerini sizlere iyi bir şekilde anlatabilmişimdir. Ayrıca kısa da olsamosGetParam fonksiyonuna da değinmiş olduk.
Bu yazı dizisinden itibaren joomlakodlarıyla oynamaya ve bazı fonksiyon ve sınıfların neler yaptığına,yapabileceğine dair güzel örnekler vererek anlamaya çalışacağız. Öncelikleveritabanına bağlanma ve çeşitli sql döngülerini öğreneceğiz. Böyleceyapacağımız bir eklentide kolayca sql sorguları oluşturabilecek ve busorgulardan verileri kolayca çekebileceğiz.
Joomla veritabanına bağlanmak içinincludes klasörü içerisindeki database.php dosyasındaki databasesınıfı(class)nı kullanır. Joomlada yeni bir veritabanına bağlanmak içinkullanacağımız kod şu şekilde olacaktır;
Kod:
$yenibaglanti = new database( $host,$user, $pass, $db, $table_prefix, $goOffline=true);
Şimdi bir eklentimiz var ve joomlanınkullandığı veritabanı dışında başka bir veritabanına bağlanmak istiyoruz. Örnekkodumuz şöyle olmalı;
Kod:
//yeni bir bağlantı oluşturalım
$yenibaglanti = new database('localhost','veritabani_kullanicisi', 'veritabani_parolasi', 'veritabani_adi','tablo_oneki', false);
Bu kod ile bir veritabanına yeni birbağlantı yapmış olduk. Bu veritabanından bir sql sorgusu yapmak istiyoruz. Ozaman setQuery fonksiyonunu kullanmamız gerekiyor. Örneğin;
Veritabanımızda 'JTR' adında bir tablomuzolsun ve bu tablonun içerisinde 'sira' adında bir alanımız olsun. Butablomuzdaki tüm verileri çekmek isteyelim;
Kod:
//yeni oluşturduğumuz bağlantıda bir sqlsorgusu çalıştıralım
$yenibaglanti->setQuery("SELECT *FROM JTR");
Bu kod ile tüm verileri çektik. Peki butüm verileri satır satır yazdırmak istersek, o zaman da loadObjectListfonksiyonunu kullanarak tüm nesneleri listelememiz gerekiyor;
Kod:
$nesneler = $yenibaglanti->loadObjectList();
Böylece $nesneler dizisi(array)oluşturduk. Bu diziyi bir foreach döngüsü ile yazdıralım;
Kod:
foreach ($nesneler as $nesne) {
echo $nesne->sira;
}
Peki şimdi de sira numarası 5 olan birveriyi çekelim;
Kod:
$yenibaglanti->setQuery("SELECT *FROM JTR WHERE sira='5'");
$nesneler =$yenibaglanti->loadObjectList();
foreach ($nesneler as $nesne) {
echo $nesne->sira;
}
Eğer sql sorgusundaki ilk satırı almakistiyorsak loadRow fonksiyonunu kullanabiliriz. Örneğin;
Kod:
$yenibaglanti->setQuery("SELECT *FROM JTR");
$nesneler = $yenibaglanti->loadRow();
Böylece sql sorgusunun sonucundaki ilksatırı almış olduk.
Yaptığımız sorgudan etkilenen satırsayısını öğrenmek için getAffectedRows fonksiyonunu kullanırız. Örneğin;
Kod:
$yenibaglanti->setQuery("UPDATEJTR SET sira='5' WHERE sira='0'");
echo $yenibaglanti->getAffectedRows();
Bu kodlar bize bu sql sorgusundanetkilenen satır sayısını verecektir.
Çalıştırdığımız sql kodlarını detaylıgörmek için (EXPLAIN),
Kod:
$yenibaglanti->setQuery("SELECT *FROM JTR");
echo $yenibaglanti->explain();
Bu kodlar bize sql sorgusunu ve bu sorguhakkında detaylı bilgiyi verecektir.
Tablodaki ilk satırdaki ilk veriyi çekmekiçin loadResult() fonksiyonunu kullanırız. Örneğin;
Kod:
$yenibaglanti->setQuery("SELECT *FROM JTR WHERE sira='5'");
$nesne = $yenibaglanti->loadResult();
Bu yazımızda temel olarak joomla ile sql sorgularınıçalıştırmayı anlatmaya çalıştım. Daha çok bilgi alabilmek için includesklasörünün içerisindeki database.php dosyasını incelemenizi, sql sorgularıhakkında araştırma yapmanızı öneririm.
Bu yazımızda daha çok fonksiyon öğrenipbunları kullanabilme becerisi kazanacağız. Bu yazımızdan sonra artık ufak tefekmodüller, mambotlar ve bileşenler yazmaya başlayacağız. Böylece isteyenarkadaşlar modül ve bileşenler geliştirerek Joomla Türkiye' ye daha çok katkısağlamış olacaklar. Bu yazımızda includes klasöründe bulunan joomla.phpdosyasını inceleyeceğiz. Joomlanın birçok fonksiyonu ve sınıfını içerisinde barındıranjoomla.php dosyasını tam olarak anlayabilmek tek bir yazıyla mümkün olmadığıiçin sizlere kodlamada en çok kullanılan sınıf ve fonksiyonları anlatacağım.
joomla.php içerisindeki birinci önemdekisınıfımız (class) mainFrame' dir. mainFrame sınıfı içerisindejoomlanın çalışmasını sağlayan birçok fonksiyon barınmaktadır.
Bunlardan bir tanesi Joomla sitemizinsayfa başlığını oluşturan setPageTitle fonksiyonudur.Kullanımı da oldukça basittir. Örneğin bir bileşen yaptık ve sayfamızda obileşenin linkine tıklandığında sayfa başlığının değişmesini istiyoruz. O zamanbileşenimizin ana dosyasının içerisine şöyle bir kod koyduğumuzda sayfabaşlığının değiştiğini göreceksiniz.
Kod:
global $mainframe;
$mainframe->setPageTitle('BileşenimizinAdı');
Aynı şekilde bileşenimizin metaetiketlerini de html içerisine koyabiliriz. Örneğin;
Kod:
$mainframe->addMetaTag('Yapımcı','Soner Ekici');
<head>
...
</head>
etiketleriarasına bir kod koymak istersek addCustomHeadTag fonksiyonu bizim işimizigörecektir. Örneğin bileşenimizin bir css dosyası var ve bunu bileşenimizinlinki tıklandığında html sayfasına ekletmek istiyoruz. O zaman bileşen anadosyasına şöyle bir kod eklersek istediğimizi yapmış olacağız;
Kod:
$html = "
<linkhref=\"http://www.siteadresi.com/components/com_bilesen/css/style.css\"rel=\"stylesheet\" type=\"text/css\" />
";
$mainframe->addCustomHeadTag($html);
Bu kod sayesinde css dosyalarını sadecekodu koyduğumuz sayfada çağırabilir ve böylece css çakışmalarının önüne geçmişoluruz. Ayrıca bu kod ile
<head>
...
</head>
etiketleri arasına gelenbirçok javascript uygulamasının da çakışmasını engelleyerek sitemizin düzgüngörünmesini sağlayabiliriz. Bu kodun bir diğer faydalı tarafı ise sitemizeçağırdığımız dosya sayısını azaltarak sitemizin açılış hızınıarttırabilmemizdir.
Bir diğer faydalı fonksiyon ise sitemizinayar dosyası olan configuration.php dosyasındaki verileri çekebilen getCfg fonksiyonudur.Örnek verecek olursak, sitemizin adresini belirten $mosConfig_live_site vesitemizin dizinini söyleyen $mosConfig_absolute_path değerlerinitek bir global tanımlayarak çekelim.
Normalde şöyle bir kod yazımı hatalıolmamakla birlikte fazla kod yazmış olmamız nedeniyle işimizi uzatır;
Kod:
<?php
global $mosConfig_live_site,$mosConfig_absolute_path;
echo "Sitemizin Adresi:".$mosConfig_live_site;
echo "<br />";
echo "Sitemizin Ana Dizini:".$mosConfig_absolute_path;
?>
Bu kod yerine şöyle birkodlama yapmak daha doğru olacaktır.
Kod:
<?php
global $mainframe;
echo "Sitemizin Adresi:".$mainframe->getCfg('live_site');
echo "<br />";
echo "Sitemizin Ana Dizini:".$mainframe->getCfg('absolute_path');
?>
$mainframe->getCfg() fonksiyonu ileconfiguration.php içerisindeki herhangi bir değeri alabilmek mümkündür.
Şimdi mainFrame sınıfından sonra en çokkullanacağımız sınıf olan mosHTML sınıfını anlatalım. mosHTMLsınıfı içerisindeki fonksiyonlarla html formları oluşturmak oldukça kolayolacaktır.
İlk fonksiyonumuz olan makeOption fonksiyonumuzsayesinde birden çok seçenekli bir form üretebiliriz. Örneğin; bir formbileşeni yapıyoruz ve bu bileşen içerisinde "Okul Durumu" etiketindebir seçeneğimiz olsun ve bu etiket için seçeneklerimizi oluşturalım.
Kod:
//Bir dizi oluşturuyoruz.
$okuldurumu = array();
//Bu dizinin elemanlarını $okuldurumu[]ile oluşturalım.
$okuldurumu[] = mosHTML::makeOption('1','Okur-Yazar Değil');
$okuldurumu[] = mosHTML::makeOption('2','İlkokul');
$okuldurumu[] = mosHTML::makeOption('3','Ortaokul');
$okuldurumu[] = mosHTML::makeOption('4','Lise');
$okuldurumu[] = mosHTML::makeOption('5','Üniversite');
Bu kodlardan da anlaşılacağı üzeremakeOption kullanımı;
mosHTML::makeOption('değer','Gösterilecek Yazı'); şeklindedir.
Formumuzda okul durumunu göstermekistiyorsak selectList fonksiyonuna $okuldurumu dizisini göndermemiz gerekiyor;
Kod:
$okul = mosHTML::selectList($okuldurumu,'okuldurumu', 'class=inputbox', 'value', 'text');
ve son olarak $okul değerini gösterelim.
Kod:
echo "Okul Durumu: ".$okul;
Böylece yaptığımız formumuza bir alanyaptık. Burada hemen selectList fonksiyonundan bahsedelim.
Kullanımı şu şekildedir;
Kod:
mosHTML::selectList('listelenecekdeğerler', 'bu değerlerin formdaki değeri', 'varsa ek html kodları', 'value','text', 'daha önceden bir değer verilmişse o');
Daha önceden bir değer verilmişsefonksiyonda belirtilen yere onu koyarsanız oluşturulan listede o seçilmişolarak (selected) gelecektir.
Bir diğer fonksiyonumuz integerSelectList fonksiyonuolup belli bir değerden başlayıp bir değere kadar belli aralıklarla herhangibir değeri oluşturmamızı sağlar. Örnekle açıklayacak olursak; bir bileşenimizvar ve burada sıralanan linklerimiz olsun. Bu linklerin sayısını değiştirecekbir seçenek oluşturalım. Bu seçenekte ilk rakam 10 olsun ve 100 e kadar 10 ar10 ar artarak gitsin. Kodumuz şu şekilde olacaktır;
Kod:
$siralama = mosHTML::integerSelectList(10,100, 10, 'siralama', 'class=inputbox');
echo $siralama;
Eğer 5 er li artmasını isteseydik;
Kod:
$siralama = mosHTML::integerSelectList(10,100, 5, 'siralama', 'class=inputbox');
echo $siralama;
şeklinde bir kod yazacaktık. AynıselectList fonksiyonunda olduğu gibi integerSelectList fonksiyonunda da
eğer daha önceden seçilmiş bir değer varsaonu seçili olarak getirmek için;
Kod:
$siralama = mosHTML::integerSelectList(10,100, 10, 'siralama', 'class=inputbox', 'seçili değer');
echo $siralama;
şeklinde bir kod kullanmamız gerekecektir.
Bir diğer fonksiyonumuz monthSelectList fonksiyonudur.Bu fonksiyon sayesinde kolayca aylardan oluşan bir liste yapmamız mümkündür.Örneğin;
Kod:
$aylar = mosHTML::monthSelectList('aylar','class=inputbox');
echo $aylar;
Bir diğer fonksiyon olan treeSelectList ilealt dalları olan bir diziyi seçme kutusuna kolayca yerleştirmek mümkündür. Budalların ana dallarının değerlerini sql ile oluştururken 'parent' olarakbelirtmek zorundayız. Fonksiyonun kullanımı buradan sonra oldukça kolaydır.Göstermek istediğimiz dalın id ve ana dal değerini 'parent' olarak bir diziiçerisinde göndermemiz gerekiyor. Bu dizinin adı $dizi olsun. Örneğin;
Kod:
$dalgoster = mosHTML::treeSelectList($dizi, 'orada gosterilen liste öğesinin id numarası', '', 'dallar','class=inputbox', 'value', 'text', 'seçili dal' );
echo $dalgoster;
Bu fonksiyon biraz karışık gibi gelebilir.PHP ve MySQL konusunda biraz uzman olmanız fonksiyonu kullanmanız adına oldukçafaydalı olacaktır.
Bir diğer ve güzel fonksiyon yesnoSelectList fonksiyonudur.Kullanımı oldukça kolay olup html sayfası görüntülendiğinde kişiye 2 seçeneksunar. Örneğin;
Kod:
$evlimisin =mosHTML::yesnoSelectList('evlimisin', 'class=inputbox', 'daha onceden seçilmişdeğer');
echo $evlimisin;
Bu fonksiyonu şu şekilde de kullanabiliriz;
Kod:
$cinsiyet =mosHTML::yesnoSelectList('cinsiyet', 'class=inputbox', 'Erkek', 'Bayan', 'dahaönceden seçilmiş değer');
echo $cinsiyet;
Yukarıdaki fonksiyonu radio olarakgöstermek istersek eğer radioList fonksiyonu bizim işimizigayet iyi görecektir. Fonksiyonun kullanımı şöyledir;
Kod:
//Dizimizi oluşturalım
$medenihal = array(
mosHTML::makeOption( '0', 'Evli' ),
mosHTML::makeOption( '1', 'Bekar' ),
mosHTML::makeOption('2', 'Dul')
);
$durum = mosHTML::radioList($medenihal,'durum', 'class=inputbox', 'daha onceden seçilmiş değer', 'value', 'text');
echo $durum;
Buna benzer bir radio fonksiyonu ile 2seçenekli seçim yaptırabiliriz. Bunun için yesnoRadioList fonksiyonunukullanabiliriz. Örneğin;
Kod:
$evlimisin =mosHTML::yesnoRadioList('evlimisin', 'class=inputbox');
echo $evlimisin;
Veya bunu şöyle de kullanabiliriz;
Kod:
//Kahvaltı yapma zamanı
$kahvaltiyapma =mosHTML::yesnoRadioList('kahvalti', 'class=inputbox', 'daha önceden seçili olandeğer', 'Sabah', 'Aksam');
Bu kod ile kişiye kahvaltıyı sabah mıyoksa akşam mı yaptıgını sorabiliriz. Sadece bir tanesini seçebilecektir.
Bir diğer fonksiyonumuz cleanText fonksiyonuolup bu fonksiyona gönderdiğimiz bir metnin içerisindeki çeşitli html kodlarınıayıklayarak bize temizlenmiş bir metin vermesidir. Örneğin;
Kod:
$text = '<ahref="index.php">Link</a>
<scriptlanguage="text/javascript"></script>
';
Bu metni;
Kod:
$text = mosHTML::cleanText($text);
yapar ve;
Kod:
echo $text;
yaparsanız, yazdığımız kod ile gösterilen kodarasındaki farkı görür, cleanText fonksiyonunun ne yapmaya çalıştığını daha iyianlarsınız.
Yazımıza mosHTML sınıfındaki emailCloaking fonksiyonuile devam ediyoruz. Bu fonksiyon sayesinde sitemizdeki e-posta adreslerini spambotların almasını engelliyoruz. Fonksiyonun kullanımı şu şekildedir;
Kod:
$eposta = mosHTML::emailCloaking('epostaadresi', 'mailto linki olacak mı', 'mail yerine gosterilecek yazı');
Örnek verelim;
Kod:
$eposta = mosHTML::emailCloaking('pisdoktor@joomlaturkiyeorg',1, 'Pisdoktora E-posta Atın');
echo $eposta;
Kullanımı oldukça kolay olan bu fonksiyonile birlikte mosHTML sınıfını bitirmiş olduk.
Gene joomla.php içerisinde olan ve geçmişyazılarımızda çok kısa da olsa değindiğimiz mosGetParam fonksiyonunadetaylı bir bakış atmamızın kodlama oldukça faydalı olacağını düşünüyorum.
mosGetParam fonksiyonu ile çeşitliparametreleri kolayca ve güvenli bir şekilde almanın mümkün olduğunu dahaönceki yazılarımızda belirtmiştik. Şimdi kullanımını inceleyelim;
Kod:
$deger = mosGetParam('istek türü','deger', 'önceden tanımlanmış değer');
istek türleri bilindiği üzere;
$_GET, $_POST,$_REQUEST, $_SERVER, $_COOKIE, $_FILES, $_ENV dir. Şimdi örnek üzerinde kullanımınıaçıklayalım. Bir formumuzdan gelen verileri almak istiyoruz. Formumuzun harekettürü POST olsun. O zaman formun gönderildiği fonksiyonun (veya dosyanın) ilksatırlarına şöyle bir kod yazmamız gönderilen verinin güvenli bir şekildealınmasını sağlayacaktır;
Kod:
$deger = mosGetParam($_POST, 'deger');
Eğer bu değer rakamsal bir değer iseveriyi daha güvenli yapmak için intval kullanabiliriz;
Kod:
$deger = intval(mosGetParam($_POST,'deger'));
Eğer bu değer rakamsal değil ise strvalkullanabiliriz;
Kod:
$deger = strval(mosGetParam($_POST,'deger'));
Kısacası "mosGetParam"formlarımızda güvenlik için muhakkak kullanmamız gereken bir fonksiyondur.
joomla.php içerisindeki bir diğerfonksiyon mosStripslashes fonksiyonu olup bu fonksiyona gönderilen metniniçerisindeki kesme işaretlerini kaldıracaktır. Örneğin;
Kod:
$yazi = "Benim Adım Soner\Ekici";
$yazi = mosStripslashes($yazi);
echo $yazi;
Bu kodlar şöyle görünür; "BenimAdım Soner Ekici"
Başka bir fonksiyon olan mosReadDirectory fonksiyonuile bir dizinin içerisindeki dizinleri listeletebiliriz. Fonksiyonun kullanımışu şekildedir;
Kod:
mosReadDirectory('ana dizin','filtrelenecek sey', 'alt dizinlerin gosterme', 'tam yolu gosterme');
Örneğin joomla adında bir dizinimiz olsunve bunun içerisindeki alt dizinleri listeletelim;
Kod:
$dizinler = mosReadDirectory('joomla', '',1, 0);
$liste = array();
foreach($dizinler as $dizin) {
$liste[] = mosHTML::makeOption($dizin,$dizin);
}
$listele = mosHTML::selectList($liste,'dizin', 'class=inputbox', 'value', 'text');
echo $listele;
Biraz daha detaya inelim ve sitemizin anadizinine uygulayalım ve sadece php uzantılı dosyaları göstertelim;
Kod:
global $mainframe;
$anadizin =$mainframe->GetCfg('absolute_path');
$dizinler = mosReadDirectory($anadizin,'.php', 1, 0);
$liste = array();
foreach($dizinler as $dizin) {
$liste[] = mosHTML::makeOption($dizin,$dizin);
}
$listele = mosHTML::selectList($liste,'dizin', 'class=inputbox', 'value', 'text');
echo $listele;
Joomla içerisinde yönlendirme yapmayayarayan mos******** fonksiyonunu kullanmak oldukça kolaydır.Hemen örnekle açıklayalım;
Kod:
$deger = 0;
if ($deger) {
mos********('index.php', 'Değer 1 olduğuiçin buraya yönlendirildiniz');
}
Yukarıdaki kodlarda $deger = 1; yaparsanızsayfa index.php ye yönlenecek ve size "Değer 1 olduğu için burayayönlendirildiniz" diye bir uyarı mesajı gösterilecektir. Eğer fonksiyonu;
Kod:
mos********('index.php ');
olarak değiştirirseniz size hiçbir uyarımesajı gösterilmeden direkt olarak index.php ye yönlendirileceksiniz.
Bir diğer fonksiyon mosErrorAlert fonksiyonudur.Kullanımı şu şekildedir;
Kod:
mosErrorAlert('Uyarı mesajı', 'mesajonaylanınca yapılacak işlem', 'uyarı modu');
Hemen örnek ile açıklayalım. Bir formumuzvar ve gönderilen veri boş gönderilmişse kişinin form sayfasına geri gitmesinisağlayalım.
Kod:
$deger = intval(mosGetParam($_POST,'deger'));
if (!$deger) {
mosErrorAlert('Eksik bilgi girmişsiniz','window.history.go(-1);', '2');
}
Bunu biraz daha sadeleştirelim ve hatagösterimini farklılaştıralım;
Kod:
if (!$deger) {
mosErrorAlert('Eksik bilgi girmişsiniz');
}
İki kodun arasındaki ve gösterimlerindeki farkıgördüğünüzü varsayıyorum.
<p cla
not:alıntıdır
<p claMutlu olduysanız sevinirim İyi chıpler Hayırlı Joomla Siteler