Всего 125 355 комментариев

Leo
Leo
19 февраля 2025, 10:17
0
UPD: Рабочий вариант — сниппет для вывода списка контекстов, может кому то пригодиться

<?php
$contexts = $modx->getCollection('modContext', ['key:NOT IN' => ['mgr']]); // Исключаем админский контекст

$list = [];
foreach ($contexts as $context) {
    $contextKey = $context->get('key');

    // Получаем название контекста из самого объекта modContext (а не из modContextSetting!)
    $contextName = $context->get('name'); 

    // Получаем настройки контекста (чтобы достать site_url)
    $contextSettings = $modx->getCollection('modContextSetting', ['context_key' => $contextKey]);
    $settings = [];

    foreach ($contextSettings as $setting) {
        $settings[$setting->get('key')] = $setting->get('value');
    }

    // Получаем URL (если не задан - пропускаем контекст)
    $siteUrl = isset($settings['site_url']) ? $settings['site_url'] : '';
    if (empty($siteUrl) || empty($contextName)) {
        continue;
    }

    $list[] = ['name' => $contextName, 'url' => $siteUrl];
}

// Сортируем список по названию
usort($list, function ($a, $b) {
    return strcmp($a['name'], $b['name']);
});

// Получаем текущий контекст
$currentContextKey = $modx->context->get('key');
$currentContext = $modx->getObject('modContext', ['key' => $currentContextKey]);

// Получаем его название (из поля "Название" в админке)
$currentContextName = $currentContext ? $currentContext->get('name') : $currentContextKey;

// Получаем site_url текущего контекста
$currentSettings = $modx->getCollection('modContextSetting', ['context_key' => $currentContextKey]);
$currentSiteUrl = '';

foreach ($currentSettings as $setting) {
    if ($setting->get('key') === 'site_url') {
        $currentSiteUrl = $setting->get('value');
        break;
    }
}

// Вывод HTML
$output = 'Текущий город - <strong>' . htmlspecialchars($currentContextName) . '</strong>';
$output .= '<select onchange="window.location=this.value">';
$output .= '<option value="">Выберите город...</option>';

foreach ($list as $item) {
    $selected = ($item['url'] == $currentSiteUrl) ? ' selected' : '';
    $output .= '<option value="' . htmlspecialchars($item['url']) . '"' . $selected . '>' . htmlspecialchars($item['name']) . '</option>';
}

$output .= '</select>';

return $output;
Дима Касаткин
19 февраля 2025, 03:10
+1
Вау, какой красивый и короткий код! Там где описане содержимого вкладки — просто магия какая-то! Давненько такого не видел))) Спасибо!

Из пожеланий, всё-таки не терять MODX-style и дать возможность использовать систему чанков полноценно, не прибегая в foreach циклам в коде шаблонизатора.

Думаю это выглядело бы примерно так:
{'!pbResources'|snippet: [
    ...
    'tables' => 'seo_list as list' // Присоединяем таблицу seo_list и заменяем имя на list
    'tpl_list' => 'list-data-item' // С префиксом tpl_ используется alias присоединенной выше таблицы. Если параметр не указан, list будет доступен как массив.
    'tpl' => 'pb-seo-card', // Чанк вывода
]}

Зачем это нужно?

Кроме избавления от циклов в коде для лаконичности и сохранения удобного MODX-стиля раздельного оформления повторяющихся элементов, который и так изрядно потреплен частым злоупотреблением гибкостью fenom-а) — ну, как минимум, дополнительно можно получить более глубокое кэширование и переиспользовать чанки где-то ещё в проекте.

А ещё там внутри чанка можно сделать доступным {$idx} и {$total} (его, возможно, и снаружи, с префиксом типа list_total или как-то так) чтобы не городить их опять же в коде чанка, который для разметк (aka верстки) предназначен, а не для логики.

Это конечно не правка бизнес-логики компонента, а больше к Developer Expierence, но вроде всё так красиво реализовано для разработчиков (уже), что такая вишенка на торт возможно придется кому-то (вроде меня :) ) очень кстати!
Vladyslav
18 февраля 2025, 20:22
0
спасибо, воспользовался вторым вариантом
Олег Захаров
18 февраля 2025, 13:21
+1
Мы ценим и уважаем Ваш труд! Спасибо!
Классно, теперь могу поставить клиентам. Мне больше нравится темная тема, но клиентам некоторым привычнее работать в светлой. Удобно что можно будет переключаться. Простая вещь, а как удобно.
Кефирка
18 февраля 2025, 13:10
0
Спасибо большое! На первом же сайте нашла подходящий для нас вариант.
Кефирка
18 февраля 2025, 12:51
0
Вид деятельности не подходит :( Там сущие копейки капают, но юмани отказали именно поэтому
ВитОс
18 февраля 2025, 12:38
0
Эквайринг для самозянятых нужен
два знаю
intellect money
pay any way
Артур Шевченко
18 февраля 2025, 10:33
1
+1
1. Написать свой класс оплаты, который сгенерирует ссылку на нужный ресурс.
2. Написать свой класс-обработчик заказа, который унаследует все методы стандартного и переопределит метод submit().
3. В JS проверять наличие в get-параметрах ключа msorder и делать редирект из JS.
4. Подумать над задачей ещё и раз и прийти к выводу, что данные любого ресурса можно вывести на любой странице, если известен ID ресурса.
Володя
18 февраля 2025, 08:50
+2
Так ребята — «не бузите» !)
По порядку поясняю:
— Новая версия пакета для PHP 8 разработана, потому что SDK Юманей поддерживает только PHP 8. И только новая версия SDK поддерживает новые методы оплаты. Что были необходимы клиенту.
— В репозитории модсторе новую версию был вынужден отключить, так как покупатели пакета жаловались что им недоступна старая версия под PHP < 8.
— Пакет под MODX2 и на PHP8 все работает.

PS. Кому необходимы новые методы оплаты и у кого сайт работает на PHP8 пишите в ТП — временно активирую пакет для скачивания. Пока только так.
Кирилл
17 февраля 2025, 22:54
0
Всем, доброго.
Подскажите, пожалуйста, данный компонент на локальном сервере (localhost/) проверить можно или он не будет там работать?
Александр
17 февраля 2025, 17:43
0
А кто говорил обратное? Пока это всё лишь предположения.
Артур Шевченко
17 февраля 2025, 17:41
0
зачем компонент с поддержкой PHP 8+ для MODx 2
А кто сказал, что компонент для Modx 2? Автор просто адаптировал компонент под новую версию php.
Александр
17 февраля 2025, 17:38
0
У меня скорее вопрос зачем компонент с поддержкой PHP 8+ для MODx 2 с поддержкой только PHP < 8, при этом в «репозитории» его по-прежнему нет.
Артур Шевченко
17 февраля 2025, 17:36
0
99% компонентов для Modx 2 не поддерживают php 8, отсюда вопрос зачем тебе php 8 если ты делаешь проект на Modx 2 или зачем ты делаешь проект на Modx 2 если тебе нужен php 8?
Артур Шевченко
17 февраля 2025, 17:31
0
А как вообще в miniShop2 с поддержкой PHP 8?
Нет там поддержки php 8 и, скорее всего, не будет, так как есть альфа релиз minishop3 и там поддержка есть.
Александр
17 февраля 2025, 17:23
0
Пока новая версия так и не появилась на маркетплейте, или в каком она репозитории?
А как вообще в miniShop2 с поддержкой PHP 8? Попробовал поставить — сразу сотни предупреждений посыпались в лог, даже от простой перезагрузки лога.
Stepan
17 февраля 2025, 16:54
0
Думал так можно выбрать только те опции которые мне нужны, но так не работает.
В принципе у вас в выборке нет опций, вы их присоединяете позже
Артур Шевченко
17 февраля 2025, 14:50
0
document.addEventListener('DOMContentLoaded', () => {
  const notyf = new Notyf(  {position: {
    x: 'center',
    y: 'top',
  }});

  FetchIt.Message = {
    success(message) {
      notyf.success(message);
    },
    error(message) {
      notyf.error(message);
    },
  }
});
Кирилл
16 февраля 2025, 00:50
0
Заметил баг, если установлен controlErrorLog или modalConsole, то на странице CronTabManager они не работают.
PR отправил github.com/astra-modx/modx-app-crontabmanager/pull/2