Розробка кастомного сніпета (Snippet) MODX

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

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

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

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

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Розробка кастомного сніпета (Snippet) MODX
Середня
~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

Розробка користувацького сніпету (Snippet) MODX

Сніпет MODX — PHP-код, що повертає строку для виводу у шаблоні. Це основний інструмент динамічної функціональності: списки товарів, фільтри, інтеграції з API, вирахування. Сніпет отримує параметри з шаблону та повертає HTML.

Структура сніпету

<?php
// Сніпет ProductList
// Вызов: [[!ProductList? &category=`5` &limit=`12` &sort=`price`]]

// Отримати параметри (з default значеннями)
$categoryId = (int)($scriptProperties['category'] ?? 0);
$limit      = (int)($scriptProperties['limit'] ?? 10);
$offset     = (int)($scriptProperties['offset'] ?? 0);
$sortField  = $scriptProperties['sort'] ?? 'menuindex';
$sortDir    = $scriptProperties['sortdir'] ?? 'ASC';
$tpl        = $scriptProperties['tpl'] ?? 'productCard';

// Запит до ресурсів через MODX API
$c = $modx->newQuery('modResource');
$c->where([
    'parent' => $categoryId,
    'published' => 1,
    'deleted'   => 0,
    'class_key' => 'modDocument',
]);

// Отримати TV значення через Join
$c->innerJoin('modTemplateVarResource', 'TVPrice', [
    'TVPrice.tmplvarid' => $modx->getObject('modTemplateVar', ['name' => 'price'])->id,
    'TVPrice.contentid = modResource.id',
]);
$c->select('modResource.*, TVPrice.value AS price');

$c->sortby($sortField, $sortDir);
$c->limit($limit, $offset);

$resources = $modx->getCollection('modResource', $c);

if (empty($resources)) return '';

$output = '';
foreach ($resources as $resource) {
    $data = array_merge($resource->toArray(), [
        'price'       => $resource->get('price'),
        'link'        => $modx->makeUrl($resource->id, '', '', 'full'),
        'image'       => $resource->getTVValue('product_image'),
    ]);

    // Чанк для виводу картки
    $output .= $modx->getChunk($tpl, $data);
}

return $output;

Сніпет з pdoTools (рекомендується)

pdoTools надає pdoFetch — швидкий та правильний спосіб робити запити:

<?php
// Сніпет ProductSearch з pdoTools
if (!$modx->loadClass('pdoFetch', MODX_CORE_PATH . 'components/pdotools/model/pdotools/', false, true)) {
    return 'pdoTools не встановлений';
}

$pdoFetch = new pdoFetch($modx, $scriptProperties);

$pdoFetch->addWhere([
    'modResource.parent' => (int)($scriptProperties['category'] ?? 0),
    'modResource.published' => 1,
]);

// TV join
$pdoFetch->addTVs('price,product_image,short_description');

$result = $pdoFetch->run();

return $result;

Сніпет з кешуванням

<?php
// Кешувати результат на 30 хвилин
$cacheKey = 'products_' . md5(json_encode($scriptProperties));
$cacheOptions = [xPDO::OPT_CACHE_KEY => 'default', xPDO::OPT_CACHE_EXPIRES => 1800];

$cached = $modx->cacheManager->get($cacheKey, $cacheOptions);
if ($cached !== null) return $cached;

// ... запит ...
$output = generateOutput($resources);

$modx->cacheManager->set($cacheKey, $output, 1800, $cacheOptions);
return $output;

Сніпет для інтеграції з зовнішнім API

<?php
// Сніпет WeatherWidget — погода з OpenWeatherMap
$city    = $scriptProperties['city'] ?? 'Moscow';
$apiKey  = $modx->getOption('weather_api_key');
$tpl     = $scriptProperties['tpl'] ?? 'weatherWidget';

$cacheKey = 'weather_' . $city;
$cached = $modx->cacheManager->get($cacheKey, [xPDO::OPT_CACHE_EXPIRES => 1800]);

if ($cached !== null) {
    return $modx->getChunk($tpl, $cached);
}

$url = "https://api.openweathermap.org/data/2.5/weather?q={$city}&appid={$apiKey}&units=metric&lang=uk";

$response = file_get_contents($url);
if (!$response) return '';

$data = json_decode($response, true);
if (!$data || $data['cod'] !== 200) return '';

$weather = [
    'city'        => $data['name'],
    'temp'        => round($data['main']['temp']),
    'feels_like'  => round($data['main']['feels_like']),
    'description' => $data['weather'][0]['description'],
    'icon'        => "https://openweathermap.org/img/wn/{$data['weather'][0]['icon']}@2x.png",
    'humidity'    => $data['main']['humidity'],
];

$modx->cacheManager->set($cacheKey, $weather, 1800);
return $modx->getChunk($tpl, $weather);

Передача параметрів у сніпет

[[!ProductList?
    &category=`[[*id]]`
    &limit=`12`
    &tpl=`productCardTpl`
    &sort=`price`
    &sortdir=`ASC`
]]

! перед імем — некешований вызов (динамічний контент). Без ! — кешований (статичний блок, однаковий для всіх).

Терміни

Розробка одного сніпету з запитом до ресурсів, кешуванням та чанком виводу — 0.5–2 дні. Складний сніпет з фільтрами, пагінацією та інтеграцією з API — 3–5 днів.