Всего 123 801 комментарий

Денис Усманов
04 апреля 2023, 08:33
0
Каждый раз, для каждого товара вписывать индивидуально. Такая была задача от заказчика.
Максим
04 апреля 2023, 07:43
0
на WP и Opencart всё это бесплатно, плюс функционала больше
Если ты знаешь о существовании этих систем, имеешь какой-то опыт работы с ними и тебе кажется, что проще на них сделать, то можешь так и поступить. Наверное, так будет даже правильнее.

Почему мне стоит делать сайт на MODX с платной темой, где ещё за фильтр дополнительно платить нужно
Например, потому что кроме MODX ты ничего не знаешь, в программировании (верстке и т.п.) еще недостаточно хорош, у тебя мало времени.

А если клиенту предлагать, как его убедить?
Убедить в чем? Мне кажется, клиенту вообще на.. пофиг на какой системе ты будешь делать сайт. Ему важен лишь результат и общая стоимость работ.
deleted
04 апреля 2023, 00:25
+1
Так я ж не говорю, что не нужно. Просто мне интересно, кого может заинтересовать. У тебя ж наверняка есть образ потенциального пользователя). Вот допустим я выбираю, на чём сайт сделать и не разбираюсь во всём этом. Почему мне стоит делать сайт на MODX с платной темой, где ещё за фильтр дополнительно платить нужно, если на WP и Opencart всё это бесплатно, плюс функционала больше? А если клиенту предлагать, как его убедить?
deleted
04 апреля 2023, 00:12
0
modx 3 можно юзать если только от всех дополнений откажешься))
Считай с нуля начинать
Для опытных юзеров помоему никогда не зайдет, проще на новую CMS перейти
И при этом никаких значительных изменений нет. Разве что при написании сложного бэка видны будут. Так что не вижу смысла 3 использовать пока что
deleted
04 апреля 2023, 00:07
0
Цвета надо каждый раз вписывать иоли автодополнение есть?
deleted
04 апреля 2023, 00:00
+1
Я сейчас весь кастомный бэк в отдельной папке храню. Искать проще и можно на другой сайт быстро скопировать
Александр Мельник
03 апреля 2023, 20:03
0
php консоль в modx имеет свои секреты или это я не понимаю простых вещей?
Подскажите пожалуйста, почему код приведенный выше работает?
Мы задаем количество, задаем сдвиг. Делаем выборку чего либо, получаем массив объектов.
Иттерируемся по этим объектам, выполняем какую то логику.
Когда цикл завершился мы высчитываем новый сдвиг, дополнительно в цикле визуализируем «прогрессбар» НО что заставляет скрипт запустится снова? Почему происходит получение новых объектов и снова запускается цикл?
В моем понимании этот скрипт (конкретно тот что в заметке) должен отработать ровно 1 ресурс (поскольку step=1) и умереть.
Артур Шевченко
03 апреля 2023, 17:45
0
1. Открывать и закрывать нужно через класс, а не через инлайновый стили.
2. В чанке родителя делай проверку
{$_modx->resource.parent == $id ? 'open' : ''}
3. В чанке потомка делай проверку
{$_modx->resource.id == $id ? 'active' : ''}
Сергей
03 апреля 2023, 15:27
0
Отличный плагин, просто незаменимый при отладке. Проблем в его работе не найдено (MODx 3.0.3, PHP 8). Автору искреннее спасибо.
Артур Шевченко
03 апреля 2023, 13:59
+2
Чтобы отделить свой код от чужого. К тому же, мало ли что случится, если кому-то придёт в голову мысль переустановить ZoomX. В общем, я бы назвал это инкапсуляцией.
Николай Савин
03 апреля 2023, 13:49
0
А для чего нужно хранить контроллеры в «своей» папке? Чем родная не подходит?
Эдвард Ерохин
03 апреля 2023, 11:34
0
Подскажите пожалуйста, на последней версии список городов, и отделений выводит только после ввода. Возможно есть какой то способ, который позволит их все таки подгружать сразу а не после ввода первой буквы?
Артур Шевченко
03 апреля 2023, 10:34
0
Если вы начинающий, используйте Modx 2.8.5
Алексей Смирнов
03 апреля 2023, 08:43
0
Минишоп2 4.х не поддерживает MODX 3.
Дима Касаткин
02 апреля 2023, 18:25
0
Подскажите, кто пользуется, что означает функция «Удалить Пользователя» по правому клику в логе посетителей компонента (в моем кейсе все пользователи — гости, сайт без личного кабинета):


И я так понял, что если отметить «Благополучный», то этот User-Agent сможет получить доступ к сайту, верно? Или это IP?

P.S. Вообще это всё мог бы протестировать, но во-первых, страшно нажимать кнопки не глядя (можно и из поиска сайт выкинуть случайно), а во-вторых, ответы останутся тут, и кто-то следующий уже не экспериментируя будет знать что как настраивать!
Артур Шевченко
01 апреля 2023, 22:07
+1
В вёрстке добавляем блок
<div id="remain">0</div>
В ФАЙЛ со скриптами (потому что нужно блюсти чистоту кода) добавляем код:
$(document).on('msoptionsprice_product_action', function (e, action, form, response) {
       $('#remain').innerText = response.modification.count;   
});
Всё.
Николай Мирошниченко
01 апреля 2023, 21:47
0
Кому интересно, то вот так реализовал. Костыли, но работают…
На странице товара вывожу остаток модификации товара

<p class="msoptionsprice-count msoptionsprice-[[*id]] numeric-value" id="ajax-container">[[+count]]</p>
в footer добавил js с таким содержимым

document.addEventListener("DOMContentLoaded", function() {
  function handleAjax() {
    const numericElements = document.querySelectorAll(".numeric-value");
    for (let i = 0; i < numericElements.length; i++) {
      const value = parseFloat(numericElements[i].textContent);
      if (value === 0) {
        numericElements[i].textContent = "Нет в наличии";
      } else if (value > 0) {
        numericElements[i].textContent = "Есть в наличии";
      }
    }
  }
  document.addEventListener("ajaxLoad", handleAjax);
  setTimeout(function() {
    const newNumericValue = document.createElement("span");
    newNumericValue.textContent = "0";
    newNumericValue.classList.add("numeric-value");
    document.body.appendChild(newNumericValue);
    const newNumericValue2 = document.createElement("span");
    newNumericValue2.textContent = "10";
    newNumericValue2.classList.add("numeric-value");
    document.body.appendChild(newNumericValue2);
    const ajaxLoadEvent = new Event("ajaxLoad");
    document.dispatchEvent(ajaxLoadEvent);
  }, 3000);
  const observer = new MutationObserver(function(mutationsList) {
    for (const mutation of mutationsList) {
      if (mutation.type === "childList") {
        const ajaxLoadEvent = new Event("ajaxLoad");
        document.dispatchEvent(ajaxLoadEvent);
      }
    }
  });
  const ajaxContainer = document.querySelector("#ajax-container");
  if (ajaxContainer) {
    observer.observe(ajaxContainer, { childList: true });
  }
});