Joomla! 1.5 için basit bir bileşen oluşturmak - Bölüm 1[Devamı İçeride]

The Cry

Kıdemli Üye
19 Eki 2007
3,111
10
"-Her Yerden-"
Joomla! 1.5 MVC yapısını kısaca anlattıktan sonra basit bir bileşenin kodlarını görmek, bileşen yapımına geçmeden önce yapılacak en iyi şeydir.

Joomla! 1.5 için hazırlayacağımız basit bileşenimizde temel olarak aşağıdaki beş dosyaya ihtiyacımız olacak.

* site/merhaba.php - bu bileşenimizin ana giriş noktasını oluşturuyor
* site/controller.php - bu dosya bizim temel controller ifadelerimizi içeriyor
* site/views/merhaba/view.html.php - Bu dosya gerekli verileri tutacak ve şablon içerisine gönderecek
* site/views/merhaba/tmpl/default.php - Bileşeni göstermek için şablon dosyası
* merhaba.xml - Joomla! ya bileşenimizi nasıl kuracağını söyleyen bir XML (hareket) dosyası

Öncelikle bilmemiz gereken temel kurallardan bahsedelim.

- Oluşturacağımız bileşenin adı içerisinde alt çizgi, nokta, virgül v.b işaretler ve türkçe karakterler kullanmaktan kaçınmamız gerekiyor. Mümkünse kısa bir isim seçmek hem kodlamada hem de yüklemede sorun olmaması adına en iyi yoldur.

- Bileşenimizin adı ne olacaksa (bu örnekte com_merhaba) bileşenimizin ana giriş noktasındaki php dosyasının adı da o olmalıdır. Aksi halde bileşenimiz çalışmaz. Genel prensip olarak bileşenimizin ismi ne ise kurulum dosyamızın ve ana giriş noktasındaki dosyamızın adı da odur.

- Bileşenimizde kullanacağımız sınıfların isimleri genelde {Bileşenadı}{Controller}{Controlleradı} veya {Bileşenadı}{View}{Viewadı} şeklinde olmalıdır. Bu sayede ilerleyen zamanlarda işimiz kolaylaşacak ve sınıflar karışmayacaktır.

- Joomla daima giriş için tek bir dosya kullanır. Örneğin; site uygulamaları için index.php, yönetim sayfası uygulamaları için administrator/index.php. Ardından URL adresindeki 'option' seçeneğine bakarak uygun bileşeni çağırır. Dolayısıyla bizim şimdi yapacağımız bileşenimizin giriş adresi;

Kod:
index.php?option=com_merhaba&view=merhaba
olacaktır.

Bu adres satırı bizim bileşenimizin ana giriş dosyasını yani components/com_merhaba/merhaba.php dosyasını çağıracaktır. Hazırlayacağımız ilk dosya ana giriş dosyamız site/merhaba.php olacaktır.

merhaba.php:
Kod:
<?php
// Direkt erişimi engelleyelim
defined( '_JEXEC' ) or die( 'Restricted access' );
 
// Temel controller sınıfını alalım
require_once( JPATH_COMPONENT.DS.'controller.php' );
 
// İstendiyse özel controller sınıfını alalım
if($controller = JRequest::getVar('controller')) {
    $path = JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php';
    if (file_exists($path)) {
        require_once $path;
    } else {
        $controller = '';
    }
}
// Bileşenimizin controller sınıfını oluşturalım
$classname    = 'MerhabaController'.$controller;
$controller   = new $classname( );
 
// Task isteğini uygulayalım
$controller->execute( JRequest::getVar( 'task' ) );
 
// Controller tarafından istendiyse geriye dönüş sağlayalım
$controller->redirect();


* JPATH_COMPONENT değeri bileşenimizin varsayılan yolunu gösterir,
components/com_merhaba. Eğer kullanmak istersek JPATH_COMPONENT_SITE
bileşenimizin site ön yüzü için veya JPATH_COMPONENT_ADMINISTRATOR
bileşenimizin yönetim bölümü için varsayılan yolu olarak tanımlanmıştır.



* DS dizin ayracıdır. '/' veya '\'. Farklı sunucular arasındaki farklılıklardan etkilenmemek adına bunu kullanırız.



* Temel controller.php dosyamızı aldıktan sonra eğer bileşenimizin
içerisinde başka controller sınıfları varsa onu alıyoruz. Örneğin
MerhabaControllerController1 adında yeni bir controller sınıfı
oluşturduğumuzda yeni sınıfımızın bulunacağı dosya
?com_merhaba/controllers/controller1.php? olacaktır. Bunu bileşenimizi
geliştirirken yeni controller sınıfları oluşturduğumuzda daha iyi
anlayacaksınız.



* JRequest::getVar() fonksiyonu URL adresi veya POST fonksiyonu
içerisindeki değerleri alır. Yukarıdaki örnekte 'task' değerini alıyor.



* Controller oluşturulduktan sonra execute komutuyla bileşenimizi
çalıştırıyoruz. Böylece index.php?option=com_merhaba&task=birdeger
gibi bir adres elde ediyoruz. Eğer task değeri tanımlanmamışsa
varsayılan olarak 'display' taskı uygulanır.



* Bileşenimizde herhangi bir işlem gerçekleştirdiğimizde (örneğin bir
kayıt işlemi) controllerdan geriye dönüş sağlamak için redirect();
fonksiyonunu kullandık.



* Dikkat ederseniz kodlamanın sonunda ?> etiketi ile PHP kodumuzu
kapatmadık. Buradaki amacımız ingilizce 'whitespace' denilen ölü
boşlukların oluşmasının önüne geçmektir. Bundan sonra hazırlayacağımız
tüm php uzantılı dosyalarda PHP etiketini kapatmayacağım.



Şimdi bileşenimizin MerhabaController sınıfını içeren controller.php
dosyasını hazırlayalım. Bileşenimiz sadece tek bir task değerinden
oluşacağı ve herhangi bir veri işlemi olmayacağı için hazırlayacağımız
sınıf oldukça basit olacaktır.



controller.php:

Kod:
<?php
// Direkt erişimi engelleyelim
defined( '_JEXEC' ) or die( 'Restricted access' );
 
jimport('joomla.application.component.controller');
 
/**
 * Merhaba Component Controller
 */
class MerhabaController extends JController
{
    /**
     * Gösterim sağlayan metodumuz
     */
    function display()
    {
        parent::display();
    }
}
JController daima display() taskını kayıt eder. JController::display() metodu ise istekle gelen view değerini belirler.



Şimdi bileşenimizin gösterilecek verisini tutan ve şablona gönderen view
kısmını yapalım. Bunun için oluşturacağımız dosyamız
site/views/merhaba/view.html.php dosyası olacaktır.



view.html.php:
Kod:
<?php
// Direkt erişimi engelleyelim
defined( '_JEXEC' ) or die( 'Restricted access' );
 
jimport( 'joomla.application.component.view');
 
/**
 * Merhaba bileşenimiz için HTML View sınıfı
 */
 
class MerhabaViewMerhaba extends JView
{
    function display($tpl = null)
    {
        $karsilama = "Cümleten Merhaba!";
        $this->assignRef( 'karsilama', $karsilama );
        parent::display($tpl);
    }
}
Verilerimizi şablonumuza gönderilmek için assignRef() fonksiyonunu kullanıyoruz.



Şimdi şablonumuzu oluşturalım. Bileşenimizde tek bir task olduğu için
sadece tek bir şablon dosyamız olacak. Oluşturacağımız yer
site/views/merhaba/tmpl/default.php şeklinde olacak.



default.php:
Kod:
<?php
// Direkt erişimi engelleyelim
defined('_JEXEC') or die('Restricted access'); ?>

<h1><?php echo $this->karsilama; ?></h1>
Bileşenimizi basitçe oluşturduktan sonra kurulum dosyası olan
merhaba.xml dosyamızı oluşturalım. Güvenlik sebebiyle her dizine boş bir
'index.html' koymakta fayda vardır.



merhaba.xml:
Kod:
< ?xml version="1.0" encoding="utf-8"?>
<install type="component" version="1.5.0">
 <name>Merhaba</name>
 <!-- Aşağıdaki elementler isteğe bağlıdır. Bileşen hakkında bilgi verirler. -->
 <creationdate>2010-02-10</creationdate>
 <author>Soner Ekici</author>
 <authoremail>[email protected]</authoremail>
 <authorurl>http://www.orneksite.com</authorurl>
 <copyright>Copyright Bilgisi</copyright>
 <license>Lisans Bilgisi</license>
 <!--  Sürüm bilgisi veritabanındaki components tablosuna kaydedilecektir -->
 <version>1.0</version>
 <!-- Açıklama isteğe bağlıdır -->
 <description>Bileşenin açıklaması...</description>
 
 <!-- Site Ana Dosya Kopyalama Bölümü -->
 <!-- folder etiketi hakkında: Bu etiket bileşenimizin paket dosyası içerisinde
neredeki dosyaların sitemizin ön yüzüne aktarılacağını tanımlar. Bizim bileşen
örneğimizde paketimizdeki /site/ klasöründen aktarılacak -->
 <files folder="site">
  <filename>controller.php</filename>
  <filename>merhaba.php</filename>
  <filename>index.html</filename>
  <filename>views/index.html</filename>
  <filename>views/merhaba/index.html</filename>
  <filename>views/merhaba/view.html.php</filename>
  <filename>views/merhaba/tmpl/default.php</filename>
  <filename>views/merhaba/tmpl/index.html</filename>
 </files>
 
 <administration>
  <!-- Yönetim Menüsü Bölümü -->
  <menu>Merhaba!</menu>
 
  <!-- Yönetim Ana Dosya Kopyalama Bölümü -->
  <files folder="admin">
   <filename>merhaba.php</filename>
   <filename>index.html</filename>
  </files>
 
 </administration>
</install>

Devam Bölüm 2
 
Son düzenleme:

The Cry

Kıdemli Üye
19 Eki 2007
3,111
10
"-Her Yerden-"
Joomla! 1.5 için basit bir bileşen oluşturmak - Bölüm 2

Joomla! 1.5 için basit bir bileşen oluşturmak isimli dersimize kaldığımız yerden devam edelim.

Joomla! 1.5 ile yaptığımız basit bileşenimizi geliştirmeye devam edelim. Bu yazımda bileşenimize bir model ekleyeceğiz. Yaptığımız ilk bileşen Joomla! nın MVC (model-view-controller) yapısına uymuyordu, çünkü sadece controller ve view kısımlarından oluşmuştu. Şimdi ise bileşenimize model kısmını da ekleyerek MVC yapısına uygun hale getireceğiz.


Joomla! çekirdek çerçevesi içerisinde modeller için isim tanımlası yaparken sınıf ismi, bileşenin ismi ile başlar, daha sonra model ve ondan sonra da sınıfın ismi gelir. Bizim bu bileşen örneğimizde model ismi bu durumda "MerhabaModelMerhaba" şeklinde olacaktır. Modelimizin tek bir hareket seçeneği var o da karşılama mesajını getirmek. Bu metodumuza karsilamaGetir() diyeceğiz. Bu metodumuz bize cevap olarak "Cümleten Merhaba" yazısını getirecek. Oluşturacağımız dosya site/models/merhaba.php olacaktır.


merhaba.php:
Kod:
<?php
// Direkt erişimi engelleyelim
defined( '_JEXEC' ) or die( 'Restricted access' );
 
jimport( 'joomla.application.component.model' );
 
/**
 * Merhaba Modelimiz
 */
class MerhabaModelMerhaba extends JModel
{
    /**
    * Karşılamayı alalım
    */
    function karsilamaGetir()
    {
        return 'Cümleten Merhaba';
    }
}


Koddaki jimport fonksiyonunu geçmiş yazılarımda bahsetmiştim. jimport fonksiyonu ile JModel sınıfını alıyoruz.


Şimdi bileşenimize model eklediğimize göre view yapısında bazı değişiklikler yapmamız gerekiyor. Joomla! çerçeve yapısının bir özelliği olarak aynı isimdeki model ile view sınıfları controller tarafından otomatik olarak birleştirilir. Yani model içerisindeki veriler otomatik olarak view kısmına gönderilir. Bunu sağlayan da JView::getModel() metodumuzdur. Eğer model ve view sınıfları farklıysa bu durumda farklı yollara başvurmamız gerekiyor. Bu konuyu daha sonra anlatacağım.


İlk yaptığımız bileşenimizdeki view.html.php dosyamızda şöyle bir satır vardı;



Koddaki jimport fonksiyonunu geçmiş yazılarımda bahsetmiştim. jimport fonksiyonu ile JModel sınıfını alıyoruz.

Şimdi bileşenimize model eklediğimize göre view yapısında bazı değişiklikler yapmamız gerekiyor. Joomla! çerçeve yapısının bir özelliği olarak aynı isimdeki model ile view sınıfları controller tarafından otomatik olarak birleştirilir. Yani model içerisindeki veriler otomatik olarak view kısmına gönderilir. Bunu sağlayan da JView::getModel() metodumuzdur. Eğer model ve view sınıfları farklıysa bu durumda farklı yollara başvurmamız gerekiyor. Bu konuyu daha sonra anlatacağım.

İlk yaptığımız bileşenimizdeki view.html.php dosyamızda şöyle bir satır vardı;

Kod:
$karsilama = "Cümleten Merhaba!";

Bu satırı şöyle değiştiriyoruz;
$model = &$this->getModel();
$karsilama= $model->karsilamaGetir();

Sonuçta view.html.php dosyamız şöyle oluyor;
Kod:
[B]<?php
// Direkt erişimi engelleyelim
 
defined( '_JEXEC' ) or die( 'Restricted access' );
 
jimport( 'joomla.application.component.view');
 
/**
 * Merhaba bileşenimiz için HTML View sınıfı  
 */
 
class MerhabaViewMerhaba extends JView
{
    function display($tpl = null)
    {
        $model = &$this->getModel();
        $karsilama = $model->karsilamaGetir();
        $this->assignRef( 'karsilama', $karsilama );
 
        parent::display($tpl);
    }
}[/B]


merhaba.xml dosyamızı yeni eklediğimiz models/merhaba.php dosyasını da ekleyerek güncelliyoruz.

merhaba.xml:

Kod:
<?xml version="1.0" encoding="utf-8"?>
<install type="component" version="1.5.0">
 <name>Merhaba</name>
 <!-- Aşağıdaki elementler isteğe bağlıdır. Bileşen hakkında bilgi verirler. -->
 <creationdate>2010-02-10</creationdate>
 <author>Soner Ekici</author>
 <authoremail>[email protected]</authoremail>
 <authorurl>http://www.orneksite.com</authorurl>
 <copyright>Copyright Bilgisi</copyright>
 <license>Lisans Bilgisi</license>
 <!--  Sürüm bilgisi veritabanındaki components tablosuna kaydedilecektir -->
 <version>1.1</version>
 <!-- Açıklama isteğe bağlıdır -->
 <description>Bileşenin açıklaması...</description>
 
 <!-- Site Ana Dosya Kopyalama Bölümü -->
 <!-- folder etiketi hakkında: Bu etiket bileşenimizin paket dosyası içerisinde
neredeki dosyaların sitemizin ön yüzüne aktarılacağını tanımlar. Bizim bileşen
örneğimizde paketimizdeki /site/ klasöründen aktarılacak -->
 <files folder="site">
  <filename>controller.php</filename>
  <filename>merhaba.php</filename>
  <filename>index.html</filename>
  <filename>views/index.html</filename>
  <filename>views/merhaba/index.html</filename>
  <filename>views/merhaba/view.html.php</filename>
  <filename>views/merhaba/tmpl/default.php</filename>
  <filename>views/merhaba/tmpl/index.html</filename>
  <filename>models/merhaba.php</filename>
  <filename>models/index.html</filename>
 </files>
 
 <administration>
  <!-- Yönetim Menüsü Bölümü -->
  <menu>Merhaba!</menu>
 
  <!-- Yönetim Ana Dosya Kopyalama Bölümü -->
  <files folder="admin">
   <filename>merhaba.php</filename>
   <filename>index.html</filename>
  </files>
 
 </administration>
</install>


Artık elimizde Joomla! MVC yapısına uygun basit bir bileşenimiz var.

Devam Bölüm 3
 
Son düzenleme:

The Cry

Kıdemli Üye
19 Eki 2007
3,111
10
"-Her Yerden-"
Joomla! 1.5 için basit bir bileşen oluşturmak - Bölüm 3

Joomla! 1.5 ile basit bir bileşen hazırlamak yazı dizimizin bu kısmında en son hazırladığımız bileşenimizi veritabanıyla ilişkilendirip artık verilerimizi veritabanımızdaki bileşenimizin tablosundan alacağız. Baştan söylemek gerekirse eğer SQL konusunda bilginiz yoksa öncelikle MySQL hakkında bilgi sahibi olmanızı tavsiye ederim. Şimdi bileşenimizin model kısmı ile çalışıp veriyi kodlama ile değil de veritabanından alacağız. Bu yazımızda ayrıca Joomla! 1.5 ile veritabanı ilişkisini sağlayan JDatabase sınıfını da biraz görmüş olacağız.

Modelimiz hatırlarsanız karsilamaGetir() metoduyla kodladığımız bir veriyi gönderiyordu. Şimdi ise verileri Joomla! sitemizin veritabanından alacağız. Öncelikle veritabanımızla bağlantı sağlamamız gerekiyor. Bunun için;

Kod:
$db =& JFactory::getDBO();
kodunu kullanacağız. JFactory sınıfı sabit bir sınıf olup içerisinde
Joomla! ile ilgili birçok nesneyi kolayca almamızı sağlayan metodlar
vardır. getDBO() fonksiyonu ise (ingilizce açılımı get Database Object)
veritabanı nesnesini almak anlamına geliyor.



