طراحی کامپوننت سفارشی در جوملا ۵ — راهنمای گام‌به‌گام برای توسعه‌دهندگان

اگر با جوملا آشنا هستید، احتمالاً می‌دانید که قلب این سیستم مدیریت محتوا، کامپوننت‌ها (Components) هستند. هر بخش اصلی سایت — از مطالب گرفته تا کاربران، فروشگاه و سیستم آموزش — یک کامپوننت مستقل است. این معماری، جوملا را به یک پلتفرم بسیار انعطاف‌پذیر تبدیل کرده است. در این مقاله، قصد داریم گام‌به‌گام نحوه‌ی ساخت یک کامپوننت سفارشی در جوملا ۵ را آموزش دهیم — از ساختار پوشه‌ها تا اتصال به پایگاه‌داده و پیاده‌سازی امنیت.

چرا کامپوننت‌نویسی در جوملا ۵ مهم است؟

جوملا ۵ (که بر پایه‌ی PHP 8 و فریم‌ورک Laravel-inspired ساخته شده) تغییرات عمیقی در معماری نسبت به نسخه‌های قبلی داشته است. این نسخه، توسعه‌ی کامپوننت‌ها را ساده‌تر، ایمن‌تر و متناسب با استانداردهای مدرن PHP کرده است. یادگیری این فرآیند نه‌تنها به شما امکان می‌دهد نیازهای خاص پروژه‌های خود را پیاده‌سازی کنید، بلکه پایه‌ای برای ساخت افزونه‌های حرفه‌ای و قابل بازفروشی فراهم می‌کند.

گام ۱: ساختار پوشه‌های یک کامپوننت جوملا ۵

تمام کامپوننت‌های جوملا در مسیر زیر قرار می‌گیرند:

/components/com_mycomponent/

در این مثال، com_mycomponent نام کامپوننت شماست (حتماً با پیشوند com_ شروع شود). ساختار استاندارد یک کامپوننت جوملا ۵ به این شکل است:

com_mycomponent/
├── src/
│   ├── Controller/
│   ├── Model/
│   ├── View/
│   └── Helper/
├── tmpl/
│   └── default.php
├── mycomponent.php
└── services/provider.php

گام ۲: فایل اصلی کامپوننت (mycomponent.php)

این فایل نقطه‌ی ورود کامپوننت است. معمولاً فقط یک خط دارد که کلاس اصلی را فراخوانی می‌کند:

<?php
defined('_JEXEC') or die;

use JoomlaCMSComponentRouterRouterFactoryInterface;
use JoomlaCMSDispatcherComponentDispatcherFactoryInterface;
use JoomlaCMSExtensionComponentInterface;
use JoomlaCMSExtensionMVCComponent;
use JoomlaCMSExtensionServiceProviderComponentDispatcherFactory;
use JoomlaCMSExtensionServiceProviderMVCFactory;
use JoomlaCMSMVCFactoryMVCFactoryInterface;
use JoomlaDIContainer;
use JoomlaDIServiceProviderInterface;

return new class implements ServiceProviderInterface
{
    public function register(Container $container)
    {
        $container->registerServiceProvider(new MVCFactory('\Mycomponent'));
        $container->registerServiceProvider(new ComponentDispatcherFactory('\Mycomponent'));
        $container->set(
            ComponentInterface::class,
            function (Container $container) {
                $component = new MVCComponent($container->get(ComponentDispatcherFactoryInterface::class));
                $component->setMvcFactory($container->get(MVCFactoryInterface::class));
                return $component;
            }
        );
    }
};

گام ۳: ایجاد کنترلر (Controller)

کنترلر وظیفه‌ی مدیریت درخواست‌ها را دارد. مثلاً برای نمایش لیست محصولات:

<?php
namespace MycomponentController;

use JoomlaCMSMVCControllerBaseController;

class DisplayController extends BaseController
{
    protected $default_view = 'products';

    public function display($cachable = false, $urlparams = false)
    {
        return parent::display($cachable, $urlparams);
    }
}

گام ۴: ایجاد مدل (Model)

مدل‌ها برای واکشی داده از پایگاه‌داده استفاده می‌شوند.

<?php
namespace MycomponentModel;

use JoomlaCMSMVCModelListModel;
use JoomlaDatabaseDatabaseInterface;

class ProductsModel extends ListModel
{
    public function __construct($config = [], DatabaseInterface $db = null)
    {
        if (empty($config['filter_fields'])) {
            $config['filter_fields'] = ['id', 'title', 'published'];
        }
        parent::__construct($config, $db);
    }

    protected function getListQuery()
    {
        $db = $this->getDatabase();
        $query = $db->getQuery(true)
            ->select('*')
            ->from($db->quoteName('#__mycomponent_products'))
            ->where($db->quoteName('published') . ' = 1');
        return $query;
    }
}

گام ۵: ایجاد نمای (View) و قالب (Template)

ویو مسئول آماده‌سازی داده‌ها برای نمایش است:

<?php
namespace MycomponentViewProducts;

use JoomlaCMSMVCViewHtmlView as BaseHtmlView;

class HtmlView extends BaseHtmlView
{
    protected $items;
    protected $pagination;

    public function display($tpl = null)
    {
        $this->items = $this->get('Items');
        $this->pagination = $this->get('Pagination');
        parent::display($tpl);
    }
}

و فایل قالب در /tmpl/default.php:

<?php defined('_JEXEC') or die; ?>
<div class="mycomponent-products">
  <?php foreach ($this->items as $item): ?>
    <div class="product-item">
      <h3><?php echo htmlspecialchars($item->title, ENT_QUOTES, 'UTF-8'); ?></h3>
    </div>
  <?php endforeach; ?>
  <div class="pagination">
    <?php echo $this->pagination->getPagesLinks(); ?>
  </div>
</div>

گام ۶: اتصال به پایگاه‌داده

برای ایجاد جدول، فایل install.mysql.utf8.sql در پوشه‌ی sql/ کامپوننت قرار دهید:

CREATE TABLE IF NOT EXISTS `#__mycomponent_products` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  `published` tinyint(1) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_persian_ci;

گام ۷: امنیت در کامپوننت‌نویسی

نکات کلیدی امنیتی:

  • همیشه از htmlspecialchars() برای خروجی‌های کاربری استفاده کنید تا از حملات XSS جلوگیری شود.
  • در کوئری‌ها از $db->quoteName() و $db->quote() استفاده کنید.
  • ورودی‌های کاربر را با JoomlaCMSFactory::getApplication()->input دریافت کنید و فیلتر کنید.
  • در صفحات ادمین، حتماً از JHtml::_('form.token') برای جلوگیری از CSRF استفاده کنید.

گام ۸: ثبت منو، ماژول و پلاگین (اختیاری)

با ایجاد فایل‌های mycomponent.xml و تعریف بخش‌های <administration> و <files>، می‌توانید کامپوننت خود را قابل نصب کنید و در منوی مدیریت نمایش دهید.

تجربه‌ی عملی: کامپوننت فروشگاهی من

در یکی از پروژه‌های شخصی‌ام، یک کامپوننت فروشگاهی ساده برای جوملا ۵ توسعه دادم که تنها ۱۲ فایل داشت، اما تمام قابلیت‌های اولیه‌ی یک فروشگاه — لیست محصولات، جزئیات، سبد خرید (با استفاده از سشن) و پرداخت آفلاین — را پوشش می‌داد. این انعطاف‌پذیری، همان چیزی است که جوملا را برای من جذاب نگه داشته است.

جمع‌بندی

کامپوننت‌نویسی در جوملا ۵ دیگر آن‌قدرها هم پیچیده نیست. با رعایت ساختار MVC، استفاده از ابزارهای داخلی جوملا و رعایت اصول امنیتی، می‌توانید در کمتر از چند ساعت، یک ماژول کاربردی و ایمن بسازید. این هنر، همان چیزی است که جوملا را از «سیستم مدیریت محتوا» به «چارچوب توسعه‌ی کاربرد وب» تبدیل می‌کند.

نوشته‌شده توسط روح‌الله بلوردی — طراح وب، خوشنویس و توسعه‌دهنده‌ی جوملا
وب‌سایت شخصی: balvardi.ir

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *