Финансовая поддержка VPS, бесплатные дополнения и docs Донаты оплачивают сервер и двигают бесплатные дополнения MODX и документацию. Поддержать

Всего 126 097 комментариев

Maks
Maks
Не дает установить последнюю бета ту что в модсторе. Жму на дополнение из списка дополнений а там ничего нет. Как будто доступа нет или прав. Такая ситуация как с платными компонентами.
Madao
Madao
Планируется для опций товара возможность указания разных цен (аналог msOtionsPrice)?
Ибо это дополнение никак не развивается и не дорабатывается, и портироваться под MiniShop3 скорее всего не будет (даже сейчас есть проблемы по работе этого дополнения, которые никак не исправляются), а необходимость в таком функционале имеется и желательно в движке из коробки.
Михаил
Михаил
Николай Савин
Николай Савин
MODX, как и любой основанный на PHP фреймворк пишет 500 ошибки в error_log. Никаких специальных настроек в нем нет. Все зависит от настроек хостинга\сервера. Бывает что запись ошибок просто отключена, бывает что путь к журналу ошибок нестандартный. Короче вряд ли вопрос именно в MODX.
Юрий
Юрий
Ваш вариант с hash_class = hashing.modMD5 действительно рабочий — и именно поэтому он прямо описан в статье как быстрый аварийный способ.

Но статья не про “как один раз зайти”, а про стабильное восстановление доступа при переносах и бэкапах.
В реальности проблема часто не только в пароле, а в связке:

  • профиль пользователя,
  • группы и роли,
  • контекст manager.
В таких случаях правка одного поля в *_users даёт непредсказуемый результат, поэтому создание нового администратора в базе — самый надёжный путь.
Быстро зайти — да, ваш вариант.
Гарантированно восстановить доступ — другой сценарий.
ВитОс
ВитОс
Интернет до сих пор завален инструкциями 2010–2014 годов,
вы что в спутнике ищите
все работает нормально и не надо усложнять
В таблице *_users у пользователя значение в поле hash_class ставим hashing.modMD5, поля salt и cachepwd очищаем, а в поле password меняем значение на: d8578edf8458ce06fbc5bb76a58c5ca4
входим под поролем qwerty
протестил даже для интереса на тройке
Николай Савин
Николай Савин
Набросал вариант реализации плагина, чтобы можно было его вызвать дважды, передать изменения из первого во второй и применить оба изменения. При использовании $modx->eventData все работает.
<?php
  /**
   * Плагин: msDiscount10_v2
   * События: msOnGetCart
   *
   * Используем $modx->eventData для передачи между плагинами
   */

  switch ($modx->event->name) {
      case 'msOnGetCart':
          // Читаем данные: из $modx->eventData (если предыдущий плагин записал)
          // или из $scriptProperties (оригинальные)
          if (isset($modx->eventData['msOnGetCart']['data'])) {
              $data = $modx->eventData['msOnGetCart']['data'];
          } else {
              $data = $scriptProperties['data'];
          }

          if (!is_array($data) || empty($data)) {
              break;
          }

          // Применяем скидку 10%
          foreach ($data as $key => $item) {
              $data[$key]['price'] = $item['price'] * 0.9;
              $data[$key]['cost'] = $data[$key]['price'] * $item['count'];
          }

          // Сохраняем для следующих плагинов
          $modx->eventData['msOnGetCart']['data'] = $data;

          // И для контроллера MS3
          $modx->event->returnedValues['data'] = $data;
          break;
  }
Справедливости ради, в некоторых местах $modx->eventData игнорируется. Это исправлю к следующему релизу
Николай Савин
Николай Савин
{$_modx->runSnippet("!msCart", [])}
В корзине теперь есть обязательный параметр selector, где мы прописываем обычный JS селектор. Корзин может быть много. JS должен понимать куда монтировать обновленные данные.

Как это работает:
  1. При вызове msCart сниппет регистрирует себя с уникальным токеном
  2. После добавления товара сервер возвращает отрендеренный HTML с этим токеном
  3. JavaScript (CartUI.js:316-318) ищет selector чтобы знать куда вставить HTML
  4. Если selector не указан — обновление пропускается
Решение:

Оберните корзину в контейнер с id и укажите параметр selector:

<div id="header-cart">
      {$_modx->runSnippet('!msCart', [
          'selector' => '#header-cart',
          'tpl' => 'tpl.msMiniCart'
      ])}
  </div>
Или короче через Fenom:

<div id="header-cart">
      {'!msCart' | snippet : ['selector' => '#header-cart', 'tpl' => 'tpl.msMiniCart']}
  </div>
Важно:
  • selector — CSS-селектор контейнера куда будет монтироваться обновлённый HTML
  • Контейнер должен оборачивать вызов сниппета (HTML заменяется внутри него)
  • Для мини-корзины в шапке лучше использовать чанк tpl.msMiniCart
Артур Шевченко
Артур Шевченко
Нет с плагинами ничего не делал. Проблему я понял. Подумаю что можно сделать
Как вариант передавать данные, которые могут быть изменены в плагине, как публичные свойства класса.
Николай Савин
Николай Савин
Deprecated: Optional parameter $options declared before required parameter $info is implicitly treated as a required parameter in ....../core/components/minishop3/src/Model/msProductFile.php on line 201
Это известная проблема совместимости с PHP 8.0+. В файле msProductFile.php на строке 201 необязательный параметр объявлен перед обязательным, что устарело в PHP 8.

Временное решение:

Откройте файл core/components/minishop3/src/Model/msProductFile.php и измените строку 201:

// Было:
  public function makeThumbnail($options = [], array $info)

  // Стало:
  public function makeThumbnail(array $options, array $info)
Это временный фикс. Исправление будет включено в следующее обновление MiniShop3.