Joomla! kodlarına kaldığımız yerden devam edelim. Bu yazı disinin son yazısında JFactory sınıfını anlatacağımı söylemiştim. Şimdi kısaca factory.php ve JFactory sınıfını anlatalım.
JFactory, diğer tüm sınıfları tek bir elden kullanmamızı sağlayan oldukça güzel bir sınıftır. Daha önceki yazımda da belirttiğim gibi nesne, veritabanı, uygulama, şablon, oturum v.b işlemleri kolayca kullanmamızı sağlar. Şimdi bu işlemleri örneklerle açıklamaya başlayalım. Konu çok geniş olduğu için kısa kısa anlatmaya özen göstereceğim. Biliyorum ki okumayı sevmeyen bir millet olarak fazla uzun bir yazı sizleri sıkacaktır.
Öncelikle JFactory sınıfının en çok kullanacağımız metodu olan veritabanı ilişkilerini ele alalım. Diyelim ki bir eklentimiz var ve bu eklenti veritabanında bir tablo kullanıyor. JFactory ile veritabanı bağlantısı oluşturmak istersek yazacağımız kod oldukça basittir;
$db =& JFactory::getDBO();
Joomla 1.0.x serisinde hatırlarsanız veritabanı bağlantısı için bir global ($database) tanımlamamız gerekiyordu. Joomla! 1.5 serisi ile birlikte artık yapmamız gereken yukarıdaki kodu kullanmak. Daha sonra yapacağımız işlemimize geçelim.
$db->setQuery("buraya sql sorgumuz geliyor");
$veriler = $db->loadObjectList();
setQuery ve loadObjectList metodlarını JDatabase sınıfını anlatırken detaylı olarak anlatacağım. getDBO metodu JFactory sınıfı içerisindedir ve Joomla! sitemizin veritabanı için bir veritabanı nesnesi oluşturur. Yani JDatabase sınıfından bir nesne ister. getDBO metodu kodları factory.php içerisinde şu şekildedir;
function &getDBO()
{
static $instance;
if (!is_object($instance))
{
//get the debug configuration setting
$conf =& JFactory::getConfig();
$debug = $conf->getValue('config.debug');
$instance = JFactory::_createDBO();
$instance->debug($debug);
}
return $instance;
}
Burada dikkat edeceğiniz nokta _createDBO() fonksiyonudur. Bu fonksiyon da factory.php dosyası içerisinde olup kodlar şu şekildedir;
function &_createDBO()
{
jimport('joomla.database.database');
jimport( 'joomla.database.table' );
$conf =& JFactory::getConfig();
$host = $conf->getValue('config.host');
$user = $conf->getValue('config.user');
$password = $conf->getValue('config.password');
$database = $conf->getValue('config.db');
$prefix = $conf->getValue('config.dbprefix');
$driver = $conf->getValue('config.dbtype');
$debug = $conf->getValue('config.debug');
$options = array ( 'driver' => $driver, 'host' => $host, 'user' => $user, 'password' => $password, 'database' => $database, 'prefix' => $prefix );
$db =& JDatabase::getInstance( $options );
if ( JError::isError($db) ) {
jexit('Database Error: ' . $db->toString() );
}
if ($db->getErrorNum() > 0) {
JError::raiseError(500 , 'JDatabase::getInstance: Could not connect to database <br />' . 'joomla.library:'.$db->getErrorNum().' - '.$db->getErrorMsg() );
}
$db->debug( $debug );
return $db;
}
Bu fonksiyondaki kodları incelersek configuration.php dosyamızdaki veritabanı bilgilerini alıp bunları bir diziye (array) sokup bu diziyi de $options olarak tanımlıyor. Daha sonra da JDatabase sınıfının getInstance fonksiyonu ile veritabanına bağlanıyor.
$db =& JDatabase::getInstance( $options );
Bu özelliği (JDatabase::getInstance) kullanarak Joomla! içerisindeyken başka veritabanlarına bağlantı kurmak mümkün olabilir. Şöyle ki; elimizde başka bir veritabanı bilgileri var. Bu durumda $options için bir dizi oluşturmamız gerekiyor;
$options = array ( 'driver' => '$newdriver', 'host' => $newhost, 'user' => $newuser, 'password' => $newpassword, 'database' => $newdatabase, 'prefix' => $newprefix );
Buradaki değerleri tanımlayalım;
$newdriver = 'mysql';
$newhost = 'localhost';
$newuser = 'diğer veritabanının kullanıcısı';
$newpassword = 'diğer veritabanının parolası';
$newdatabase = 'diğer veritabanının adı';
$newprefix = 'diğer veritabanındaki tabloların ön eki';
Şimdi yeni bir veritabanı bağlantımız var. Bu bağlantı için bir nesne oluşturalım. Yazacağımız kod;
$yeniveritabanı =& JDatabase::getInstance( $options );
Artık yeni veritabanımızdan nesnemizi de aldığımıza göre yeni veritabanımızdaki tablolara işlem yaptırabiliriz.
$yeniveritabanı->setQuery("burada yeni veritabanı için sorgumuz var");
$yeniveritabanı->loadResult();
JFactory sınıfından JDatabase sınıfına geçtik. Ama bu örnekle aslında JFactory sınıfının ve factory.php dosyasının önemini de belirtmiş olduk.
ALINTI
JFactory, diğer tüm sınıfları tek bir elden kullanmamızı sağlayan oldukça güzel bir sınıftır. Daha önceki yazımda da belirttiğim gibi nesne, veritabanı, uygulama, şablon, oturum v.b işlemleri kolayca kullanmamızı sağlar. Şimdi bu işlemleri örneklerle açıklamaya başlayalım. Konu çok geniş olduğu için kısa kısa anlatmaya özen göstereceğim. Biliyorum ki okumayı sevmeyen bir millet olarak fazla uzun bir yazı sizleri sıkacaktır.
Öncelikle JFactory sınıfının en çok kullanacağımız metodu olan veritabanı ilişkilerini ele alalım. Diyelim ki bir eklentimiz var ve bu eklenti veritabanında bir tablo kullanıyor. JFactory ile veritabanı bağlantısı oluşturmak istersek yazacağımız kod oldukça basittir;
$db =& JFactory::getDBO();
Joomla 1.0.x serisinde hatırlarsanız veritabanı bağlantısı için bir global ($database) tanımlamamız gerekiyordu. Joomla! 1.5 serisi ile birlikte artık yapmamız gereken yukarıdaki kodu kullanmak. Daha sonra yapacağımız işlemimize geçelim.
$db->setQuery("buraya sql sorgumuz geliyor");
$veriler = $db->loadObjectList();
setQuery ve loadObjectList metodlarını JDatabase sınıfını anlatırken detaylı olarak anlatacağım. getDBO metodu JFactory sınıfı içerisindedir ve Joomla! sitemizin veritabanı için bir veritabanı nesnesi oluşturur. Yani JDatabase sınıfından bir nesne ister. getDBO metodu kodları factory.php içerisinde şu şekildedir;
function &getDBO()
{
static $instance;
if (!is_object($instance))
{
//get the debug configuration setting
$conf =& JFactory::getConfig();
$debug = $conf->getValue('config.debug');
$instance = JFactory::_createDBO();
$instance->debug($debug);
}
return $instance;
}
Burada dikkat edeceğiniz nokta _createDBO() fonksiyonudur. Bu fonksiyon da factory.php dosyası içerisinde olup kodlar şu şekildedir;
function &_createDBO()
{
jimport('joomla.database.database');
jimport( 'joomla.database.table' );
$conf =& JFactory::getConfig();
$host = $conf->getValue('config.host');
$user = $conf->getValue('config.user');
$password = $conf->getValue('config.password');
$database = $conf->getValue('config.db');
$prefix = $conf->getValue('config.dbprefix');
$driver = $conf->getValue('config.dbtype');
$debug = $conf->getValue('config.debug');
$options = array ( 'driver' => $driver, 'host' => $host, 'user' => $user, 'password' => $password, 'database' => $database, 'prefix' => $prefix );
$db =& JDatabase::getInstance( $options );
if ( JError::isError($db) ) {
jexit('Database Error: ' . $db->toString() );
}
if ($db->getErrorNum() > 0) {
JError::raiseError(500 , 'JDatabase::getInstance: Could not connect to database <br />' . 'joomla.library:'.$db->getErrorNum().' - '.$db->getErrorMsg() );
}
$db->debug( $debug );
return $db;
}
Bu fonksiyondaki kodları incelersek configuration.php dosyamızdaki veritabanı bilgilerini alıp bunları bir diziye (array) sokup bu diziyi de $options olarak tanımlıyor. Daha sonra da JDatabase sınıfının getInstance fonksiyonu ile veritabanına bağlanıyor.
$db =& JDatabase::getInstance( $options );
Bu özelliği (JDatabase::getInstance) kullanarak Joomla! içerisindeyken başka veritabanlarına bağlantı kurmak mümkün olabilir. Şöyle ki; elimizde başka bir veritabanı bilgileri var. Bu durumda $options için bir dizi oluşturmamız gerekiyor;
$options = array ( 'driver' => '$newdriver', 'host' => $newhost, 'user' => $newuser, 'password' => $newpassword, 'database' => $newdatabase, 'prefix' => $newprefix );
Buradaki değerleri tanımlayalım;
$newdriver = 'mysql';
$newhost = 'localhost';
$newuser = 'diğer veritabanının kullanıcısı';
$newpassword = 'diğer veritabanının parolası';
$newdatabase = 'diğer veritabanının adı';
$newprefix = 'diğer veritabanındaki tabloların ön eki';
Şimdi yeni bir veritabanı bağlantımız var. Bu bağlantı için bir nesne oluşturalım. Yazacağımız kod;
$yeniveritabanı =& JDatabase::getInstance( $options );
Artık yeni veritabanımızdan nesnemizi de aldığımıza göre yeni veritabanımızdaki tablolara işlem yaptırabiliriz.
$yeniveritabanı->setQuery("burada yeni veritabanı için sorgumuz var");
$yeniveritabanı->loadResult();
JFactory sınıfından JDatabase sınıfına geçtik. Ama bu örnekle aslında JFactory sınıfının ve factory.php dosyasının önemini de belirtmiş olduk.
ALINTI