Joomla Kodlarına Giriş (Bölüm 3)

Real9

Katılımcı Üye
1 Kas 2009
322
0
Bu makalemizde joomla ana dizinindeki index2.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 pdf formatı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;

https://tik.lat/17TIg

Bu adrese baktın ve daha sonra index.php yazan yeri index2.php olarak değiştirip tekrar bakın;

https://tik.lat/xDT7X

Umarım aradaki farkı anlamışsınızdır.

Şimdi gelin hep birlikte index2.php dosyasını açalım ve teker teker kodları incelemeye başlayalım.


define( '_VALID_MOS', 1 );

Bu kod ile index.php de olduğu gibi bu dosyanın ana dosya olduğunu belirtip ilk basit güvenlik önlemimizi alıyoruz.


require( 'globals.php' ); require_once( 'configuration.php' );

Bu kod ile gerekli olan 2 dosyayı index2.php dosyasına aktarıyoruz.


$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 kullanacaksak onun desteğini sağlıyoruz.


require_once( 'includes/joomla.php' );

Bu kod ile sitemizde kullanacağımız temel ve gerekli birçok joomla sınıf (Class olarak geçer) ve fonksiyonunu (Function olarak geçer) aktarıyoruz.


if ($mosConfig_offline == 1) { require( $mosConfig_absolute_path .'/offline.php' ); }

Sitemiz kapalıysa offline.php yi gösteriyoruz.


$_MAMBOTS->loadBotGroup( 'system' );

Sistem grubundaki mambotları aktarıyoruz.


$_MAMBOTS->trigger( 'onStart' );

Başlangıçta çalışacak mambotları çalıştırıyoruz.


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ğimiz joomlanın kendi yapısında olmayan bir SEF bileşeni varsa onu yoksa joomlanın kendi SEF desteğini aktarıyoruz.


require_once( $mosConfig_absolute_path .'/includes/frontend.php' );

Bu kod ile modüllerimizi, sayfamızın ...etiketini ve o sayfadaki bileşeni aktarıyoruz.


$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ğerleri belirliyoruz. 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 mosGetParam ile bir değeri çekmek her zaman güvenlidir. Bunu daha da güvenli hale getirmek için intval ve strval fonksiyonlarını kullanıyoruz. intval integer value olup türkçe karşılığını rakamsal değer olarak çevirebiliriz. strval ise string value olup sıra değeri diye çevirebiliriz. Bu satırlarda dikkat etmemiz gereken diğer bir nokta ki bu nokta bence kodlamacı arkadaşlar dışında diğer arkadaşlara da yararlı 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 kadar işimize yaracağını öğrenmiş olacağız.


$mainframe = new mosMainFrame( $database, $option, '.' ); $mainframe->initSession();

Bu kodlar ile birçok çekirdek fonksiyonunu index2.php içerisine alıyoruz. Oturumu oluşturuyoruz.


$_MAMBOTS->trigger( 'onAfterStart' );

Bu kod ile başlangıçtan hemen sonraki mambotları çalıştırıyoruz.


$my = $mainframe->getUser();

index.php dosyasını anlatırken bahsettiğim gibi siteye gelen kişinin tüm bilgilerini veritabanından alıp hepsini $my değerinin içerisine koyuyoruz.


if ($mosConfig_lang=='') { $mosConfig_lang = 'english'; } include_once( $mosConfig_absolute_path .'/language/' . $mosConfig_lang . '.php' );

Bu kod ile eğer tanımlanmamış ise varsayılan olarak ingilizceyi yok tanımlanmışsa tanımlanan dili sitemize aktarıyoruz.


if ($option == 'login') { $mainframe->login(); mosRedirect('index.php'); } else if ($option == 'logout') { $mainframe->logout(); mosRedirect( 'index.php' ); }

Bu kod ile eğer sitemizi ziyaret 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 mosRedirect fonksiyonu ile sitemizin ana sayfasına yönlendiriyoruz.


if ( $do_pdf == 1 ){ include $mosConfig_absolute_path .'/includes/pdf.php'; exit(); }

Bu kod ile gösterdiğimiz içeriği pdf formatına getirmemize yarayan ve includes klasörü içerisinde bulunan pdf.php dosyasını aktarıyoruz. Bu kodun detaylarını yukarıda söylediğim gibi makalenin sonunda bahsedeceğim.


$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 istatistikleri genel yapılandırmadan açarsanız bu fonksiyon çalışmaya başlar.


$gid = intval( $my->gid );

Bu kodu index.php yi anlatırken uzunca bahsetmiştim. Tekrar söylemek gerekirse siteye gelen kişinin üyelik seviyesini belirliyoruz. 0,1,2 olmak üzere 3 seviyeden oluşur.


$cur_template = $mainframe->getTemplate();

Kullanılan temayı aktarıyoruz.


require_once( $mosConfig_absolute_path . '/editor/editor.php' );

Kullanılan metin editörünü aktarıyoruz.


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 1997 05:00:00 GMT' ); header( 'Last-Modified: ' . gmdate( 'D, d M 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 admin is logged in if (defined( '_ADMIN_OFFLINE' )) { include( $mosConfig_absolute_path .'/offlinebar.php' ); }

Bu uzun kodları index.php yi anlatırken bahsettiğim için geçiyorum.


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.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <?php echo $mainframe->getHead(); ?> <link rel="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 temadan bağımsız olarak gösterir. Yani içeriğin etrafında ne bir modül ne de başka birşey olmaz. Sadece içerik gösterilir.

Şimdi buraya kadar olan yazılarda index2.php içerisindeki kodları anlattım. Gelelim ilk başta bahsettiğimiz 2 güzel değer ve bunu nasıl kullanacağımıza... Birinci değer do_pdf idi. Bu değeri nasıl kullanabiliriz. Mesela yazılardan oluşan bir bileşenimiz var ve bu yazıları üyelere istedikleri zaman pdf formatında göstermek istiyoruz. Yapmanız gereken içeriğin adresinin sonuna &do_pdf=1 şeklinde bir ekleme yapmak. Gerisini joomla kendisi yapıyor. Hatırlarsanız Joomla püf noktaları yazı dizinde bahsettiğim bir &tp=1 eklemesi vardı. Aynı şekilde &do_pdf=1 ile de o sayfadaki içeriği pdf formatında gösterebilirsiniz. Deneme için şöyle birşey yapabiliriz;

https://tik.lat/ulNeA

bu adrese tıklayın. Daha sonra adres satırının sonuna &do_pdf=1 ekleyin ve index.php yi index2.php olarak değiştirin, tekrar deneyin.

https://tik.lat/p69df

Umarım bu örnek sizlere yeterince açıklayıcı olmuştur. Bu özelliği yaptığınız çeşitli bileşenlerde de kullanabiliriz. Tabi ki kullanabilmeniz için includes/pdf.php dosyasının benzerini kendi bileşeniniz için değiştirerek uygun bir yere koymanız ve bileşeninizin içerisine yukarıda bahsettiğim;


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 yi anlatmaya. 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;

https://tik.lat/xOHXD

Bu adresi şöyle değiştirelim;

https://tik.lat/egBXu

ve değişikliği görelim. Bir diğer örneğimizi de şöyle verebiliriz;

https://tik.lat/lc8fQ

Bu adrese bir bakın ve daha sonra adresi şöyle değiştirip tekrar bakın ve aradaki farkı görün.

https://tik.lat/RSley

Umarım bu makalemizdeki do_pdf ve no_html değerini sizlere iyi bir şekilde anlatabilmişimdir. Ayrıca kısa da olsa mosGetParam fonksiyonuna da değinmiş olduk.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.