JoomKitapVerilerin, önyüzde ziyaretçilere gösterimi, verilerin yönetimine göre nispeten daha basittir. Burada yönetici olarak, verilerinizin girişini yapabilmeli, değiştirebilmeli, silebilmeli ya da yayınlama gibi bazı ödevleri yerine getirmeniz gerekebilir. Bu da, basit bir listelemeye göre daha fazla kullanıcı ile etkilşeim halinde olan bir form geliştirmeyi zorunlu kılar.
Joomla!, tüm bileşen menü öğelerini jos_components tablosunda saklar ve yönetim buradan gerçekleşir. com_kitap öğesi de bu tablo içinde yer alır.

bununla beraver , menü öğesinde , bileşen isminin yanında gözükecek olan grafikte belirtilir. ('js/ThemeOffice/component.png'). Grafikler [Joomla_dizini]/includes/js/ThemeOffice dizini içerisinde yer alır.

Yönetici bileşeni de , önyüzde olduğu gibi birden fazla farklı dosyadan oluşur. Dizin yapısı ve gerekli dosyalar, [joomla_dizini]/administration/components/com_kitap/ dizininde yer alır: gibidir:
/administration/components/admin.kitap.php
/administration/components/controller.php
/administration/components/controllers/kitap.php
/administration/components/views/kitaplar/view.html.php
/administration/components/views/kitaplar/tmpl/default.php
/administration/components/views/kitap/view.html.php
/administration/components/views/kitap/tmpl/form.php
/administration/components/tables/kitap.php
/administration/components/install.sql
/administration/components/uninstall.sql
Yönetici arayüzü de yine, önyüzde olduğu gibi bir girişe sahiptir.
<?php
defined('_JEXEC') or die('Restricted access');
require_once (JPATH_COMPONENT.DS.'controller.php');
if($controller = JRequest::getVar('controller', 'kitap')) {
require_once (JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php');
}
$classname = 'KitaplarController'.$controller;
$controller = new $classname( );
$controller->execute( JRequest::getVar('task'));
$controller->redirect();
?>

Controller kodumuzda size pek yabancı gelmeyecektir.
<?php
jimport('joomla.application.component.controller');
class KitaplarController extends JController
{
function display()
{
parent::display();
}
}
?>
Bu noktada yeni bir controller karşımıza çıkıyor.
<?php
// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die();
class KitaplarControllerKitap extends KitaplarController
{
/**
* constructor (registers additional tasks to methods)
* @return void
*/
function __construct()
{
parent::__construct();
// Register Extra tasks
$this->registerTask( 'add' , 'edit' );
$this->registerTask( 'unpublish', 'publish');
}
/**
* display the edit form
* @return void
*/
function edit()
{
JRequest::setVar( 'view', 'kitap' );
JRequest::setVar( 'layout', 'form' );
JRequest::setVar('hidemainmenu', 1);
parent::display();
}
/**
* save a record (and redirect to main page)
* @return void
*/
function save()
{
$model = $this->getModel('kitap');
if ($model->store($post)) {
$msg = JText::_( 'Kitap kaydedildi!' );
} else {
$msg = JText::_( 'Kayıt sırasında hata oluştu' );
}
//
$link = 'index.php?option=com_kitap';
$this->setRedirect($link, $msg);
}
/**
* remove record(s)
* @return void
*/
function remove()
{
$model = $this->getModel('kitap');
if(!$model->delete()) {
$msg = JText::_( 'Hata: Kayıt silinemedi' );
} else {
$msg = JText::_( 'Kitap(lar) silindi' );
}
$this->setRedirect( 'index.php?option=com_kitap', $msg );
}
/**
* Publishes or Unpublishes one or more records
* @param array An array of unique category id numbers
* @param integer 0 if unpublishing, 1 if publishing
* @param string The current url option
*/
function publish()
{
$this->setRedirect( 'index.php?option=com_kitap' );
// Initialize variables
$db =& JFactory::getDBO();
$user =& JFactory::getUser();
$cid = JRequest::getVar( 'cid', array(), 'post', 'array' );
$task = JRequest::getCmd( 'task' );
$publish = ($task == 'publish');
$n = count( $cid );
if (empty( $cid )) {
return JError::raiseWarning( 500, JText::_( 'Kayıt seçiilmedi' ) );
}
JArrayHelper::toInteger( $cid );
$cids = implode( ',', $cid );
$query = 'UPDATE #__kitap'
. ' SET published = ' . (int) $publish
. ' WHERE id IN ( '. $cids .' )'
;
$db->setQuery( $query );
if (!$db->query()) {
return JError::raiseWarning( 500, $row->getError() );
}
$this->setMessage( JText::sprintf( $publish ? 'Kayıtlar yayınlandı' : 'Kayıtlar yayından kaldırıldı', $n ) );
}
/**
* cancel editing a record
* @return void
*/
function cancel()
{
$msg = JText::_( 'İşlem iptal edildi' );
$this->setRedirect( 'index.php?option=com_kitap', $msg );
}
}
?>
Burada düzenle, kaydet, sil, yayınla ve iptal metotları yer almaktadır. Bu metotlar içinde model nesnesi oluşturulur ve ihtiyaç duyuldukça , store metodunda olduğu gibi model içerisinden çağrılır. Statik sınıflar Jtext ve Jerror üzerinden, işlemin başarılı olup olmadığı hakkındaki mesajlar gönderilir.
Bu sefer ki View'ımız biraz daha büyükçe , çünkü araç çubuğu (toolbar) eklemek gerekiyor.
<?php
// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die();
jimport( 'joomla.application.component.view' );
/**
* Kitaplar View
*
* @package
* @subpackage Components
*/
class KitaplarViewKitaplar extends JView
{
/**
* Kitaplar view display method
* @return void
**/
function display($tpl = null)
{
JToolBarHelper::title( JText::_( 'Kitap Yöneticisi' ), 'generic.png' );
JToolBarHelper::addNewX();
JToolBarHelper::editListX();
JToolBarHelper::publishList();
JToolBarHelper::unpublishList();
JToolBarHelper::deleteList();
// Get data from the model
$items = & $this->get( 'Data');
$this->assignRef('items', $items);
parent::display($tpl);
}
}
kod: /administration/components/views/kitaplar/view.html.php

JToolbar-Helper sınıfı bu ödevi yerine getirir.
Tabi ki listeninde formatlanması gerekiyor. Bu amaç için standart tema kullanılabilir.

Kitap kayıtlarınızın detayını görüntleyebilmek içinde birşeyler yapmanız gerekiyor. Aşağıdaki kodla bunu gerçekleştirebiliryoruz.
<?php defined('_JEXEC') or die('Restricted access'); ?>
<form action="index.php" method="post" name="adminForm">
<div id="editcell">
<table class="adminlist">
<thead>
<tr>
<tr>
<th width="7">
<?php echo JText::_( 'NUM' ); ?>
</th>
<th width="20">
<input type="checkbox" name="toggle" value="" onclick="checkAll(<?php echo count( $this->items ); ?>);" />
</th>
<th class="title">
<?php echo JHTML::_('grid.sort', 'Kitap', 'a.kitap_ismi', @$lists['order_Dir'], @$this->lists['order'] ); ?>
</th>
<th class="title">
<?php echo JHTML::_('grid.sort', 'Yazar', 'a.yazar', @$lists['order_Dir'], @$this->lists['order'] ); ?>
</th>
<th class="title">
<?php echo JHTML::_('grid.sort', 'ISBN No', 'a.isbn_no', @$lists['order_Dir'], @$this->lists['order'] ); ?>
</th>
<th width="5%" align="center">
<?php echo JHTML::_('grid.sort', 'Published', 'a.published', @$this->lists['order_Dir'], @$this->lists['order'] ); ?>
</th>
<th width="1%" nowrap="nowrap">
<?php echo JHTML::_('grid.sort', 'ID', 'a.id', @$this->lists['order_Dir'], @$this->lists['order'] ); ?>
</th>
</tr>
</thead>
<?php
$k = 0;
for ($i=0, $n=count( $this->items ); $i < $n; $i++)
{
$row = &$this->items[$i];
$published = JHTML::_('grid.published', $row, $i );
$checked = JHTML::_('grid.id', $i, $row->id );
$link = JRoute::_( 'index.php?option=com_kitap&controller=kitap&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->kitap_ismi; ?></a>
</td>
<td>
<?php echo $row->yazar; ?>
</td>
<td>
<?php echo $row->isbn_no; ?>
</td>
<td align="center">
<?php echo $published;?>
</td>
<td align="center">
<?php echo $row->id; ?>
</td>
</tr>
<?php
$k = 1 - $k;
}
?>
</table>
</div>
<input type="hidden" name="option" value="com_kitap" />
<input type="hidden" name="task" value="" />
<input type="hidden" name="boxchecked" value="0" />
<input type="hidden" name="controller" value="kitap" />
</form>
Listelemede , kayıt görüntüleme için de araç çubuğu oluşturuluyor. Bu form hem kayıt eklemek, hem de varolan kaydı değiştirmekle görevlidir. $isNew değişkeni bu iki ödevi ayırdedebilmek için kullanılır.

Detay görüntüleme formunun nasıl görüntüleneceği, bu standart temada inşa edilmiştir.
<?php defined('_JEXEC') or die('Restricted access'); ?>
<script language="javascript" type="text/javascript">
function submitbutton(pressbutton) {
var form = document.adminForm;
if (pressbutton == 'cancel') {
submitform( pressbutton );
return;
}
// do field validation
if (form.kitap_ismi.value == "") {
alert( "<?php echo JText::_( 'Kitaba ait bir metin olmak zorundadir', true ); ?>" );
} else {
submitform( pressbutton );
}
}
</script>
<form action="index.php" method="post" name="adminForm" id="adminForm">
<div>
<fieldset class="adminform">
<legend><?php echo JText::_( 'Detaylar' ); ?></legend>
<table class="admintable">
<tr>
<td width="110" class="key">
<label for="title">
<?php echo JText::_( 'Kitap Adi' ); ?>:
</label>
</td>
<td>
<input class="inputbox" type="text" name="kitap_ismi" id="kitap_ismi" size="60" value="<?php echo $this->kitap->kitap_ismi; ?>" />
</td>
</tr>
<tr>
<td width="110" class="key">
<label for="alias">
<?php echo JText::_( 'Yazar' ); ?>:
</label>
</td>
<td>
<input class="inputbox" type="text" name="yazar" id="yazar" size="60" value="<?php echo $this->kitap->yazar; ?>" />
</td>
</tr>
<tr>
<td width="110" class="key">
<label for="alias">
<?php echo JText::_( 'ISBN_No' ); ?>:
</label>
</td>
<td>
<input class="inputbox" type="text" name="isbn_no" id="isbn_no" size="60" value="<?php echo $this->kitap->isbn_no; ?>" />
</td>
</tr>
<tr>
<td class="key">
<label for="lag">
<?php echo JText::_( 'Küçük foto(120px)' ); ?>:
</label>
</td>
<td>
<input class="inputbox" type="text" name="kucuk_foto" id="kucuk_foto" size="60" value="<?php echo $this->kitap->kucuk_foto; ?>" />
<?php echo JText::_( '(Lütfen fotografin bulundugu bir url adresi girin)' ); ?>
</td>
</tr>
<tr>
<td colspan="2">
<?php if ($this->kitap->kucuk_foto){?>
<img src="<?php echo $this->kitap->kucuk_foto; ?>">
<?php } ?>
</td>
</tr>
<tr>
<td class="key">
<label for="lag">
<?php echo JText::_( 'Büyük foto(350px)' ); ?>:
</label>
</td>
<td>
<input class="inputbox" type="text" name="buyuk_foto" id="buyuk_foto" size="60" value="<?php echo $this->kitap->buyuk_foto; ?>" />
<?php echo JText::_( '(Lütfen fotografin bulundugu bir url adresi girin)' ); ?>
</td>
</tr>
<tr>
<td colspan="2">
<?php if ($this->kitap->buyuk_foto){?>
<img src="<?php echo $this->kitap->buyuk_foto; ?>">
<?php } ?>
</td>
</tr>
<tr>
<td width="120" class="key">
<?php echo JText::_( 'Yayinda' ); ?>:
</td>
<td>
<?php echo JHTML::_( 'select.booleanlist', 'published', 'class="inputbox"', $this->kitap->published ); ?>
</td>
</tr>
</table>
</fieldset>
</div>
<div class="clr"></div>
<div class="clr"></div>
<input type="hidden" name="option" value="com_kitap" />
<input type="hidden" name="id" value="<?php echo $this->kitap->id; ?>" />
<input type="hidden" name="task" value="" />
<input type="hidden" name="controller" value="kitap" />
</form>
kod: /administration/components/views/kitap/tmpl/form.php
Bu form da , yine diğerleri gibi PHP değişkenleri içeren HTML kodu ve statik sınıf (JText) çağrılarından oluşur. Formun çalışma esnasındaki görünümü aşağıdaki gibi olacaktır.

Son olarak tablo sınıfına (class) geldir. Bir şekilde oluşturduğumuz modelimizin hangi veriler ile çalışağını bilmesi gerekiyor. JTable-sınıfı veriye erişimi ve değişiklik işlemlerini oldukça kolaylaştırmaktadır. Bu soyut (abstract ya da bir ınterface - arayüz) bir sınıftır ve bu sınıfa uzatılan (extend) sınıfların , sahip olduğu metot yağısını kullanmasını sağlar. Yapılandırıcı (constructor) bölümünde tablo ismi ve birincil anahtarlar (primary keys) tanımlanır.
<?php
// no direct access
defined('_JEXEC') or die('Restricted access');
class TableKitap extends JTable
{
/** @var int Primary key */
var $id = 0;
/** @var string */
var $kitap_ismi = '';
/** @var string */
var $yazar = '';
/** @var string */
var $isbn_no = '';
/** @var string */
var $kucuk_foto = '';
/** @var string */
var $buyuk_foto = '';
/** @var string */
var $published = 0;
/** @var int */
/**
* Constructor
*
* @param object Database connector object
*/
function TableKitap(& $db) {
parent::__construct('#__kitap', 'id', $db);
}
}
?>
Comments
Post new comment