Yazan : Şadi Evren ŞEKER

Bu yazının amacı, bir içerik yönetim sistemi olan (CMS) Dolphin 7 platformu üzerinde nasıl modül geliştirileceğini açıklamaktır.

Bu yazı kapsamında örnek bir modül geliştirilecektir. Modülün iki farklı ara yüzü olacaktır. Birincisi sitede yer alması ve siteyi ziyaret eden kişilerin görmesini hedeflediğimiz ara yüzdür. İkincisi ise modülün yönetici ara yüzüdür. Modülümüzü öncelikle basit bir metinden oluşan şekilde kodlayacağız ve ardından geliştireceğiz.

Bir modülün dosya anatomisi

Klasik bir modül geliştirilirken kullanılan bazı özel dizinler ve dosyalar bulunur. Bunların listesi aşağıda sunulmuştur. Modül geliştirilirken benzer dizin ve dosya isimlerinin kullanılması gerekir.

Aşağıdaki dosya isimlerinde MeBlgg ile başlayan kısım modül ismidir. Burada örnek olarak benim blog’um kısaltması olarak MeBlgg kelimesi kullanılmıştır. Farklı modüller için farklı isimler kullanılabilir. Ancak bu modül ismine göre aşağıda listelendiği gibi dosya isimleri oluşturulmalıdır. Örneğin, ayarların tutulduğu dosya MeBlggConfig dosyası olarak isimlendirilmiştir. Proje ismi Ali olsaydı, dosya ismi AliConfig olacaktı. Benzer şekilde proje dosyaları bir dizin içerisinde kurulmalıdır. Örneğin dizin ismi olarak bloggie seçilmiştir. Proje kapsamında farklı isimler seçilebilir.

bloggie/classes

Modülün nesne yönelimli programlanması gerekir ve kodları bu dizin içerisindeki sınıflara yerleştirilir.

bloggie/classes/MeBlggConfig.php

Modülün ayarlamalarını içeren (config) sınıfları bu dosyada durur. Buradaki ayarları, diğer sınıflar kullanır. Ayarların bulunduğu sınıflar, sistem sınıflarından miras alırlar (inheritance)

bloggie/classes/MeBlggDb.php

Yazılan yeni modülün veritabanı bağlantısının yapıldığı dosyadır. SQL dilinde yazılan sorgular bu dosyada yer alır.

bloggie/classes/MeBlggModule.php

Modülün ana sınıfıdır. İlk çalışan fonksiyon ve diğer bütün fonksiyonlara çağrı bu dosyadan yapılır.

bloggie/classes/MeBlggTemplate.php

Şablon sınıfıdır. Base sınıftan miras alır (inheritance)

bloggie/install

Modülün kurulumu için gereken bilgileri içerir. Örneğin kurulum sırasında çalışacak olan veri tabanı makroları bu dizinde bulunur.

bloggie/install/config.php

Kurulum sırasındaki konfigürasyon bilgileri bu dosyaya yazılır.

bloggie/install/info

Kurulum sırasında, modül kurulumu yapan kişilerin bilgilendirilmesini amaçlayan dosyadır.

bloggie/install/installer.php

Kurulum betiklerini (script) içerir. Kurulum sırasında otomatik olarak yapılacak olan makrolar bu dosyaya yazılır.

bloggie/install/langs

Kurulum sırasındaki dil dosyasıdır. Dil dosyaları, ülke kodunun iki hafidir. Sonu .php ile biter.

bloggie/install/langs/en.php

Örnek olarak İngilizce kurulum dil dosyasıdır.

bloggie/install/sql

Kurulum sırasında kullanılacak olan veri tabanı dosyalarını içerir.

bloggie/install/sql/install.sql

modülün kurulumu sırasında çalıştırılacak olan veri tabanı prosedürlerini içeren sql dosyası (create table, grant vs. gibi)

bloggie/install/sql/uninstall.sql

Modülün kaldırılması için gereken veritabanı prosedürlerini içeren dosya. (drop table, revoke vs. gibi)

bloggie/request.php

