اگر با جوملا آشنا هستید، احتمالاً میدانید که قلب این سیستم مدیریت محتوا، کامپوننتها (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 Joomla\CMS\Component\Router\RouterFactoryInterface;
use Joomla\CMS\Dispatcher\ComponentDispatcherFactoryInterface;
use Joomla\CMS\Extension\ComponentInterface;
use Joomla\CMS\Extension\MVCComponent;
use Joomla\CMS\Extension\Service\Provider\ComponentDispatcherFactory;
use Joomla\CMS\Extension\Service\Provider\MVCFactory;
use Joomla\CMS\MVC\Factory\MVCFactoryInterface;
use Joomla\DI\Container;
use Joomla\DI\ServiceProviderInterface;
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 Mycomponent\Controller;
use Joomla\CMS\MVC\Controller\BaseController;
class DisplayController extends BaseController
{
protected $default_view = 'products';
public function display($cachable = false, $urlparams = false)
{
return parent::display($cachable, $urlparams);
}
}
گام ۴: ایجاد مدل (Model)
مدلها برای واکشی داده از پایگاهداده استفاده میشوند.
<?php
namespace Mycomponent\Model;
use Joomla\CMS\MVC\Model\ListModel;
use Joomla\Database\DatabaseInterface;
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 Mycomponent\View\Products;
use Joomla\CMS\MVC\View\HtmlView 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()استفاده کنید. - ورودیهای کاربر را با
Joomla\CMS\Factory::getApplication()->inputدریافت کنید و فیلتر کنید. - در صفحات ادمین، حتماً از
JHtml::_('form.token')برای جلوگیری از CSRF استفاده کنید.
گام ۸: ثبت منو، ماژول و پلاگین (اختیاری)
با ایجاد فایلهای mycomponent.xml و تعریف بخشهای <administration> و <files>، میتوانید کامپوننت خود را قابل نصب کنید و در منوی مدیریت نمایش دهید.
تجربهی عملی: کامپوننت فروشگاهی من
در یکی از پروژههای شخصیام، یک کامپوننت فروشگاهی ساده برای جوملا ۵ توسعه دادم که تنها ۱۲ فایل داشت، اما تمام قابلیتهای اولیهی یک فروشگاه — لیست محصولات، جزئیات، سبد خرید (با استفاده از سشن) و پرداخت آفلاین — را پوشش میداد. این انعطافپذیری، همان چیزی است که جوملا را برای من جذاب نگه داشته است.
جمعبندی
کامپوننتنویسی در جوملا ۵ دیگر آنقدرها هم پیچیده نیست. با رعایت ساختار MVC، استفاده از ابزارهای داخلی جوملا و رعایت اصول امنیتی، میتوانید در کمتر از چند ساعت، یک ماژول کاربردی و ایمن بسازید. این هنر، همان چیزی است که جوملا را از «سیستم مدیریت محتوا» به «چارچوب توسعهی کاربرد وب» تبدیل میکند.