Veritabanı nesnemizi aldığımıza göre yapacağımız 2 işlem var.

1. si veritabanımızdaki tablomuza ait sql sorgusunu oluşturmak.

2. si oluşturduğumuz sorgudan istediğimiz veriyi almak.



Bunun için karsilamaGetir() fonksiyonumuzu şu şekilde değiştiriyoruz.

Kod:
function karsilamaGetir()
{
   $db =& JFactory::getDBO();
 
   $query = 'SELECT karsilama FROM #__merhaba';
   $db->setQuery( $query );
   $karsilama = $db->loadResult();
 
   return $karsilama;
}
#__merhaba veritabanımızdaki tablomuzun adı olup #__ kısmı ise Joomla!
yı kurarken kullandığımız tablo önekini simgelemektedir. setQuery()
fonksiyonu ile sorgumuzu çalıştırıyoruz. loadResult() fonksiyonu ile de
tablomuzun ilk satırındaki ilk alanı alıyoruz. JDatabase sınıfındaki
daha fazla load fonksiyonu için ilerleyen yazılarımı takip etmenizi
tavsiye ederim.



Bileşenimizin kullanacağı veritabanı tablolarını oluşturmaya başlayalım.
İki farklı sql sorgusu oluşturmamız gerekiyor. Birincisi bileşeni
yüklerken ikincisi ise bileşeni kaldırırken kullanılacak olan sql
sorgularımızı .sql uzantılı dosyalara kaydetmemiz gerekiyor. İlk önce

Kod:
DROP TABLE IF EXISTS `#__merhaba`;
 