Yönlendirici sınıfıdır. MeBlggModule sınıf çağırılarına geçirilen bir kılıf gibi düşünülebilir (wrapping class).

bloggie/templates

Modülün görsel şemasını içeren dizindir. *.html, *.css ve resim dosyalarını barındırır. Tasarıma göre düzenlenmelidir.

bloggie/templates/base

Şemaların içerildiği ana dizindir. Dilenirse farklı alt dizinler oluşturularak her şema farklı bir dizinde bulundurulabilir. Ya da tek bir base dizini üzerinden hepsine prosedür çağırılabilir.

bloggie/templates/base/css

CSS dosyaları buraya yerleştirilir.

bloggie/templates/base/images

Resimlerin konulacağı dizindir.

bloggie/templates/base/images/icons

İconların dizinidir.

bloggie/templates/base/main.html

Şemanın içerileceği ana html dosyasıdır.

 

2. Basit Bir Modül

Örnek olarak hazırlanan modül dosyasını bu bağlantıya tıklayarak indirebilirsiniz. Bu dosyanın modules/me dizinine kurulması gerekir. Elbette sizin geliştireceğiniz modül me dışında, proje ismini içeren bir dizine kurulacaktır. Ve yine elbette me dizini standart kurulumda modules dizini altında bulunmaz ve bu dizini sizin oluşturmanız gerekir. Dizine kurulum yaptıktan sonra bloggie isimli örnek dizin modules/me dizini altına gelir. Bu kurulum sonucunda gelen dizin ve dosyaları aşağıdaki şekilde açıklayabiliriz.

bloggie/classes

Modülün nesne yönelimli programlanması gerekir ve kodları bu dizin içerisindeki sınıflara yerleştirilir.

bloggie/classes/MeBlggConfig.php

Modülün ayarlamalarını içeren (config) sınıfları bu dosyada durur. Buradaki ayarları, diğer sınıflar kullanır. Ayarların bulunduğu sınıflar, sistem sınıflarından miras alırlar (inheritance)

bloggie/classes/MeBlggDb.php

Yazılan yeni modülün veritabanı bağlantısının yapıldığı dosyadır. SQL dilinde yazılan sorgular bu dosyada yer alır.

bloggie/classes/MeBlggModule.php

Modülün ana sınıfıdır. İlk çalışan fonksiyon ve diğer bütün fonksiyonlara çağrı bu dosyadan yapılır.

bloggie/classes/MeBlggTemplate.php

Şablon sınıfıdır. Base sınıftan miras alır (inheritance)

bloggie/install

Modülün kurulumu için gereken bilgileri içerir. Örneğin kurulum sırasında çalışacak olan veri tabanı makroları bu dizinde bulunur.

bloggie/install/config.php

Kurulum sırasındaki konfigürasyon bilgileri bu dosyaya yazılır.

bloggie/install/info

Kurulum sırasında, modül kurulumu yapan kişilerin bilgilendirilmesini amaçlayan dosyadır.

bloggie/install/installer.php

Kurulum betiklerini (script) içerir. Kurulum sırasında otomatik olarak yapılacak olan makrolar bu dosyaya yazılır.

bloggie/install/langs

Kurulum sırasındaki dil dosyasıdır. Dil dosyaları, ülke kodunun iki hafidir. Sonu .php ile biter.

bloggie/install/langs/en.php

Örnek olarak İngilizce kurulum dil dosyasıdır.

bloggie/install/sql

Kurulum sırasında kullanılacak olan veri tabanı dosyalarını içerir.

bloggie/install/sql/install.sql

modülün kurulumu sırasında çalıştırılacak olan veri tabanı prosedürlerini içeren sql dosyası (create table, grant vs. gibi)

bloggie/install/sql/uninstall.sql

Modülün kaldırılması için gereken veritabanı prosedürlerini içeren dosya. (drop table, revoke vs. gibi)

bloggie/request.php

Yönlendirici sınıfıdır. MeBlggModule sınıf çağırılarına geçirilen bir kılıf gibi düşünülebilir (wrapping class).

