Розробка кастомного модуля Joomla

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Розробка кастомного модуля Joomla
Середня
~2-3 робочих дні
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Розробка користувацького модуля Joomla

Модуль Joomla — невеликий блок контенту, розміщуваний у позиціях шаблону. Відображає дані з БД, зовнішніх API, вирахує та виводить щось. Приклади: останні статті, форма пошуку, статистика відвідувань, курси валют.

Структура модуля

mod_product_highlights/
├── mod_product_highlights.php   # Точка входу
├── mod_product_highlights.xml   # Маніфест
├── src/
│   ├── Dispatcher/
│   │   └── Dispatcher.php
│   └── Helper/
│       └── ProductHighlightsHelper.php
├── tmpl/
│   └── default.php              # Шаблон
└── language/
    └── uk-UA/
        └── mod_product_highlights.ini

Маніфест

<?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>

Точка входу

// mod_product_highlights.php
\defined('_JEXEC') or die;

use Joomla\CMS\Helper\ModuleHelper;

// Joomla 4/5 стиль — через Dispatcher
$app = \Joomla\CMS\Factory::getApplication();
$module = $module ?? null;

echo ModuleHelper::renderModule($module, $params);

Helper

// src/Helper/ProductHighlightsHelper.php
namespace MyCompany\Module\ProductHighlights\Site\Helper;

use Joomla\CMS\Factory;

class ProductHighlightsHelper {
    public static function getProducts(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>

Кешування модуля

// У Helper — кешувати результат
public static function getProducts(object $params): array {
    $cacheId = md5('product_highlights_' . json_encode($params));

    $cache = Factory::getCache('mod_product_highlights', 'callback');
    $cache->setCaching(true);
    $cache->setLifeTime(15); // хвилин

    return $cache->get([static::class, '_fetchProducts'], [$params], $cacheId) ?: [];
}

Терміни

Розробка користувацького модуля з налаштовуємими параметрами, запитом до БД, шаблоном та кешуванням — 1–3 дні.