سبد (0)

backend یا بخش مدیریت

بخش مدیریت کامپوننت (backend) در جوملا

طراحی رابط بخش مدیریت (backend)، منجر به ایجاد حداقل یک طرح سه قسمتی (Model-View-Controller) خواهد شد.


در پایان این بیاموز خواهید توانست

در پایان این بیاموز می توانید از طریق مدیریت جوملا، اطلاعات جدول helloworld__# که از پایگاه داده واکشی می شود را نمایش دهید:

نمایش اطلاعات جدول helloworld__#

1- در مدیریت جوملا، منوی (کامپوننت ها => hello-world) را اجرا نمایید.
مطابق شکل زیر، بعد از کلیک روی منوی بالا، فرم زیر ظاهر می شود و دو رکورد اطلاعاتی در یک جدول به همراه امکان صفحه بندی (pagination) نمایش داده می شود. توجه فرمایید که اطلاعات این لیست از پایگاه داده جوملا، واکشی شده است. (جدول helloworld__#)

نمایش جدول اطلاعات سمت backend در جوملا

فایل نصب کامپوننت

در فایل نصب کامپوننت، قسمت های قرمز رنگ مطابق شکل زیر، اضافه یا تغییر خواهند کرد:

بخش مدیریت کامپوننت (backend) در جوملا

توجه: در انتهای این بیاموز، فایل نصب کامپوننت برای دانلود قرار داده شده است.


فایل admin/helloworld.php (نقطه شروع کامپوننت سمت backend)

نقطه شروع کامپوننت سمت backend، فایل admin/helloworld.php است.

در هسته جوملا کلاسی بنام JController وجود دارد که تمام کنترلرها را مدیریت می کند.

از کلاس JController باید در کامپوننت مان استفاده نماییم. بنابراین آنرا در نقطه شروع کامپوننت، گسترش (extend) می دهیم.

در فایل admin/helloworld.php قطعه کد زیر را قرار دهید:

admin/helloworld.php

<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
 
// import joomla controller library
jimport('joomla.application.component.controller');
 
// Get an instance of the controller prefixed by HelloWorld
$controller = JController::getInstance('HelloWorld');
 
// Get the task
$jinput = JFactory::getApplication()->input;
$task = $jinput->get('task', "", 'STR' );
 
// Perform the Request task
$controller->execute($task);
 
// Redirect if set by the controller
$controller->redirect();

در جوملا با استفاده از متد ()jimport، می توانید محتویات یک فایل PHP را داخل یک فایل PHP دیگر درج کنید. بنابراین با توجه به ورودی این متد، نهایتاً کلاس JController به صفحه جاری اضافه می شود.

با استفاده از متد استاتیک ()getInstance، یک نمونه از کلاس JController با نام HelloWorldController ایجاد می شود. به طور پیش فرض جوملا کلاسی را که با پیشوند HelloWorld در فایلی به نام controller.php وجود دارد را صدا می زند.

هنگامی که هیچ taskی درخواست نشده باشد، task پیش فرض اجرا خواهد شد. task پیش فرض display است. در کلاس JController یک چنین taskی تعریف شده است.

Note فقط یک نکته برای تکمیل: شما می توانید با استفاده از لینکی شبیه زیر، گذشته از تابع ()display، تابعی دیگر را صدا بزنید:
http://localhost/administrator/index.php?option=com_helloworld&task=insert
این لینک، تلاش می کند که تابع ()insert را از کنترل مان صدا بزند. (در واقع باید در کلاس HelloWorldController پیاده سازی شده باشد)

فایل admin/controller.php (کنترلر عمومی)

حالا، ما باید در فایل controller.php کلاسی با نام HelloWorldController تعریف کنیم. کد های این فایل به صورت زیر است:

admin/controller.php

<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
 
// import Joomla controller library
jimport('joomla.application.component.controller');
 
/**
 * General Controller of HelloWorld component
 */
class HelloWorldController extends JController
{
        /**
         * display task
         *
         * @return void
         */
        function display($cachable = false, $urlparams = false) 
        {
                // set default view if not set
                $input = JFactory::getApplication()->input;
                $input->set('view', $input->getCmd('view', 'HelloWorlds'));
 
                // call parent behavior
                parent::display($cachable);
        }
}

این controller بصورت پیشفرض، "HelloWorlds" را بعنوان view نمایش خواهد داد.


فایل admin/views/helloworlds/view.html.php (ایجاد view)

زمانی که JController می خواهد یک view را نمایش دهد، بدنبال فایل های معین در فولدر زیر می گردد:

administrator/components/com_[component_name]/views/[name of view]/

قسمت [name of view] نام فولدر view است و نام پیش فرض، helloworlds است. یعنی بصورت زیر:

administrator/components/com_helloworld/views/helloworlds/

View، فایلی را که شامل اسم فایلی با نام view.[view_mode].php باشد را صدا می زند. در اینجا view mode پیش فرض و شاید تنها viewی که کامپوننت نیاز دارد html می باشد.

اکنون کد های فایلی به اسم view.html.php را ایجاد می کنیم:

admin/views/helloworlds/view.html.php

<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
 
// import Joomla view library
jimport('joomla.application.component.view');
 
/**
 * HelloWorlds View
 */
class HelloWorldViewHelloWorlds extends JView
{
        /**
         * HelloWorlds view display method
         * @return void
         */
        function display($tpl = null) 
        {
                // Get data from the model
                $items = $this->get('Items');
                $pagination = $this->get('Pagination');
 
                // Check for errors.
                if (count($errors = $this->get('Errors'))) 
                {
                        JError::raiseError(500, implode('<br />', $errors));
                        return false;
                }
                // Assign data to the view
                $this->items = $items;
                $this->pagination = $pagination;
 
                // Display the template
                parent::display($tpl);
        }
}

در کد فوق، متد display را که در کلاس JView تعریف شده است مجدداً برای کامپوننت جاری تعریف می کنیم.

تابع display از کلاس JView به طور پیش فرض توسط task ذکر شده در کلاس JController یعنی display صدا زده می شود.


فایل admin/views/helloworlds/tmpl/default.php

داده ها با استفاده از فایلی که در مسیر tmpl/default.php وجود دارد نمایش داده می شود.

کد های فایل default.php به صورت زیر است:

admin/views/helloworlds/tmpl/default.php

<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted Access');
 
// load tooltip behavior
JHtml::_('behavior.tooltip');
?>
<form action="<?php echo JRoute::_('index.php?option=com_helloworld'); ?>" method="post" name="adminForm">
        <table class="adminlist">
                <thead><?php echo $this->loadTemplate('head');?></thead>
                <tfoot><?php echo $this->loadTemplate('foot');?></tfoot>
                <tbody><?php echo $this->loadTemplate('body');?></tbody>
        </table>
</form>

این فایل، یک قالب یا layout است و توسط کلاس JView به view جاری اضافه می شود. بنابراین در اینجا، کلمه کلیدی this$ به کلاسی با نام HelloWorldViewHelloWorld اشاره می کند.

داخل این layout، چند sub-layout دیگر صدا زده می شود (head, foot , body). متناظر با هر sub-layout یک فایل php وجود دارد:

  1. default_head.php
  2. default_foot.php
  3. default_body.php

فایل admin/views/helloworlds/tmpl/default_head.php

کد های فایل default_head.php به صورت زیر است:

admin/views/helloworlds/tmpl/default_head.php

<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted Access');
?>
<tr>
        <th width="5">
                <?php echo JText::_('COM_HELLOWORLD_HELLOWORLD_HEADING_ID'); ?>
        </th>
        <th width="20">
                <input type="checkbox" name="toggle" value="" onclick="checkAll(<?php echo count($this->items); ?>);" />
        </th>                   
        <th>
                <?php echo JText::_('COM_HELLOWORLD_HELLOWORLD_HEADING_GREETING'); ?>
        </th>
</tr>

COM_HELLOWORLD_HELLOWORLD_HEADING_ID و COM_HELLOWORLD_HELLOWORLD_HEADING_GREETING متغیرهایی هستند که بعداً با توجه به زبان فعال سیستم، با یک متن جایگزین می شوند.

متد _::JText، رشته ورودی را با توجه به زبان جاری، ترجمه می کند.

checkAll یک تابع JavaScript است که در هسته جوملا تعریف شده است و با استفاده از آن می توان، تمام چک باکس هایی که در این ستون قرار دارند را در حالت انتخاب قرار داد و یا از حالت انتخاب خارج کرد.


فایل admin/views/helloworlds/tmpl/default_body.php

کد های فایل default_body.php به صورت زیر است:

admin/views/helloworlds/tmpl/default_body.php

<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted Access');
?>
<?php foreach($this->items as $i => $item): ?>
        <tr class="row<?php echo $i % 2; ?>">
                <td>
                        <?php echo $item->id; ?>
                </td>
                <td>
                        <?php echo JHtml::_('grid.id', $i, $item->id); ?>
                </td>
                <td>
                        <?php echo $item->greeting; ?>
                </td>
        </tr>
<?php endforeach; ?>

تابع _::JHtml یک helper است و با استفاده از آن می توان انواع کنترل های HTML را نمایش داد. در این مورد برای هر ردیف، یک چک باکس نمایش داده خواهد شد.


فایل admin/views/helloworlds/tmpl/default_foot.php

کد های فایل default_foot.php به صورت زیر است:

admin/views/helloworlds/tmpl/default_foot.php

<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted Access');
?>
<tr>
        <td colspan="3"><?php echo $this->pagination->getListFooter(); ?></td>
</tr>

 JPagination، یک کلاس در جوملا است که شما را قادر می سازد شیء pagination (صفحه بندی) را مدیریت و نمایش دهید.


فایل admin/models/helloworlds.php (ایجاد model)

viewی HelloWorlds از مدل متناظرش درخواست داده می کند، با استفاده از کلاس JModelList می توان، لیست داده را مدیریت نمود.

کلاس JModelList و تمام کلاس هایی که از آن ارث بری می کنند، تنها به یک متد و دو وضعیت (state) زیر نیاز دارند:

  • متد getListQuery که سازنده ی یک پرس و جوی SQL است.

و دو وضعیت (state):

  • list.start: برای تعیین کردن offset
  • list.limit: برای تعیین کردن طول لیست

توجه: متدهای getItems و getPagination در کلاس JModelList تعریف شده اند و نیازی به تعریف مجدد آنها در کلاس HelloWorldModelHelloWorlds نیست.

کد های فایل admin/models/helloworlds.php به صورت زیر است:

admin/models/helloworlds.php

<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
// import the Joomla modellist library
jimport('joomla.application.component.modellist');
/**
 * HelloWorldList Model
 */
class HelloWorldModelHelloWorlds extends JModelList
{
        /**
         * Method to build an SQL query to load the list data.
         *
         * @return      string  An SQL query
         */
        protected function getListQuery()
        {
                // Create a new query object.           
                $db = JFactory::getDBO();
                $query = $db->getQuery(true);
                // Select some fields
                $query->select('id,greeting');
                // From the hello table
                $query->from('#__helloworld');
                return $query;
        }
}

بصورت پیش فرض، زمانی که توسط متد getState یک وضعیت یا state خوانده می شود، بصورت اتوماتیک متد populateState صدا زده می شود.


فایل helloworld.xml

اگر این آموزش را از ابتدا دنبال فرموده باشید، فقط کافی است تغییرات زیر را در فایل xml، اعمال نمایید: (رنگ سبز)

helloworld.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- $Id: helloworld.xml 14 2009-11-02 18:35:20Z chdemko $ -->
<extension type="component" version="1.6.0" method="upgrade">

<name>Hello World!</name>
<!-- The following elements are optional and free of formatting conttraints -->
<creationDate>November 2009</creationDate>
<author>beyamooz</author>
<authorEmail>این آدرس ایمیل توسط spambots حفاظت می شود. برای دیدن شما نیاز به جاوا اسکریپت دارید</authorEmail>
<authorUrl>https://beyamooz.com</authorUrl>
<copyright>Copyright Info</copyright>
<license>License Info</license>
<!-- The version string is recorded in the components table -->
<version>0.0.7</version>
<!-- The description is optional and defaults to the name -->
<description>آموزش کامپوننت نویسی در جوملا- https://beyamooz.com</description>

<install> <!-- Runs on install -->
<sql>
<file driver="mysql" charset="utf8">sql/install.mysql.utf8.sql</file>
</sql>
</install>
<uninstall> <!-- Runs on uninstall -->
<sql>
<file driver="mysql" charset="utf8">sql/uninstall.mysql.utf8.sql</file>
</sql>
</uninstall>
<update> <!-- Runs on update; New in 1.6 -->
<schemas>
<schemapath type="mysql">sql/updates/mysql</schemapath>
</schemas>
</update>

<!-- 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>index.html</filename>
<filename>helloworld.php</filename>
<filename>controller.php</filename>
<folder>views</folder>
<folder>models</folder>
</files>

<administration>
<!-- Administration Menu Section -->
<menu>Hello World!</menu>
<!-- Administration 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 /admin/ in the package -->
<files folder="admin">
<!-- Admin Main File Copy Section -->
<filename>index.html</filename>
<filename>helloworld.php</filename>
<filename>controller.php</filename>
<!-- SQL files section -->
<folder>sql</folder>
<!-- tables files section -->
<folder>tables</folder>
<!-- models files section -->
<folder>models</folder>
<!-- views files section -->
<folder>views</folder>
</files>
</administration>

</extension>

توجه: توجه داشته باشید که در کد بالا، قسمت "<menu>Hello World!</menu>" باعث خواهد شد که در مدیریت جوملا، در منوی کامپوننت ها، زیر منوی Hello World نمایش داده شود.


دریافت فایل کامپوننت آموزشی Hello World (بخش هفتم)

ایجاد کننده:www.beyamooz.com

خرید فایل:دانلود فایل کامپوننت Hello World
حجم فایل: 4 کیلو بایت
قیمت: 1000 تومان

تمام درآمدها صرف پیشرفت بیاموز خواهد شد.

تمامی محصولات و خدمات این وبسایت، حسب مورد دارای مجوزهای لازم از مراجع مربوطه می‌باشند و فعالیت‌های این سایت تابع قوانین و مقررات جمهوری اسلامی ایران است.
logo-samandehi مجوز نشر دیجیتال از وزرات فرهنگ و ارشاد اسلامی پرداخت آنلاین -  بانک ملت معرفی بیاموز در شبکه سه