CREATE TABLE `#__merhaba` (
  `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `karsilama` VARCHAR(25) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
 
INSERT INTO `#__merhaba` (`karsilama`) VALUES ('Cümleten Merhaba'), ('Selamun Aleykum'), ('Have a good day');
yükleme sorgusunu oluşturalım;



install.sql:

Şimdi de kaldırma sorgusunu oluşturalım;



uninstall.sql:
Kod:
DROP TABLE IF EXISTS `#__merhaba`;
Yeni eklediğimiz dosyalar ile birlikte merhaba.xml dosyamızı tekrar düzenleyelim.



merhaba.xml:
Kod:
< ?xml version="1.0" encoding="utf-8"?>
<install type="component" version="1.5.0">
 <name>Merhaba</name>
 <!-- Aşağıdaki elementler isteğe bağlıdır. Bileşen hakkında bilgi verirler. -->
 <creationdate>2010-02-10</creationdate>
 <author>Soner Ekici</author>
 <authoremail>[email protected]</authoremail>
 <authorurl>http://www.orneksite.com</authorurl>
 <copyright>Copyright Bilgisi</copyright>
 <license>Lisans Bilgisi</license>
 <!--  Sürüm bilgisi veritabanındaki components tablosuna kaydedilecektir -->
 <version>1.2</version>
 <!-- Açıklama isteğe bağlıdır -->
 <description>Bileşenin açıklaması...</description>
 
 <!-- Site Ana Dosya Kopyalama Bölümü -->
 <!-- folder etiketi hakkında: Bu etiket bileşenimizin paket dosyası içerisinde
neredeki dosyaların sitemizin ön yüzüne aktarılacağını tanımlar. Bizim bileşen
örneğimizde paketimizdeki /site/ klasöründen aktarılacak -->
 <files folder="site">
  <filename>controller.php</filename>
  <filename>merhaba.php</filename>
  <filename>index.html</filename>
  <filename>views/index.html</filename>
  <filename>views/merhaba/index.html</filename>
  <filename>views/merhaba/view.html.php</filename>
  <filename>views/merhaba/tmpl/default.php</filename>
  <filename>views/merhaba/tmpl/index.html</filename>
  <filename>models/merhaba.php</filename>
  <filename>models/index.html</filename>
 </files>
<install>
  <sql>
    <file charset="utf8" driver="mysql">install.sql</file>
  </sql>
 </install>
 <uninstall>
  <sql>
    <file charset="utf8" driver="mysql">uninstall.sql</file>
  </sql>
 </uninstall>
 <administration>
  <!-- Yönetim Menüsü Bölümü -->
  <menu>Merhaba!</menu>
   <!-- Yönetim Ana Dosya Kopyalama Bölümü -->
  <files folder="admin">
   <filename>merhaba.php</filename>
   <filename>index.html</filename>
   <filename>install.sql</filename>
   <filename>uninstall.sql</filename>
  </files>
 </administration>
</install>
Artık bileşenimizi veritabanımızla ilişkilendirdik. Böylece Joomla!
çerçeve MVC sınıfları ve JDatabase sınıfı ile çalışan bir bileşenimiz
oldu.

Devam Bölüm 4
 
Son düzenleme:

The Cry

Kıdemli Üye
19 Eki 2007
3,111
10
"-Her Yerden-"
Joomla! 1.5 için basit bir bileşen oluşturmak - Bölüm 4

Joomla! 1.5 için hazırladığımız bileşenimizin ön yüzünü tamamladık. Gelelim bileşenimizin yönetim bölümünü hazırlamaya. Yönetim bölümü de site bölümü gibi merhaba.php dosyası ile başlayacak. Yani yönetim bölümü ana giriş noktamız merhaba.php olacak. Dolayısıyla hazırlayacağımız controller sınıfının tanımlamasını merhaba.php dosyasında yapacağız.

merhaba.php:
Kod:
<?php
// Direkt erişimi engelleyelim
 
defined( '_JEXEC' ) or die( 'Restricted access' );
 
// Temel controller sınıfını alalım
require_once( JPATH_COMPONENT.DS.'controller.php' );
 
// İstendiyse özel controller sınıfını alalım
if($controller = JRequest::getWord('controller')) {
    $path = JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php';
    if (file_exists($path)) {
        require_once $path;
    } else {
        $controller = '';
    }
}
 
// Bileşenimiz için controller oluşturalım
$classname    = 'MerhabalarController'.$controller;
$controller   = new $classname( );
 
// Task isteğini uygulayalım
$controller->execute( JRequest::getVar( 'task' ) );
 
// Controller tarafından istendiyse geriye dönüş sağlayalım
$controller->redirect();
controller.php:
Kod:
<?php
// Direkt erişimi engelleyelim
defined( '_JEXEC' ) or die( 'Restricted access' );
 
jimport('joomla.application.component.controller');
 
/**
 * Merhaba bileşeni Controller
 */
class MerhabalarController extends JController
{
    /**
     * Gösterim sağlayan metodumuz
     */
    function display()
    {
        parent::display();
    }
}
view ve controller sınıflarımız bundan sonra "Merhaba" değil "Merhabalar" ile başlayacak. Bunun sebebi; artık veritabanımızdaki karşılama metinlerinin tümünü liste halinde alacak olmamız. Öncelikle veritabanından verileri alacak olan modelimizi oluşturalım. Veritabanındanki verileri almak için getData() fonksiyonunu kullanacağız. JModel sınıfı korumalı bir sınıf olan _getList() metodu ile veritabanındaki verilerin bir listesini alır. Bunu bir sorgu haline getirmek için de _buildQuery() metodunu kullanır. O halde hazırlayacağımız model kodları şöyle olacaktır;

admin/models/merhabalar.php:
Kod:
<?php
// Direkt erişimi engelleyelim
defined('_JEXEC') or die();
 
jimport( 'joomla.application.component.model' );
 
/**
 * Merhabalar Modelimiz
 */
class MerhabalarModelMerhabalar extends JModel
{
    /**
     * Merhabalar data dizisi
     */
    var $_data;
 
    /**
     * Sorguyu oluşturalım
     */
    function _buildQuery()
    {
        $query = ' SELECT * '
            . ' FROM #__merhaba '
        ;
        return $query;
    }
 
    /**
     * Verileri alalım
     */
    function getData()
    {
        // veri daha önceden oluşturulmadıysa veriyi alalım
        if (empty( $this->_data ))
        {
            $query = $this->_buildQuery();
            $this->_data = $this->_getList( $query );
        }
 
        return $this->_data;
    }
}
Metodumuz get ile başladığı için (getData()), JView sınıfının get() fonksiyonuna verilerimiz otomatik olarak aktarıldı. Şimdi tek yapmamız gereken bileşenimizin view kısmını oluşturmak.

admin/views/merhabalar/view.html.php:
Kod:
<?php
// Direkt erişimi engelleyelim
defined('_JEXEC') or die();
 
jimport( 'joomla.application.component.view' );
 
/**
 * Merhabalar View sınıfı
 */
class MerhabalarViewMerhabalar extends JView
{
    /**
     * Merhabalar view gösterim metodumuz
     **/
    function display($tpl = null)
    {
        JToolBarHelper::title( JText::_( 'Merhaba Yönetimi' ), 'generic.png' );
        JToolBarHelper::deleteList();
        JToolBarHelper::editListX();
        JToolBarHelper::addNewX();
 
        // Modelden verileri alalım
        $items =& $this->get( 'Data');
        $this->assignRef( 'items', $items );
        parent::display($tpl);
    }
}
Şimdi de şablonumuzu hazırlayalım.

admin/views/merhabalar/tmpl/default.php:
Kod:
<?php defined('_JEXEC') or die('Restricted access'); ?>
<form action="index.php" method="post" name="adminForm">
<div id="editcell">
    <table class="adminlist">
    <thead>
        <tr>
            <th width="5">
                <?php echo JText::_( 'ID' ); ?>
            </th>
            <th>
                <?php echo JText::_( 'Karsilama' ); ?>
            </th>
        </tr>            
    </thead>
    <?php
    $k = 0;
    for ($i=0, $n=count( $this->items ); $i < $n; $i++)
    {
        $row =& $this->items[$i];
        ?>
        <tr class="<?php echo "row$k"; ?>">
            <td>
                <?php echo $row->id; ?>
            </td>
            <td>
                <?php echo $row->karsilama; ?>
            </td>
        </tr>
        <?php
        $k = 1 - $k;
    }
    ?>
    </table>
</div>
 
<input type="hidden" name="option" value="com_merhaba" />
<input type="hidden" name="task" value="" />
<input type="hidden" name="boxchecked" value="0" />
<input type="hidden" name="controller" value="merhaba" />

</form>
Şimdi hazırladığımız tüm yeni dosyalarla birlikte merhaba.xml dosyamızı güncelleyerek bileşenimizi paket haline getirelim.

merhaba.xml:
Kod:
<?xml version="1.0" encoding="utf-8"?>
<install type="component" version="1.5.0">
 <name>Merhaba</name>
 <!-- Aşağıdaki elementler isteğe bağlıdır. Bileşen hakkında bilgi verirler. -->
 <creationdate>2010-02-10</creationdate>
 <author>Soner Ekici</author>
 <authoremail>[email protected]</authoremail>
 <authorurl>http://www.orneksite.com</authorurl>
 <copyright>Copyright Bilgisi</copyright>
 <license>Lisans Bilgisi</license>
 <!--  Sürüm bilgisi veritabanındaki components tablosuna kaydedilecektir -->
 <version>1.3</version>
 <!-- Açıklama isteğe bağlıdır -->
 <description>Bileşenin açıklaması...</description>
 <!-- Site Ana Dosya Kopyalama Bölümü -->
 <!-- folder etiketi hakkında: Bu etiket bileşenimizin paket dosyası içerisinde
neredeki dosyaların sitemizin ön yüzüne aktarılacağını tanımlar. Bizim bileşen
örneğimizde paketimizdeki /site/ klasöründen aktarılacak -->
 <files folder="site">
  <filename>controller.php</filename>
  <filename>merhaba.php</filename>
  <filename>index.html</filename>
  <filename>views/index.html</filename>
  <filename>views/merhaba/index.html</filename>
  <filename>views/merhaba/view.html.php</filename>
  <filename>views/merhaba/tmpl/default.php</filename>
  <filename>views/merhaba/tmpl/index.html</filename>
  <filename>models/merhaba.php</filename>
  <filename>models/index.html</filename>
 </files>
<install>
  <sql>
    <file charset="utf8" driver="mysql">install.sql</file>
  </sql>
 </install>
 <uninstall>
  <sql>
    <file charset="utf8" driver="mysql">uninstall.sql</file>
  </sql>
 </uninstall>
 <administration>
  <!-- Yönetim Menüsü Bölümü -->
  <menu>Merhaba!</menu>
   <!-- Yönetim Ana Dosya Kopyalama Bölümü -->
  <files folder="admin">
   <filename>merhaba.php</filename>
   <filename>index.html</filename>
   <filename>install.sql</filename>
   <filename>controller.php</filename>
   <filename>views/index.html</filename>
   <filename>views/merhabalar/index.html</filename>
   <filename>views/merhabalar/view.html.php</filename>
   <filename>views/merhabalar/tmpl/index.html</filename>
   <filename>views/merhabalar/tmpl/default.php</filename>
   <filename>models/merhabalar.php</filename>
   <filename>models/index.html</filename>
  </files>
  </administration>
</install>

Devam Bölüm 5
 
Son düzenleme:

The Cry

Kıdemli Üye
19 Eki 2007
3,111
10
"-Her Yerden-"
Joomla! 1.5 için basit bir bileşen oluşturmak - Bölüm 5

Joomla! 1.5 için oluşturduğumuz basit bileşenimizi kodlamanın sonuna geldik. Bu son aşamayla birlikte elimizde oldukça basit bir MVC yapısına uygun bileşenimiz olacak.

Son yazımda bileşenimizin yönetim bölümüne veritabanındaki karşılama mesajlarını listeleyen bir sayfa oluşturmuş ve ayrıca araç çubuğundaki butonlarımızı belirlemiştik. Şimdi bu butonlara işlevsellik kazandırmak için bileşenimizin yönetim bölümü dosyaları üzerinde değişiklikler yapalım. Öncelikle hazırladığımız default.php şablon dosyamızda bazı değişiklikler yapalım. default.php dosyamızda şöyle bir tablo alanı oluşturmuştuk;

Kod:
<thead>
        <tr>
            <th width="5">
                <?php echo JText::_( 'ID' ); ?>
            </th>
            <th>
                <?php echo JText::_( 'Karsilama' ); ?>
            </th>
        </tr>            
    </thead>
Bu alanı şu hale getiriyoruz;,
Kod:
<thead>
        <tr>
            <th width="5">
                <?php echo JText::_( 'ID' ); ?>
            </th>
            <th width="20">
                <input type="checkbox" name="toggle" value="" onclick="checkAll(<?php echo count( $this-/>items ); ?>);" />
            </th>
            <th>
                <?php echo JText::_( 'Karsilama' ); ?>
            </th>
        </tr>            
    </thead>
Burada eklediğimiz kodlar;
Kod:
<th width="20">
                <input type="checkbox" name="toggle" value="" onclick="checkAll(<?php echo count( $this-/>items ); ?>);" />
            </th>
Daha sonra aynı default.php içerisinde;

Kod:
$row =& $this->items[$i];
olan kısmı şöyle değiştiriyoruz;

Kod:
$row        = &$this->items[$i];
        $checked    = JHTML::_('grid.id',   $i, $row->id );
        $link       = JRoute::_( 'index.php?option=com_merhaba&controller=merhaba&task=edit&cid[]='. $row->id );
ve hemen altında;

Kod:
<tr class="<?php echo "row$k"; ?>">
            <td>
                <?php echo $row->id; ?>
            </td>
            <td>
                <?php echo $row->karsilama; ?>
            </td>
        </tr>
olan kodları şöyle değiştiriyoruz;
PHP:
<tr class="<?php echo "row$k"; ?>">
            <td>
                <?php echo $row->id; ?>
            </td>
            <td>
                <?php echo $checked; ?>
            </td>
            <td>
                 <a href="<?php echo $link; ?>"><?php echo $row->karsilama; ?></a>
            </td>
        </tr>
Böylece merhabalar listesinden bir merhaba alanını veya tümünü seçmek için bir checkbox oluşturmuş olduk. default.php dosyasının son hali şu şekilde oldu;

default.php:
PHP:
<?php defined('_JEXEC') or die('Restricted access'); ?>
<form action="index.php" method="post" name="adminForm">
<div id="editcell">
    <table class="adminlist">
    <thead>
        <tr>
            <th width="5">
                <?php echo JText::_( 'ID' ); ?>
            </th>
            <th width="20">
                <input type="checkbox" name="toggle" value="" onclick="checkAll(<?php echo count( $this-/>items ); ?>);" />
            </th>
            <th>
                <?php echo JText::_( 'Karsilama' ); ?>
            </th>
        </tr>            
    </thead>
    <?php
    $k = 0;
    for ($i=0, $n=count( $this->items ); $i < $n; $i++)
    {
        $row        = &$this->items[$i];
        $checked    = JHTML::_('grid.id',   $i, $row->id );
        $link       = JRoute::_( 'index.php?option=com_merhaba&controller=merhaba&task=edit&cid[]='. $row->id );
        ?>
        <tr class="<?php echo "row$k"; ?>">
            <td>
                <?php echo $row->id; ?>
            </td>
            <td>
                <?php echo $checked; ?>
            </td>
            <td>
                 <a href="<?php echo $link; ?>"><?php echo $row->karsilama; ?></a>
            </td>
        </tr>
        <?php
        $k = 1 - $k;
    }
    ?>
    </table>
</div>
<input type="hidden" name="option" value="com_merhaba" />
<input type="hidden" name="task" value="" />
<input type="hidden" name="boxchecked" value="0" />
<input type="hidden" name="controller" value="merhaba" />
</form>
Bu listeden bir merhaba seçeneğini seçtiğimizde yapılacak işlemler için öncelikle controller oluşturmamız gerekiyor. Bunun için ise controllers adında bir klasör oluşturup içerisine bir merhaba controller hazırlamamız gerekiyor.

admin/controllers/merhaba.php:
Kod:
<?php
// Direkt erişimi engelleyelim
defined( '_JEXEC' ) or die( 'Restricted access' );

/**
 * Merhaba Merhaba Controller
 */
class MerhabalarControllerMerhaba extends MerhabalarController
{
    /**
     * oluşturucu (metodlara ek task özellikleri kayıt eder)
     * @return ****
     */
    function __construct()
    {
        parent::__construct();

        // Ek taskları kayıt edelim
        $this->registerTask( 'add', 'edit' );
    }

    /**
     * düzenleme formunu gösterelim
     */
    function edit()
    {
        JRequest::setVar( 'view', 'merhaba' );
        JRequest::setVar( 'layout', 'form'  );
        JRequest::setVar('hidemainmenu', 1);

        parent::display();
    }

    /**
     * veriyi kaydedelim (ve bileşen ana sayfamıza geri dönelim)
     */
    function save()
    {
        $model = $this->getModel('merhaba');

        if ($model->store($post)) {
            $msg = JText::_( 'Karşılama Kaydedildi!' );
        } else {
            $msg = JText::_( 'Karşılama Kaydedilirken Hata Oluştu' );
        }

        // Geriye dönüş sağlayalım
        $link = 'index.php?option=com_merhaba';
        $this->setRedirect($link, $msg);
    }

    /**
     * verileri silme
     */
    function remove()
    {
        $model = $this->getModel('merhaba');
        if(!$model->delete()) {
            $msg = JText::_( 'Hata: Bir veya Daha fazla karşılama silinemedi' );
        } else {
            $msg = JText::_( 'Karşılama(lar) silindi' );
        }

        $this->setRedirect( 'index.php?option=com_merhaba', $msg );
    }

    /**
     * veri düzenlemeyi iptal edelim
     */
    function cancel()
    {
        $msg = JText::_( 'İşlem İptal Edildi' );
        $this->setRedirect( 'index.php?option=com_merhaba', $msg );
    }
}
Bu kodları inceleyecek olursak;

Kod:
$this->registerTask( 'add', 'edit' );
registerTask metodu ile yeni task işlemlerimizi tanımladık. Diğer task işlemlerimizin fonksiyonlarını da bu dosya içerisinde hazırladık.

Gelelim bir karşılamaya tıkladığımızda gelecek olan form sayfasını hazırlamaya. Bunun için views klasörümüz içerisinde yeni bir klasör açıyoruz ve adını ?merhaba? koyuyoruz. Daha sonra içerisine her zamanki gibi view.html.php dosyamızı koyup içerisine şu kodları yerleştiriyoruz.

admin/views/merhaba/view.html.php:
Kod:
<?php
// Direkt erişimi engelleyelim
defined( '_JEXEC' ) or die( 'Restricted access' );

jimport( 'joomla.application.component.view' );

/**
 * Merhaba View
 */
class MerhabalarViewMerhaba extends JView
{
    /**
     * Merhaba view gösterim metodu
     **/
    function display($tpl = null)
    {
        //merhabayı alalım
        $merhaba      =& $this->get('Data');
        $isNew        = ($merhaba->id < 1);

        $text = $isNew ? JText::_( 'Yeni' ) : JText::_( 'Düzenle' );
        JToolBarHelper::title(   JText::_( 'Merhaba' ).': <small><small>[ ' . $text.' ]</small>' );
        JToolBarHelper::save();
        if ($isNew)  {
            JToolBarHelper::cancel();
        } else {
            // varolan öğeler için butonumuz `Kapat` olarak görünecek
            JToolBarHelper::cancel( 'cancel', 'Kapat' );
        }

        $this->assignRef('merhaba', $merhaba);

        parent::display($tpl);
    }
}
Burada da gelecek olan form sayfamızda kullanacağımız araç çubuğu butonlarını hazırladık. Şimdi de form sayfamızın şablonunu oluşturalım.

admin/views/merhaba/tmpl/form.php:

Kod:
<?php defined('_JEXEC') or die('Restricted access'); ?>

<form action="index.php" method="post" name="adminForm" id="adminForm">
<div class="col100">
    <fieldset class="adminform">
        <legend><?php echo JText::_( 'Detaylar' ); ?></legend>

        <table class="admintable">
        <tr>
            <td width="100" align="right" class="key">
                <label for="karsilama">
                    <?php echo JText::_( 'Karşılama' ); ?>:
                </label>
            </td>
            <td>
                <input class="text_area" type="text" name="karsilama" id="karsilama" size="32" maxlength="250" value="<?php echo $this-/>merhaba->karsilama;?>" />
            </td>
        </tr>
    </table>
    </fieldset>
</div>
<div class="clr"></div>

<input type="hidden" name="option" value="com_merhaba" />
<input type="hidden" name="id" value="<?php echo $this-/>merhaba->id; ?>" />
<input type="hidden" name="task" value="" />
<input type="hidden" name="controller" value="merhaba" />
</form>
Formumuz hazırlandı. Şimdi bu formumuza veriyi gönderecek olan modelimizi oluşturmamız gerekiyor. Bunun için admin/models/merhaba.php dosyamızı oluşturuyoruz.

admin/models/merhaba.php:
PHP:
<?php
// Direkt erişimi engelleyelim
defined( '_JEXEC' ) or die( 'Restricted access' );

jimport('joomla.application.component.model');

/**
 * Merhaba Merhaba Modeli
 */
class MerhabalarModelMerhaba extends JModel
{
    /**
     * ID değerinden verileri getiren oluşturucu
     */
    function __construct()
    {
        parent::__construct();

        $array = JRequest::getVar('cid',  0, '', 'array');
        $this->setId((int)$array[0]);
    }

    /**
     * merhaba id değerini ayarlayan metodumuz
     */
    function setId($id)
    {
        // id değerini al ve veriye yükle
        $this->_id      = $id;
        $this->_data    = null;
    }

    /**
     * Veriyi veritabanından alan metodumuz
     */
    function &getData()
    {
        // Veriyi yükle
        if (empty( $this->_data )) {
            $query = ' SELECT * FROM #__merhaba '.
                    '  WHERE id = '.$this->_id;
            $this->_db->setQuery( $query );
            $this->_data = $this->_db->loadObject();
        }
        if (!$this->_data) {
            $this->_data = new stdClass();
            $this->_data->id = 0;
            $this->_data->karsilama = null;
        }
        return $this->_data;
    }

    /**
     * Veriyi kaydeden metodumuz
     */
    function store()
    {    
        $row =& $this->getTable();

        $data = JRequest::get( 'post' );

        // Form alanlarını veritabanı tablomuza oturtalım
        if (!$row->bind($data)) {
            $this->setError($this->_db->getErrorMsg());
            return false;
        }

        // Kayıtların doğruluğunu onaylıyalım
        if (!$row->check()) {
            $this->setError($this->_db->getErrorMsg());
            return false;
        }

        // Verileri veritabanına kaydedelim
        if (!$row->store()) {
            $this->setError( $row->getErrorMsg() );
            return false;
        }

        return true;
    }

    /**
     * Kayıtları silen metodumuz
     */
    function delete()
    {
        $cids = JRequest::getVar( 'cid', array(0), 'post', 'array' );

        $row =& $this->getTable();

        if (count( $cids )) {
            foreach($cids as $cid) {
                if (!$row->delete( $cid )) {
                    $this->setError( $row->getErrorMsg() );
                    return false;
                }
            }
        }
        return true;
    }

}
Modelimizi de oluşturduk fakat veritabanındaki tablolarımızı modelimize tanıtmadık. Dolasıyla yapmamız gereken en önemli şey bir tablo yapısı sınıfı oluşturmak. Bunun için admin/tables/merhaba.php dosyasını oluşturuyoruz.

admin/tables/merhaba.php:

Kod:
<?php
// Direkt erişimi engelleyelim
defined( '_JEXEC' ) or die( 'Restricted access' );

/**
 * Merhaba Table sınıfı
 */
class TableMerhaba extends JTable
{
    /**
     * Birincil anahtarımız
     * @var int
     */
    var $id = null;

    /**
     * @var string
     */
    var $karsilama = null;

    /**
     * Oluşturucu
     * @param nesne Veritabanı bağlantı nesnesi
     */
    function TableMerhaba(& $db) {
        parent::__construct('#__merhaba', 'id', $db);
    }
}
Şimdi bileşenimizin veritabanındaki verilerini değiştirme, yeni ekleme ve silme işlemlerini yapabiliriz. Burada JTable ve JToolbarHelper sınıflarına da biraz olsun girmiş olduk. Son olarak merhaba.xml dosyamızı yeni oluşturduğumuz dosyaları da ekleyerek düzenleyelim.

merhaba.xml:
Kod:
<?xml version="1.0" encoding="utf-8"?>
<install type="component" version="1.5.0">
 <name>Merhaba</name>
 <!-- Aşağıdaki elementler isteğe bağlıdır. Bileşen hakkında bilgi verirler. -->
 <creationdate>2010-02-10</creationdate>
 <author>Soner Ekici</author>
 <authoremail>[email protected]</authoremail>
 <authorurl>http://www.orneksite.com</authorurl>
 <copyright>Copyright Bilgisi</copyright>
 <license>Lisans Bilgisi</license>
 <!--  Sürüm bilgisi veritabanındaki components tablosuna kaydedilecektir -->
 <version>1.5</version>
 <!-- Açıklama isteğe bağlıdır -->
 <description>Bileşenin açıklaması...</description>
 <!-- Site Ana Dosya Kopyalama Bölümü -->
 <!-- folder etiketi hakkında: Bu etiket bileşenimizin paket dosyası içerisinde
neredeki dosyaların sitemizin ön yüzüne aktarılacağını tanımlar. Bizim bileşen
örneğimizde paketimizdeki /site/ klasöründen aktarılacak -->
 <files folder="site">
  <filename>controller.php</filename>
  <filename>merhaba.php</filename>
  <filename>index.html</filename>
  <filename>views/index.html</filename>
  <filename>views/merhaba/index.html</filename>
  <filename>views/merhaba/view.html.php</filename>
  <filename>views/merhaba/tmpl/default.php</filename>
  <filename>views/merhaba/tmpl/index.html</filename>
  <filename>models/merhaba.php</filename>
  <filename>models/index.html</filename>
 </files>
<install>
  <sql>
    <file charset="utf8" driver="mysql">install.sql</file>
  </sql>
 </install>
 <uninstall>
  <sql>
    <file charset="utf8" driver="mysql">uninstall.sql</file>
  </sql>
 </uninstall>
 <administration>
  <!-- Yönetim Menüsü Bölümü -->
  <menu>Merhaba!</menu>
   <!-- Yönetim Ana Dosya Kopyalama Bölümü -->
  <files folder="admin">
   <filename>merhaba.php</filename>
   <filename>controller.php</filename>
   <filename>index.html</filename>
   <filename>install.sql</filename>
   <filename>uninstall.sql</filename>
   <filename>views/index.html</filename>
   <filename>views/merhaba/view.html.php</filename>
   <filename>views/merhaba/index.html</filename>
   <filename>views/merhaba/tmpl/index.html</filename>
   <filename>views/merhaba/tmpl/form.php</filename>
   <filename>views/merhabalar/index.html</filename>
   <filename>views/merhabalar/view.html.php</filename>
   <filename>views/merhabalar/tmpl/index.html</filename>
   <filename>views/merhabalar/tmpl/default.php</filename>
   <filename>models/merhabalar.php</filename>
   <filename>models/merhaba.php</filename>
   <filename>models/index.html</filename>
   <filename>tables/index.html</filename>
   <filename>tables/merhaba.php</filename>
   <filename>controllers/index.html</filename>
   <filename>controllers/merhaba.php</filename>
  </files>
  </administration>
</install>

Ve Bitti Artık İşlemlerinizi Kontrol Edebilirsiniz

Konu Anlatımı İçin Anonim'e Teşekkürler

Tht
 
Ü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.