bloggie/templates

Modülün görsel şemasını içeren dizindir. *.html, *.css ve resim dosyalarını barındırır. Tasarıma göre düzenlenmelidir.

bloggie/templates/base

Şemaların içerildiği ana dizindir. Dilenirse farklı alt dizinler oluşturularak her şema farklı bir dizinde bulundurulabilir. Ya da tek bir base dizini üzerinden hepsine prosedür çağırılabilir.

bloggie/templates/base/css

CSS dosyaları buraya yerleştirilir.

bloggie/templates/base/images

Resimlerin konulacağı dizindir.

bloggie/templates/base/images/icons

İconların dizinidir.

bloggie/templates/base/main.html

Şemanın içerileceği ana html dosyasıdır.

Bu dosya konumları oldukça önemlidir çünkü Dolphin yazılımı üzerinde çalışan bazı plug-in’ler bu dosyaları ilgili dizinlerde aramaktadır ve bulunmaması halinde hatalı çalışabilmektedir.

Şimdi deneme modülümüzü kurmaya geçelim. Öncelikle admin paneline geçiyor ve normal bir modül kurar gibi kurulum yapıyoruz. Panel->Tools->Modules seçenekleri sırasıyla seçilerek yüklü olan modüller görülebilir.

Bu modüllerden bir kısmı kurulmamıştır ve Not Installed Modules grubu altında belirir.


Modülün kurulması için, modül yanında bulunan kutucuk seçilip, Install düğmesine basılması gerekir.


Kurulum sırasında herhangi bir hata olması durumunda, ekranın en üzerinde aşağıdakine benzer bir hata mesajı belirir:


Bu hatanın detayları, satırın sonundaki + düğmesine basılarak açılabilir. Örneğin bu kurulum sırasında, örnek olması açısından, modülün Dolphin versiyonu değiştirilerek kurulum denenmiş ve aşağıdaki şekilde hata mesajı alınmıştır:


Başarılı bir kurulumun ardından aşağıdaki mesaj alınabilir:


Kurulu olan modülün testi için site üzerinde m/bloggie/home dizinine girilebilir. Örneğin test sunucusu için bu yol aşağıdaki şekildedir:

http://beta.odmproje.com/dolphin/m/bloggie

Şayet herşey başarılı bir şekilde kurulduysa, aşağıdaki şekilde, sayfa tasarlanarak içerisinde, modül mesajı ile birlikte basılacaktır:


Buradaki modül mesajını değiştirmemiş mümkündür.

bloggie/install/langs/en.php dosyası açılırsa aşağıdaki içerik görülecektir.

$sLangCategory = ‘My Bloggie’;

 

$aLangContent = array(

‘_me_blgg’ => ‘My Bloggie’,

‘_me_blgg_text’ => ‘For a community to be whole and healthy, it must be based on people’s love and concern for each other.’,

);

Bu mesajı aşağıdaki şekilde değiştirerek sitede de değişmesini sağlayabiliriz:

$sLangCategory = ‘My Bloggie’;

 

$aLangContent = array(

‘_me_blgg’ => ‘My Bloggie’,

‘_me_blgg_text’ => ‘Bu bir testtir.’,

);

Yukarıdaki değişiklikten sonra aşağıdaki mesaj alınır:


Önemli bazı notlar:

Yukarıdaki mesajı normalde almanız gerekirken alamıyorsanız. Dil dosyasını yeniden derlemeniz (recompile) gerekebilir. Bunun için modül kurulum ekranından, modül seçildikten sonra “Recompile Languages” düğmesine basılması gerekir.


Bu sayede yeni dil dosyası yüklenerek derlenir. Bu derleme işlemi sonucunda ana dil dosyası olan /langs/lang-en.php dosyasına, ilgili düzeltme yapılır. Aslında bütün mesajlar bu dosyada tutulmakta olup kurulan modüllerin mesajları da bu dosyaya yazılmaktadır. Dolayısıyla bu modüllerde yapılan değişiklikler aslında recompile edildiğinde bu dosya değişmektedir.

