آموزش ساخت کامپوننت (افزونه) برای جوملا قسمت (1)

k2-4u

Well-Known Member
جوملا 1.5 دارایه یک فریم ورک قویه که کل اسکریپت با این فریم ورک کار می کنه .

در جوملا از معماری MVC استفاده شده (Model-View-Controller) . این آموزش هم بر مبنای معماری MVC هستش

معماری MVC در جوملا به وسیله 3 کلاس JModel , JView و JController. فریم ورک جوملا انجام میشه .

.
.و..

که برای اطلاعات بیشتر می تونین به رفرنس سایت جوملا مراجعه کنید

برای ساخت یک کامپوننت ساده ما به 5 فایل زیر نیاز داریم

فایل سمپل مورد نیاز برای آموزش را از اینجا دانلود کنید

site/hello.php : نقطه شروع کامپوننت از این فایل

site/controller.php : این فایل هم حاوی کنترلر اصلی ماست (کنترلر MVC )

site/views/hello/view.html.php : این فایل اطلاعات لازم رو دریافت میکنه و داخل template میریزه

site/views/hello/tmpl/default.php : این هم فایل template برای خروجی

hello.xml : این فایل هم شامل اطلاعاتی در مورد کامپوننت هستش که جوملا از این فایل برای نصب کامپوننتمون استفاده می کنه .



به این نکته توجه کنید . فایلی که برای شروع کامپوننت استفاده می کنید (در اینجا hello.php ) هم اسم نام

خود کامپوننت است .برای مثال اگر شما نام کامپوننت رو salam khobi pesaram بزارین

باید نام فایل hello.php و hello.xml به ترتیب salamkhobipesaram.php و

salamkhobipesaram.xml باشه و نام فولدر کامپوننت هم com_salamkhobipesaram

در غیر این صورت کامپوننت شما کار نخواهد کرد .

نکته : از کارکتر Underline (_) در نام کامپوننت و فایل ها استفاده نکنید .

برای اطلا ع از سیستم نام گذاری در جوملا به این آدرس مراجعه کنید

http://docs.joomla.org/Naming_conventions





نقطه شروع کامپوننت (در اینجا فایل hello.php )

جوملا همیشه از یک راه اجازه دسترسی شما به فایل های کامپوننت رو میده و اونم index.php

است و برای قسمت مدیریت هم index.php داخل فوادر administrator . کامپوننت مورد نظر

به صورت زیر قابل دسترسه

index.php?option=com_hello&view=hello
hello نام کامپوننت مورد نظر است و البته اگر آدرس رو به صورت زیر بزنید

index.php?option=com_hello
باز هم همون صفحه باز میشه (چون به صورت پیشفرض view=hello است مگر اینکه مقدار دیگه ای بهش بدین)

این آدرس در حقیقت باعث باز شدن فایل components/com_hello/hello.php میشود

که فایل اصلی ما برای شروع است . محتویات فایل hello.php به صورت زیر است

PHP:
<?php
/**
 * @package    Joomla.Tutorials
 * @subpackage Components
 * components/com_hello/hello.php
 * @link http://docs.joomla.org/Developing_a_Model-View-Controller_Component_-_Part_1
 * @license    GNU/GPL
*/

// No direct access
defined( '_JEXEC' ) or die( 'Restricted access' );

// Require the base controller

require_once( JPATH_COMPONENT.DS.'controller.php' );

// Require specific controller if requested
if($controller = JRequest::getWord('controller')) {
    $path = JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php';
    if (file_exists($path)) {
        require_once $path;
    } else {
        $controller = '';
    }
}

// Create the controller
$classname    = 'HelloController'.$controller;
$controller   = new $classname( );

// Perform the Request task
$controller->execute( JRequest::getWord( 'task' ) );

// Redirect if set by the controller
$controller->redirect();
خط 12 : مربوط به امنیت میشه و از اجرای فایل به صورت مستقیم از آدرس جلوگیری می کنه

خط 17 : JPATH_COMPONENT این ثابت حاوی آدرس مطلق کامپوننت فعلی است در این مثال

اینو "components/com_hello" بر می گر دونه . برای دسترسی به آدرس فولدر کامپوننت سایت و مدیریت

به ترتیب از ثابت JPATH_COMPONENT_SITE و JPATH_COMPONENT_ADMINISTRATOR

استفاده کنید که در این مثال مقدارشون "components/com_hello

و "administrator/components/com_hello" است

ثابت DS که در خط 22 استفاده شده جدا کننده فولدراست که معمولا slash (/) یا backslash (\) و به

سیستم عامل سرور بستگی داره

بعد از load شدن فایل کنترلر اصلی ( controller.php خط 17) در خط 21 در صورت نیاز به کنترل خاص دیگه

اونو load می کنه متد JRequest::getWord() به دنبال یک متغییر GET یا POST به نام controller

میگرده که در صورتی که وجود داشته باشه حاوی نام کنترل خاص مورد نظره . برای مثال اگر آدرس

index.php?option=com_hello&controller=controller_name باز بشه

مقدار این متد برابر میشه با controller_name و در نتیجه در خط 24 فایل این کنترلر load میشه

یعنی در اینجا میشه فایل "components/com_hello/controllers/controller_name.php"

در خط 33 شئ کلاس کنترلر که فایلش در خط 17 و یا خط 24 load شد ، ساخته میشه

اسم کلاس کنترل اصلی ما helloController است که در فایل com_hello/controller.php قرار داره

برای کنترلری به غیر از کنترلر اصلی نام کلاس به این صورت میشه {نام کنترلر}{Controller}{نام کامپوننت}

(ما در بالا نام کنترلر را controller_name مثال زدیم ) و آدرس فایلش به این صورت

php.{نام کنترلر}/controllers/{نام کامپوننت}_com است . و کنترل اصلی هم نام کلاسش به این صورت

{Controller}{نام کامپوننت} و آدرس فایلش controller.php/{نام کامپوننت}_com به این صورت

است .



بعد از اجرا شدن کلاس کنترلر . در خط 37 . متد execute این کلاس task مورد نظر رو از GET یا POST گرفته

و اجرا می کنه . برای مثال اگر آدرس index.php?option=com_hello&task=sometask

باز کنیم task ی با نام sometask اجرا میشه . در صورتی که task انتخاب نشه به صورت پیشفرض

'display' در نظر گرفته میشه و وقتی این task اجرا بشه شما رو به قسمت 'view' هدایت می کنه

تا مشخص بشه چه صفحه ای نمایش داده بشه . برای مثال task ها میتونن save , edit , new و ...

باشن.

بعضی وقت ها کنترلر نیاز داره که بعد از اجرای task های مثل save . صفحه رو به آدرس دیگه منتقل یا

redirect کنه برای همین از متد redirect() در خط 41 استفاده شده

نکته مهم : در جوملا 5.1 آخر فایل ها رو با تک php نبندین ! و بگذارید باز باشه



ساخت یک Controller

این کنترلر یک نمونه خیلی سادست که یک task داره و اونم کارش نمایش hello word! معروفه ! .

ما اینجا فقط یک متد به نام ()display داریم که این متد باید حتما با همین نام در کلاس کنترلر ما باشه

. کد زیر مربوط به کنترلر اصلی کامپوننت ما به آدرس com_hello/controller.php است

PHP:
<?php
/**
 * @package    Joomla.Tutorials
 * @subpackage Components
 * @link http://docs.joomla.org/Developing_a_Model-View-Controller_Component_-_Part_1
 * @license    GNU/GPL
 */

// No direct access

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

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

/**
 * Hello World Component Controller
 *
 * @package    Joomla.Tutorials
 * @subpackage Components
 */
class HelloController extends JController
{
    /**
     * Method to display the view
     *
     * @access    public
     */
    function display()
    {
        parent::display();
    }

}

سازنده کلاس JController جوملا همیشه متد ()display رو به عنوان task پیشفرض ریجستر می کنه

مگر اینکه تغییرش بدین ( به وسیله متد () registerDefaultTask ) .

متد ()display در واقع کاربردی نداره ! چون همیشه متد پدر رو اجرا می کنه . اما این یک مثال عملی خیلی

خوبه تا به ما کمک کنه بفهمیم داخل کنترلر چی میگذره

کار متد ()JController::display تعیین کردن view و layout به وسیله درخواستی که از صفحه

دریافت می کنه و اجرا کردن view و layout مورد نظره . کامپوننت ما در اینجا یک view و یک

layout (منظور از layout همون template خودمونه ) داره





ساخت یک view

taskی که برای view استفاده میشه بسیار ساده است : ابتدا اطلاعات رو برای نمایش دریافت می کنه

سپس اونا رو به template یا layout میفرسته . اطلاعات به وسیله متد JView::assignRef

به template فرستاده میشه . کد زیر فایل com_hello/views/hello/view.html.php

است .

PHP:
<?php
/**
 * @package    Joomla.Tutorials
 * @subpackage Components
 * @link http://docs.joomla.org/Developing_a_Model-View-Controller_Component_-_Part_1
 * @license    GNU/GPL
*/

// no direct access

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

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

/**
 * HTML View class for the HelloWorld Component
 *
 * @package    HelloWorld
 */

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

        parent::display($tpl);
    }
}
{/code}
 
ساخت یک templateفایل های template/layout جوملا .   فایل معمولی php  هستند  . متغییر های که به وسیله JView::assignRef   به این فایل ها ارسال می شود به این صورت در template قابل درسترس هستند  {نام}<-this$ یک مثال ساده برای نمایش متغییر greeting  در زیر {code type=php}

<?php

// No direct access

defined('_JEXEC') or die('Restricted access'); ?>
<h1><?php echo $this->greeting; ?></h1>

فایل معرف کامپوننت برای نصب - hello.xmlشما می تونین فایل های کامپوننت رو از طریق FTP کپی کنید و تغییرات دیتابیس هم دستی از طریق phpmyadmin انجام بدین . اما این روش برای تبدیل کردن کامپوننت به یک فایل zip است که از طریق مدیریت خود جوملا قابل نصبه این فایل حاوی : 1-توضیحات پایه در مورد کامپوننت (مثل نام کامپوننت ) , و اطلاعات دلخواهی مثل کپی رایت لالسنس و ... 2- لیست کامل فایل ها و فولدر های کامپوننت که باید کپی شوند 3- ممکن است کامپوننت شما نیاز به install/uninstall فایل sql داشته باشه که در اینجا می تونین این فایل ها رو برای اجرا لیست کنید 4- دستوراتی که هنگام install/uninstall کامپوننت نیاز به اجراشون دارین این هم یک مثال {code

PHP:
<?xml version="1.0" encoding="utf-8"?>
<install type="component" version="1.5.0">
 <name>Hello</name>
 <!-- The following elements are optional and free of formatting constraints -->
 <creationDate>2007-02-22</creationDate>
 <author>John Doe</author>
 <authorEmail>[email protected]</authorEmail>
 <authorUrl>http://www.example.org</authorUrl>
 <copyright>Copyright Info</copyright>
 <license>License Info</license>
 <!--  The version string is recorded in the components table -->
 <version>1.01</version>
 <!-- The description is optional and defaults to the name -->
 <description>Description of the component ...</description>

 <!-- Site Main File Copy Section -->
 <!-- Note the folder attribute: This attribute describes the folder
      to copy FROM in the package to install therefore files copied
      in this section are copied from /site/ in the package -->
 <files folder="site">
  <filename>controller.php</filename>
  <filename>hello.php</filename>
  <filename>index.html</filename>
  <filename>views/index.html</filename>
  <filename>views/hello/index.html</filename>
  <filename>views/hello/view.html.php</filename>
  <filename>views/hello/tmpl/default.php</filename>
  <filename>views/hello/tmpl/index.html</filename>
 </files>

 <administration>
  <!-- Administration Menu Section -->
  <menu>Hello World!</menu>

  <!-- Administration Main File Copy Section -->
  <files folder="admin">
   <filename>hello.php</filename>
   <filename>index.html</filename>
  </files>

 </administration>
</install>

منبع : http://docs.joomla.org/Developing_a_Model-View-Controller_Component_-_Part_1
 

جدیدترین ارسال ها

بالا