Joomla! 1.5 için basit bir bileşen oluşturmak - Bölüm 5

- Soner Ekici
- 6.603
- İleri
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.
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;
<thead>
<tr>
<th width="5">
echo JText::_( 'ID' ); ?>
</th>
<th>
echo JText::_( 'Karsilama' ); ?>
</th>
</tr>
</thead>
Bu alanı şu hale getiriyoruz;
<thead>
<tr>
<th width="5">
echo JText::_( 'ID' ); ?>
</th>
<th width="20">
<input type="checkbox" name="toggle" value="" onclick="checkAll( echo count( $this-/>items ); ?>);" />
</th>
<th>
echo JText::_( 'Karsilama' ); ?>
</th>
</tr>
</thead>
Burada eklediğimiz kodlar;
<th width="20">
<input type="checkbox" name="toggle" value="" onclick="checkAll( echo count( $this-/>items ); ?>);" />
</th>
Daha sonra aynı default.php içerisinde;
$row =& $this->items[$i];
olan kısmı şöyle değiştiriyoruz;
$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;
<tr class=" echo "row$k"; ?>">
<td>
echo $row->id; ?>
</td>
<td>
echo $row->karsilama; ?>
</td>
</tr>
olan kodları şöyle değiştiriyoruz;
<tr class=" echo "row$k"; ?>">
<td>
echo $row->id; ?>
</td>
<td>
echo $checked; ?>
</td>
<td>
<a href=" echo $link; ?>"> 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 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">
echo JText::_( 'ID' ); ?>
</th>
<th width="20">
<input type="checkbox" name="toggle" value="" onclick="checkAll( echo count( $this-/>items ); ?>);" />
</th>
<th>
echo JText::_( 'Karsilama' ); ?>
</th>
</tr>
</thead>
$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=" echo "row$k"; ?>">
<td>
echo $row->id; ?>
</td>
<td>
echo $checked; ?>
</td>
<td>
<a href=" echo $link; ?>"> echo $row->karsilama; ?></a>
</td>
</tr>
$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:
<?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 void
*/
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;
$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:
<?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:
<?php defined('_JEXEC') or die('Restricted access'); ?>
<form action="index.php" method="post" name="adminForm" id="adminForm">
<div class="col100">
<fieldset class="adminform">
<legend> echo JText::_( 'Detaylar' ); ?></legend>
<table class="admintable">
<tr>
<td width="100" align="right" class="key">
<label for="karsilama">
echo JText::_( 'Karşılama' ); ?>:
</label>
</td>
<td>
<input class="text_area" type="text" name="karsilama" id="karsilama" size="32" maxlength="250" value=" 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=" 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
// 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:
<?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:
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>pisdoktor@orneksite.com</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>
Yorum yazabilmek için üye girişi yapmanız gerekiyor!