Diğer bir dikkat edilecek husus ise, modülde yapılan değişikliklerin, siteye hemen yansımamasıdır. Bunun sebebi Dolphin dizini altında bulunan cache dizinidir. Buradaki cache dosyaları, sayfaların yeniden yüklenmesini ve değişikliklerin görülmesini engelleyebilir. Çözüm olarak bu dizin içindeki bütün dosyaların silinmesi denenebilir.

2.2. Hareketli İçerik Kodlaması.

Basit bir uygulama olarak, dolphin üzerindeki bazı hazır fonksiyonları kullanacak ve sunucu saati ve kullanıcı saati arasındaki farkı hesaplaya çalışacağız. Modül üzerinde yapılan bu değişiklik, Dolphin üzerine kodlamaya başlangıcımızdır.

Öncelikle modülümüze iki yeni mesaj ekliyelim

$sLangCategory = ‘My Bloggie’;

 

$aLangContent = array(

‘_me_blgg’ => ‘My Bloggie’,

‘_me_blgg_server_time’ => ‘Sunucu saati:’,

‘_me_blgg_user_time’ => ‘Kullanıcı saati:’,

);

Yukarıdaki mesajlar eklendikten sonra, bu mesajları, modülümüzün ekranda göstermesi için, bu mesajları çağıran html eklentisini yapmamız gerekir. bloggie/templates/base/main.html dosyasında bulunan ve sadece tek satırlık mesajı yazan eski halimiz aşağıdaki şekildeydi:

<div style=”text-align:center;”>

<bx_text:_me_blgg_text />

</div>

Yukarıdaki bu dosyayı aşağıdaki şekilde değiştirelim:

<div style=”text-align:center;”>

<bx_text:_me_blgg_server_time /> __server_time__

<br />

<bx_text:_me_blgg_user_time />

<script type=”text/javascript”>

document.write(new Date());

</script>

</div>

Burada kullandıklarımız:

  • bx_text ardından gelen mesaj değişkenini, dolphin kurulumu içindeki dil dosyasında arayarak ekrana basar.
  • server_time değişkeni, şu anda kullanılmayan ve sistemden okunacak olan değişkendir..
  • Kullanıcı saati için, javascript dilinde bir değişken kullanılmıştır..

Modül sayfamızı yenilediğimizde aşağıdaki şekilde bir ekran göreceğiz:


Görüldüğü üzere, yazılan yazılar ekranda belirmekte ayrıca javascript kodumuz çalışmaktadır. Tek sorun __server_time__ şeklinde beliren değişkenin değerinin okunamamasıdır.

Bunun için kodlarımızı bulunduracak olan bloggie/classes/MeBlggModule.php dosyasında bulunan aşağıdaki kodu buluyoruz:

function actionHome () {

$this->_oTemplate->pageStart();

$aVars = array ();

echo $this->_oTemplate->parseHtmlByName(‘main’, $aVars);

$this->_oTemplate->pageCode(_t(‘_me_blgg’), true);

}

Ve aşağıdaki yeni kod ile değiştiriyoruz.

function actionHome () {

$this->_oTemplate->pageStart();

$aVars = array (

‘server_time’ => date(‘r’),

);

echo $this->_oTemplate->parseHtmlByName(‘main’, $aVars);

$this->_oTemplate->pageCode(_t(‘_me_blgg’), true);

}

Bu kodda görüldüğü üzere yeni bir değişken eklenmiş ve bu değişkenin değeri php fonksiyonu olan date fonksiyonundan okunmuştur.

Sayfamızın yeni hali aşağıdaki şekildedir:


Sunucu ve bilgisayar aynı ülkede olduğu için yukarıdaki sayfada bir fark görülmüyor. Ancak sunucunun farklı bir ülkede (farklı bir zaman diliminde) olması durumunda bu fark görülecektir. Ayrıca iki saat arasındaki fark, sunucu ve bilgisayar arasındaki saat ayarlarındaki farklılıktan kaynaklanabileceği gibi, sunucunun sayfayı üretmesi ve yollaması sırasında geçen zaman da bu değerleri etkilemektedir.

Şimdi modüllerin ana sayfasının yüklenmesi sırasında çalışan actionHome fonksiyonunu inceleyelim.

  • _oTemplate değişkeni, MeBlggTemplate? Sınıfından yüklenen bir ana değişkendir.
  • pageStart fonksiyonu, çıktının aşağıda olucağını belirtir.
  • pageCode fonksiyonu, pageStart fonksiyonuyla başlayan içeriğin bittiğini belirtir. Yani modül sayfamızda görülecek olan içerik bu iki fonksiyon arasında bulunacaktır.
    • Bu fonksiyonun ilk parametresi, gösterilecek içeriğin başlığıdır ve dil dosyasından okunduğu için _t fonksiyonu ile çağrılmıştır.
    • İkinc parametre ise, bu içeriğin bir kutu şeklinde gösterilip gösterilmeyeceğini belirtir. Yukarıdaki ekran görüntülerinde kutulama yapılmasının sebebi burada true yazılmış olmasıdır.
  • parseHtmlByName fonksiyonu ise main.html dosyasında gerekli yer değiştirmeleri yapar. Örneğin $aVars değişkenler dizisi içerisinde artık bir server_time değişkeni vardır ve bu değişkenin sayfadaki server_time değişkeni ile yer değiştirmesi ve değerinin yerine yazılması gerekir.

Böylelikle basit bir modül ekleme işlemini bitirmiş oluyoruz. Bundan sonra yukarıdaki bilgiler kullanılarak yeni modüller yazılabilir. Kısaca yapılacak işlem dolphin üzerindeki mesajların dil dosyalarında bulundurulması, html dosyalarında kullanılan değişkenlere ise class dosyalarındaki php kodları ile karşılık yazılmasıdır.

Modülümüz için bir yönetici paneli eklenmesi ve veritabanı bağlantısı gibi bir seviye iler işlemler ise aşağıdaki bölümlerde anlatılacaktır.

3. Yönetici Paneli Kodlaması

Örnek uygulama olarak, modülümüzdeki tarihleri düzenlemek ve formatlama seçeneği eklemek istiyoruz. Ayrıca kullanıcı saatini göstermek veya göstermemek gibi bir seçenek de eklemek istiyoruz. Bu işlemler için aşağıdakileri yapmamız gerekecektir:

  • Yönetici sayfası eklememiz
  • Modülümüzüe göster/gösterme şeklinde bir seçenek eklememiz
  • Yönetici ekranında bu ayarları göstermemiz
  • Yönetici ekranında modüller listesinde, bizim modülümüze bir bağlantı eklenmesi

3.1. Admin page creation.

Ana fonksiyonlarımızı bulunduran bloggie/classes/MeBlggModule.php dosyasına, aşağıdaki admin fonksiyonunu ekleyelim:

function actionAdministration () {

 

if (!$GLOBALS[‘logged’][‘admin’]) {

$this->_oTemplate->displayAccessDenied ();

return;

}

 

$this->_oTemplate->pageStart();

 

echo DesignBoxAdmin (_t(‘_me_blgg’), ‘It works!’);

 

$this->_oTemplate->pageCodeAdmin (_t(‘_me_blgg’));

}

Buradaki bazı sınıf ve fonksiyonlar, yönetici ekranı açıldığı zaman çalışır. pageCodeAdmin fonksiyonu pageCode fonksiyonuna benzer şekilde, sayfanın başlangıç ve bitişlerini belirtmeye yarar. Tek farklı, tek parametre almasıdır. Burada görsellik daha fazla ikinci planda kaldığı için, çerçeve konulması düşünülmemiştir.

