CMS Joomla! 1.5 натанхо CMS аст, балки фреймворк (framework) низ мебошад. Ин маънои онро дорад, ки Joomla дар худ имкониятхои васеъ барои офаридани барномахои иловагии дар мухити CMS Joomla! амалкунандаро дар бар мегирад.

Сохтори CMS Joomla 1.5 ба технологияи MVC (Model-View-Controller) мувофикат мекунад. Технологияи MVC - назария ва амалияи хозиразамони лоихакашии web-барномахои дарачаи мураккабиашон гуногун аст. Татбик шудани технологияи MVC дар Joomla ба мо имконият медихад, ки мо хусусиятхои нав ва ё иловагиро ба сайти худ хамрох кунем. Илова намудани хусусиятхои нав тавассути навиштан ва насб намудани барномахои иловаги (компонент, модул ва плагинхои худ) барои CMS Joomla! 1.5 ичро карда мешавад.

Мукадиммаи MVC (Model-View-Controller)

Дар ин дарс мо андаке дар бораи технологияи MVC накл мекунем, баъд як тарзи навиштани барномаи иловаги - компонент (component) барои Joomla-ро меорем.

Технологияи MVC (Model-View-Controller) талаб мекунад, ки барнома аз 3 чузъ иборат бошад:

- Модел (Model). Дар ин кисм мантики кории (business logic) лоиха офарида мешавад. Масалан, доду гирифт бо базаи маълумот, ё ичро намудани хисоб аз руи ягон алгоритм махз дар кисми Модел муайян мешавад. Инчунин, тарзи ичро фармонхои гуногун ба монанди илова, хорич ва ё ислох намудан низ дар файлхои ин кисм навишта мешаванд.

- Намоиш (View). Ин кисм иборат аст аз файлхое, ки тарзу намуди инъикоси маълумот дар экрани ташрифкунандаи сайтро муайян менамоянд. Яъне кисми Намоиш офарандаи HTML-код аст. Одатан дизайнер (ороишдиханда) махз бо хамин кисм ва танхо бо он кор мекунад.

-Идоракунанда (Controller). Идоракунанда ин барномаест, ки кори кисмхои Модел ва Намоишро хамоханг месозад: чи (кадом маълумоти аз кисми Модел хоричшаванда) чи тавр зухур меёбад (дар кадом кисми экран, ба кадом рангу андозаи кисми Намоиш муайянкунанда).

Бо чунин тарзи офаридани web-барнома гурухи барномасозон метавонанд аз болои як лоиха кор кунанд. Хангоми офаридани лоиха дар асоси MVC (новобаста нигох доштани кисмхои Модел ва Намоиш ва пайваст намудани онхо ба воситаи Идоракунанда) ва дуруст таксим намудани вазифахо, барномасозон интизори натичаи кори якдигар нашуда, метавонанд баробар аз болои кисмхои гуногуни лоиха кор кунанд, ки ин суръати офаридан ва ислох намудани лоихаро баланд мекунад.

Истифодаи MVC дар Joomla

Дар CMS Joomla! технологияи MVC тавассути синфхои JModel, JView ва JController амали гардонида шудааст.

Сохтани компонент барои Joomla

Акнун, кадам ба кадам тарзи сохтани компонент (component) барои CMS Joolma! 1.5-ро муоина менамоем.

Хамчун машк як компоненти соддае ба ном Salom меофарем.

Кадами 1. Шумо бояд CMS Joomla! 1.5-ро насб намоед ва ба файлу каталогхои он дастрас бошед.

Кадами 2. Азбаски компоненти мо Salom ном мегирад, дохили каталоги components-и сайтатон каталоги com_salom созед.

Кадами 3. Дохили каталоги com_salom каталогу файлхои зеринро созед:

com_salom/salom.php – даромад ба компонент

com_salom/controller.php - идоракунандаи компонент

com_salom/index.html - барои пинхон намудани мухтавои каталог

com_salom/salom.xml – XML-файле, ки дар худ маълумот оиди чойгиршавии файлу каталогхои компонентро нигох медорад.

com_salom/views/index.html - барои пинхон намудани мухтавои каталог

com_salom/views/salom/index.html - барои пинхон намудани мухтавои каталог

com_salom/views/salom/view.html.php - маълумоти аз идоракунанда меомадагиро коркард намуда, ба колаб инъикос менамояд

com_salom/views/salom/tmpl/index.html - барои пинхон намудани мухтавои каталог

com_salom/views/salom/tmpl/default.php – колаб барои ба экран баровардани маълумот

Чойгиршавии файлу каталогхо бояд мувофики накшаи зерин бошад:

Холо ба холи будани файл ё каталогхо ахамият надихед.

Дар CMS Joomla! хама дархостхо тавассути як файл index.php, ки дар каталоги асосии (решагии) сайт чойгир аст, ичро карда мешаванд. Ин файлро bootstrapper меноманд. Яъне index.php ин нуктаи марказиест, ки факат ва факат тавассути он ба дигар сахифахои сайт ворид шудан мумкин аст.

Нуктаи маркази барои ворид шудан ба кисми мудири сайт administrator/index.php аст.

Хар як компонент худ низ чунин нуктаи марказии воридшавиро доро аст. Дар мисоли мо, азбаски номи компонент Salom аст, пас номи каталоги компоненти мо com_salom бояд бошад ва дохили каталоги com_salom файли марказии salom.php бояд бошад.

URL барои дастрас намудани компоненти мо чунин мешавад:

index.php?option=com_salom&view=salom

Кадами 4. Коди зеринро дар файли salom.php чойгир намоед:

/**
* @package Oftob.com
* @subpackage Salom
* components/com_salom/salom.php
* @link http://oftob.com/
* @license GNU/GPL
*/

// Мухофизат аз дастрасии бевоситаи скрипт
defined( '_JEXEC' ) or die( 'Restricted access' );

// Бунёди идоракунандаи асоси.
require_once( JPATH_COMPONENT.DS.'controller.php' );

// Агар идоракунандаи мушаххас талаб шуда бошад, бунёд кардани он
if($controller = JRequest::getVar( 'controller' )) {
require_once( JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php' );
}

// Сохтани синф барои компонент
$classname = 'SalomController'.$controller;
$controller = new $classname( );

// Ичро намудани вазифаи Request
$controller->execute( JRequest::getVar( 'task' ) );

// Гузариш, агар он аз тарафи идоракунанда муайян шуда бошад
$controller->redirect();

?>

Эзох:

Дар ибтидо тафтиши бехатари ичро карда мешавад.

JPATH_COMPONENT ин тагйирёбандаест, ки дар он рохи мутлак ба компоненти чори нигох дошта мешавад. Дар холати мо он ба components/com_salom баробар аст.

Агар рох ба компоненти кисми Front End (кисме, ба ташрифкунандагон намудор аст) аз тагйирёбандаи глобалии PATH_COMPONENT_SITE истифода бурдан мумкин аст.

Агар рох ба компоненти кисми Back End (кисме, ба мудирони сайт намудор аст) аз тагйирёбандаи глобалии PATH_COMPONENT_ADMINISTRATOR истифода бурдан мумкин аст.

DS ин рамзи чудо намудани каталогхо: '\' ё '/'. Худи Joomla муайян мекунад, ки кадоме аз ин ду рамз дар системи шумо истифода мешавад.

Баъди бунёди идоракунандаи асоси, идоракунандаи мушаххас низ муайян шуданаш мумкин аст. Гарчанде ки дар ин мисол танхо факат идоракунандаи асоси истифода мешавад, лекин имконияти бунёди идоракунандаи мушаххас низ нигох дошта шудааст.

JRequest: getVar() кимати тагйирёбандаи бо URL (бо методи GET ё POST) омадаро мегирад. Масалан, агар дар URL

index.php?option=com_salom&controller=controller_name

бошад, мо метавонем номи контролерамонро муайян кунем:

echo JRequest::getVar('controller');

Дертар дар файли com_salom/controller.php идоракунандаи SalomController муайян мешавад. Дар як компонент якчанд идоракунандахо вучуд дошта метавонанд. Тарзи илова намудани идоракунандахоро дар мисолхои дигар мебинем.

Баъди сохта шудани идоракунанда ба он вазифа барои ичроиш супорида мешавад. Дар URL ин чунин аст:

index.php?option=com_salom&task=sometask

Агар вазифа бо тагйирёбандаи task муайян нашуда бошад, онгох вазифаи display ичро мешавад (default task). Хангоми ичро намудани вазифаи display, тагйирёбандаи view муайян мекунад, ки махз чи инъикос шавад. Мисоли вазифахои дигар: save, edit, delete, new, ...

Идоракунанда оиди зарур будани гузариш (redirect) ба хулоса ояд. Масалан, баъди ичрои вазифаи save. Оператори охирони коди болои барои гузариш аст.

Нуктаи марказии воридшавии компонент salom.php идораро ба идоракунанда controller.php месупорад, ки он дар навбати худ вазифаи дар URL муайяншударо ичро мекунад.

Кайд мекунем, ки рамзхои ?>, ки одатан барои махкамкардани php-скрипт истифода мешаванд,навишта нашудаанд. Ин барои пешгирии хоричи рамзхои номуфид карда шудааст. Дар php-скриптхои Joomla 1.5 ин тарзи рафтор одди кабул шудааст.

Сохтани Идоракунанда

Компоненти мо бояд дар аввал як вазифаи содда, чоп намудани "Салом!"-ро, бояд ичро кунад. Аз сабаби хело содда будани вазифа, идоракунанда низ хело содда мешавад. Коркарди маълумоте хануз лозим нест. Ягона коре, ки ичро намудан лозим аст, ин ба кор андохтани view - намоиши мувофик. Пас, дар идоракунандаи мо танхо як метод (method) display навишта мешавад. Аксарияти имкониятхои ба мо лозима алакай дар синфи JController навишта шудааст. Ва мо методи мувофик JController::display()-ро аз ин синф истофида мебарем.

Код барои идоракунандаи асоси дар файли com_salom/controller.php:

 /**
* @package Oftob.com
* @subpackage Salom
* components/com_salom/salom.php
* @link http://oftob.com/
* @license GNU/GPL
*/

// Мухофизат аз дастрасии бевоситаи скрипт

defined( '_JEXEC' ) or die( 'Restricted access' );

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

/**
* Salom Component Controller
*
* @package Joomla.Tutorials
* @subpackage Components
*/

class SalomController extends JController
{
/**
* Метод барои даъвати Намоиш
*
* @access public
*/
function display()
{
parent::display();
}
}

?>

Конструктори JController вазифаи display()-ро ба кайд мегирад ва онро хамчун вазифаи ибтидои (default) насб мекунад, то он вакте вазифаи дигар ба воситаи методи registerDefaultTask() хамчун вазифаи ибтидои таин гардад.

Методи JController :: display () аз сатри дархост номи намоишро гирифта, ин намоишро барои инъикоси мухтаво татбик мекунад.

Сохтани Намоиш

Вазифа содда аст. Маълумотеро, ки бояд инъикос шавад, гирифта, онро ба колаб даровардан даркор аст. Мауълумот ба колаб тавассути методи JView::assignRef ворид карда мешавад.

Код барои com_salom/views/salom/view.html.php:

 /**
* @package Oftob.com
* @subpackage Salom
* components/com_salom/salom.php
* @link http://oftob.com/
* @license GNU/GPL
*/

// Мухофизат аз дастрасии бевоситаи скрипт
defined( '_JEXEC' ) or die( 'Restricted access' );

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

/**
* HTML View class for the Salom Component
*
* @package Oftom.com
*/

class SalomViewSalom extends JView
{
function display($tpl = null)
{
$greeting = "Salom!!!";
$this->assignRef( 'greeting', $greeting );

parent::display($tpl);
}
}

?>

Сохтани Колаб

Колаби CMS Joomla! ин мачмуи php-файлхо аст. Мачмуе, ки барои ба тарзи лозима (андоза, мавкеъ, ранг ва гайра) маълумоти лозимаро дар экрани истифодабаранда инъикос кардан, зарур аст.

Тагйирёбандахои тавассути методи JView::assignRef муайяншудааз колаб бо истифодаи $this->{propertyname} дастрас шуда метавонанд (мисоли поёни инро нишон медихад).

Колаби мо содда буда, саломи аз тарафи Намоиш ба колаб ирсолшударо чоп мекунад:

 // Мухофизат аз дастрасии бевоситаи скрипт
defined('_JEXEC') or die('Restricted access');

?>

greeting; ?>

Матни пурраи ин компонентро аз инчо гирифта метавонед: com_salom.zip