מודולי Joomla 4/5 מותאמים אישית מאפס – ממניפסט ועד קאשינג
אנו מפתחים מודולי Joomla מותאמים אישית מאפס. לאחרונה נתקלנו במשימה: להציג בלוק של "רבי מכר" בעמוד הבית של חנות מסחר אלקטרוני עם סינון לפי קטגוריה וקאשינג. פתרונות מוכנים לא עבדו – הם משכו סגנונות מיותרים ויצרו שאילתות N+1. כתבנו מודול משלנו ביומיים. כך אנחנו עושים את זה.
מודול Joomla מותאם אישית הוא לא רק ווידג'ט. הוא אלמנט בשליטה מלאה במיקום התבנית שלו. הוא יכול להציג נתונים מכל טבלאות, API חיצוניים, או לחשב ערכים תוך כדי ריצה. דוגמאות: חדשות אחרונות, טופס יצירת קשר, סטטיסטיקות מבקרים, שערי מטבע, המלצות מוצרים. המפתח הוא שהוא לא מאט את האתר ולא מתנגש עם הרחבות אחרות. כפי שנאמר במדריך פיתוח המודולים של Joomla, מודולים מותאמים אישית הם הבסיס לארכיטקטורה גמישה.
במאמר זה נעבור על דוגמה אמיתית: מודול שמציג מוצרי קטלוג מומלצים. נראה את המבנה, המניפסט, ה-helper עם קאשינג, ה-dispatcher והתבנית. והכי חשוב – איך להימנע מטעויות נפוצות: שאילתות כפולות, חוסר קאשינג, חוסר תאימות ל-Joomla 5.
למה מודול Joomla מותאם אישית עדיף על רכיב מוכן?
מודולים מוכנים מהמרקטפלייס לרוב עמוסים באפשרויות שאינך צריך לפרויקט שלך. הם יכולים להתנגש עם הרחבות אחרות, לדרוש ספריות נוספות ולהאט את העמוד. מודול מותאם אישית מכיל בדיוק את הקוד הדרוש למשימה. אתה שולט בכל שאילתת SQL, בכל תבנית ובכל הגדרה. התוצאה: זמן טעינה מינימלי (LCP < 2.5 שניות) וללא בקשות HTTP מיותרות. לדוגמה, בפרויקט אחד חסכנו ללקוח בעלויות אירוח על ידי אופטימיזציה של שאילתות וקאשינג.
מתי צריך מודול Joomla מותאם אישית?
מודול מותאם אישית מוצדק כאשר פתרונות סטנדרטיים אינם מספיקים: אינטגרציה עם API של צד שלישי, פלט מטבלאות לא סטנדרטיות, לוגיקת סינון מורכבת, או קאשינג שאינו נתמך על ידי מודולים מוכנים. הוא גם הכרחי כאשר ביצועים מקסימליים וגודל קוד מינימלי הם קריטיים. עלות הפיתוח מחושבת באופן אישי, אך ההשקעה משתלמת במהירות דרך חיסכון במשאבי שרת ובזמן תחזוקה.
איך ליישם קאשינג במודול Joomla?
קאשינג הוא המפתח לביצועים. ב-helper שלנו, אנו משתמשים ב-Cache API המובנה של Joomla: אנו עוטפים את שאילתת מסד הנתונים בקאש עם זמן חיים של 15 דקות. זה מפחית את עומס השרת ומאיץ את טעינת העמוד למשתמש.
מבנה המודול
מודול מותאם אישית סטנדרטי כולל את הקבצים הבאים:
-
mod_product_highlights.php— נקודת כניסה -
mod_product_highlights.xml— מניפסט -
src/Dispatcher/Dispatcher.php— dispatcher -
src/Helper/ProductHighlightsHelper.php— helper -
tmpl/default.php— תבנית -
language/ru-RU/...— קבצי שפה
מניפסט
דוגמת מניפסט
<?xml version="1.0" encoding="utf-8"?>
<extension type="module" client="site" version="4.0">
<name>mod_product_highlights</name>
<author>Your Company</author>
<version>1.0.0</version>
<description>Выделенные товары каталога</description>
<namespace path="src">MyCompany\Module\ProductHighlights</namespace>
<files>
<filename module="mod_product_highlights">mod_product_highlights.php</filename>
<folder>src</folder>
<folder>tmpl</folder>
</files>
<config>
<fields name="params">
<fieldset name="basic">
<field name="count" type="number" label="Количество товаров" default="4" min="1" max="12" />
<field name="category_id" type="sql" label="Категория" query="SELECT id AS value, title AS text FROM #__catalog_categories WHERE published = 1" default="" />
<field name="show_price" type="radio" label="Показать цену" default="1">
<option value="1">Да</option>
<option value="0">Нет</option>
</field>
</fieldset>
</fields>
</config>
</extension> Helper עם קאשינג
דוגמת Helper עם קאשינג
// src/Helper/ProductHighlightsHelper.php
namespace MyCompany\Module\ProductHighlights\Site\Helper;
use Joomla\CMS\Factory;
class ProductHighlightsHelper
{
public static function getProducts(object $params): array
{
$cache = Factory::getCache('mod_product_highlights', 'callback');
$cache->setCaching(true);
$cache->setLifeTime(15); // минут
$cacheId = md5('product_highlights_' . json_encode($params));
return $cache->get([static::class, '_fetchProducts'], [$params], $cacheId) ?: [];
}
public static function _fetchProducts(object $params): array
{
$db = Factory::getDbo();
$count = (int) $params->get('count', 4);
$catId = (int) $params->get('category_id', 0);
$query = $db->getQuery(true)
->select(['id', 'title', 'price', 'image', 'alias'])
->from($db->quoteName('#__catalog_products'))
->where($db->quoteName('published') . ' = 1')
->where($db->quoteName('featured') . ' = 1');
if ($catId) {
$query->where($db->quoteName('category_id') . ' = ' . $catId);
}
$query->order('ordering ASC')->setLimit($count);
$db->setQuery($query);
return $db->loadObjectList() ?: [];
}
} Dispatcher
// src/Dispatcher/Dispatcher.php
namespace MyCompany\Module\ProductHighlights\Site\Dispatcher;
use Joomla\CMS\Dispatcher\AbstractModuleDispatcher;
use MyCompany\Module\ProductHighlights\Site\Helper\ProductHighlightsHelper;
class Dispatcher extends AbstractModuleDispatcher
{
protected function getLayoutData(): array
{
$data = parent::getLayoutData();
$products = ProductHighlightsHelper::getProducts($data['params']);
$data['products'] = $products;
$data['showPrice'] = (bool) $data['params']->get('show_price', true);
return $data;
}
} תבנית
// tmpl/default.php
defined('_JEXEC') or die;
use Joomla\CMS\Router\Route;
?>
<div class="mod-product-highlights">
<?php foreach ($products as $product) : ?>
<div class="product-card">
<?php if ($product->image) : ?>
<img src="<?php echo $product->image; ?>" alt="<?php echo htmlspecialchars($product->title); ?>" loading="lazy">
<?php endif; ?>
<h4 class="product-card__title">
<a href="<?php echo Route::_('index.php?option=com_catalog&view=product&alias=' . $product->alias); ?>">
<?php echo htmlspecialchars($product->title); ?>
</a>
</h4>
<?php if ($showPrice && $product->price) : ?>
<p class="product-card__price"><?php echo number_format($product->price, 0, '.', ' '); ?> $</p>
<?php endif; ?>
</div>
<?php endforeach; ?>
</div>אנו שמים לב למאפייני alt: עבור תמונת המוצר במודול, אנו מגדירים alt התואם לשם המוצר. זה משפר נגישות ו-SEO.
תהליך העבודה
| שלב | משך |
|---|---|
| ניתוח ומפרט | יום אחד |
| פיתוח קוד | 1–2 ימים |
| בדיקות וניפוי שגיאות | יום אחד |
| אינטגרציה לפרויקט | חצי יום |
| סה"כ | 3–5 ימים |
השוואה: מודול מותאם אישית לעומת תוסף מוכן
| פרמטר | מודול מותאם אישית | תוסף מוכן |
|---|---|---|
| גמישות | מלאה (כל לוגיקה) | מוגבלת להגדרות |
| גודל | רק קוד הכרחי (~10–20 KB) | לעיתים 1–5 MB עם ספריות |
| ביצועים | מותאם למשימה | עלול להאט עקב שאילתות מיותרות |
| תלותיות | אין | עלול לדרוש הרחבות אחרות |
| תמיכה בגרסאות Joomla | ניתן להתאמה ל-4 ו-5 | לא תמיד מעודכן |
מה כלול
- מודול מוכן עם מניפסט, helper, dispatcher, תבנית וקבצי שפה.
- הגדרת קאשינג להפחתת עומס מסד הנתונים.
- תיעוד להתקנה והגדרה.
- ייעוץ בנושא מיקום במיקום התבנית הרצוי.
- תמיכה ל-30 יום לאחר המסירה.
לוח זמנים ועלות
פיתוח מודול מותאם אישית אורך 3 עד 5 ימים תלוי במורכבות. העלות מחושבת באופן אישי. אנו מבטיחים תאימות ל-Joomla 4 ו-5, וללא שגיאות קוד.
יש לנו ניסיון של שנים באופטימיזציה של שאילתות, קאשינג ויצירת ממשקי ניהול ידידותיים למשתמש. קבל הערכה מוקדמת תוך יום אחד – שלח את המשימה שלך. הזמן פיתוח מודול Joomla מותאם אישית וקבל קוד מוכן עם אחריות.
צור קשר כדי לדון במשימה שלך – נעזור ליישם פונקציונליות שמתאימה בצורה מושלמת לפרויקט שלך.