Öncelikle yetkilendirme işlemi için bazı değişkenleri tanımamız gerekiyor. Mesela $GLOBALS[‘logged’][‘admin’] değişkeninde değer olarak true verildiyse, bu şu anda login olan kullanıcının yönetici yetkisinde olduğunu belirtir. Benzer şekilde $GLOBALS[‘logged’][‘member’] değişken değerinin true olması halinde ise, kullanıcının üye yetkisi vardır demektir. Bu değerlerin false olması, kullanıcının guest yetkisi ile girdiğini gösterir. Bu durudma örneğin sayfaya erişilmesini engellemek için yine Dolphin içerisinde bulunan displayAccessDenied fonksiyonu çağırılabilir. Bu fonksiyon, erişimin reddedildiğini gösterir. Ayrıca $GLOBALS[‘logged’] değişkeni her zaman bulunmayabilir. Modül kurulumu sırasında, ana dizinde gelen bloggie/request.php dosyası içerisidne check_logged fonksiyonunun çağırılması gerekir.

Buradaki bir diğer fonksiyon ise DesignBoxAdmin fonksiyonudur ve görsel olarak içeriğin bir kutu içerisinde görüntülenmesini sağlar. Fonksiyonun 3 parametresi bulunur. Bunlardan ilk ikisi, sırayla kutunun başlığı ve kutunun içeriğidir. Her ne kadar yukarıdaki kod örneğinde 3. parametre kullanılmamış olsa da, istenirse, kutu üzerinde bir menü tanımlamak için 3. parametre de kullanılabilir.

Sayfayı test etmek için aşağıdaki link kullanılabilir:


http://beta.odmproje.com/dolphin/m/bloggie/administration

aşağıdaki şekilde yazılan test sayfasının çalıştığı görülecektir.


3.2. Modül Ayarlarının Eklenmesi

Bu aşamada SQL komtuları kullanacağımızı düşünürsek, install.sql ve uninstall.sql dosyalarını hazırlamamız gerekir. İşe, bloggie/install/config.php dosyasını aşağıdaki hale getirerek başlayalım:

‘install’ => array(

‘update_languages’ => 1,

),

‘uninstall’ => array (

‘update_languages’ => 1,

),

Yukarıdaki mevcut dosyayı, aşağıdaki hale getiriyoruz:

‘install’ => array(

‘update_languages’ => 1,

‘execute_sql’ => 1,

),

‘uninstall’ => array (

‘update_languages’ => 1,

‘execute_sql’ => 1,

),

Ayrıca install.sql ve uninstall.sql dosyaları, ilgili modül ayarlarının saklanması için düzenlenmeli. Bu dosyalar install ve uninstall işlemleri sırasında otomatik olarak çalışmaktadır.

install.sql dosyasını aşağıdaki hale getiriyoruz:

SET @iMaxOrder = (SELECT `menu_order` + 1 FROM `sys_options_cats` ORDER BY `menu_order` DESC LIMIT 1);

INSERT INTO `sys_options_cats` (`name`, `menu_order`) VALUES (‘My Bloggie’, @iMaxOrder);

SET @iCategId = (SELECT LAST_INSERT_ID());

INSERT INTO `sys_options` (`Name`, `VALUE`, `kateg`, `desc`, `Type`, `check`, `err_text`, `order_in_kateg`, `AvailableValues`) VALUES

(‘me_blgg_date_format’, ‘Y-m-d H:i’, @iCategId, ‘Format for server date/time’, ‘digit’, ”, ”, ‘1’, ”),

(‘me_blgg_enable_js_date’, ‘on’, @iCategId, ‘Show user time’, ‘checkbox’, ”, ”, ‘2’, ”);

uninstall.sql dosyasını da aşağıdaki hale getirelim:

— settings

SET @iCategId = (SELECT `ID` FROM `sys_options_cats` WHERE `name` = ‘My Bloggie’ LIMIT 1);

DELETE FROM `sys_options` WHERE `kateg` = @iCategId;

DELETE FROM `sys_options_cats` WHERE `ID` = @iCategId;

Önemli bir nokta, bütün ayarların, sys_options tablosunda saklanması gerektiğidir. It is better to assign every setting option some category which is stored in the sys_options_cats database table, because it makes it easier to delete created categories in uninstall and display them. Also, it is good practice to make a prefix for all of your setting names to avoid conflicts with other mods.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir