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

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

Ruslan
Ruslan
Добрый вечер.
Попробывал сделать по вашей рекомендации, но у меня в логах ошибок выдаёт такое.

ERROR	/var/www/............/core/components/sendit/services/sendit.class.php	234
PHP warning: include(/var/www/............../core/custom_auth_hooks/smsauth): failed to open stream: Нет такого устройства
ERROR	/var/www/............./core/components/sendit/services/sendit.class.php	234
PHP warning: include(): Failed opening '/var/www/............/core/custom_auth_hooks/smsauth' for inclusion (include_path='.:')
ERROR	/var/www/............/core/components/pdotools/model/pdotools/pdotools.class.php	875
Could not find the element file "core/elements/snippets/smsauth/snippet.sendcode.php".
ERROR	/var/www/........../core/components/pdotools/model/pdotools/pdotools.class.php	345
[pdoTools] Could not load snippet "@FILE snippets/smsauth/snippet.sendcode.php"
в чём может быть проблема?
Александр Туниеков
Александр Туниеков
Из-за сложной структуры extJS оказалось, что нужно написать бессмысленно много PHP кода. Когда счет новых процессоров пошел на второй десяток — пришлось остановиться
Вообще конечно когда классные процессоры выпустили для MODX это было думаю круто. Наверно сократило кол-во кода. Наумкин помню ими восторгался. Но все равно это для меня оказалось не хорошим решением. Кода все равно много писать пришлось. Для getTables я CRUD делал в одном файле. Это сократило кол-во контроллеров php с 5-7 на таблицу на 1 контроллер общий для всех таблиц.
Можно попробовать процессоры create, getlist, update и т.д. переписать на 1 процессор на таблицу для extJS. Или может даже 1 процессор на все таблицы. Но здесь не уверен. ExtJs сейчас уже подзабыл.

Либо у нас сейчас есть крутые ИИ и с задачей написать кучу однотипных процессоров Cursor думаю справиться :-). Только промт сообразить как написать :-).
Александр Туниеков
Александр Туниеков
Блин курсор прям чума :-).
Написал промт
Теперь выбери специфичные для организации ВК24 данные. Запиши их в фай импорта системных настроек для MODX2 _build\configs\settings.js в нужном формате. В gsdoc.class.php добавь получение настроек и передачу их в getChunk. В чанке замени данные плейсхолдерами.
Прикрепил файлы.
Потом
Еще добавь наастройку для Директор ООО «ВК24». ООО «ВК24» company_short_name. идобавь настройки для логотипов и печати
И потом просто aply, aply и aply :-). И все работает.
Так бы делал час, а сделал за 20 минут. Просто промт долго соображал как написать :-)
Артур Шевченко
Артур Шевченко
Во-первых, radio это переключатель, это означает, что он должен иметь какое-то значение изначально, соответственно и валидация не нужна. Во-вторых, если выше сказанное противоречит твоему мировосприятию, попробуй валидатор checkbox.
Наумов Алексей
Наумов Алексей
Из дополнений к VS Code я иногда юзаю Amazon Q, он умеет подсказывать код в процессе написания, иногда прям весьма и весьма хорошо себе.
К примеру пишешь метод updateStatus(MyClass $class, string $status), так он в теле метода предлагает все сделать — установить статус, сохранить объект, вернуть его, в общем время может экономить.

Но с большими объемами кода ИИ вечно косячит, может просто взять и половину логики потерять, речь в частности просто о ChatGPT. Поэтому простыням кода от него я не доверяю.
cronAbs
cronAbs
Нужно проверять метод save в файле assets/components/tickets/js/web/default.js
Там лаг с label id и input id и как раз если убрать из label id, то и произойдёт ошибка. Конечно если важно, чтобы валидатор был без ошибок, то нужно добавить class и в скрипте поменять "#" на "."
// Чанк с формой
<label for="comment-captcha" class="comment-captcha"[[-id="comment-captcha"]]>[[+captcha]]</label>
<input type="text" name="captcha" value="" id="comment-captcha" class="form-control" />
// Метод save
save: function (form, button) {
    $(form).ajaxSubmit({
        data: {action: 'comment/save'},
        url: TicketsConfig.actionUrl,
        form: form,
        button: button,
        dataType: 'json',
        beforeSubmit: function () {
            clearInterval(window.timer);
            $('.error', form).text('');
            $(button).attr('disabled', 'disabled');
            return true;
        },
        success: function (response) {
            form = '#comment-form';
            $(button).removeAttr('disabled');
            $(document).trigger('tickets_comment_save', response);
            if (response.success) {
                Tickets.forms.comment(false);
                $('input[name="captcha"]', form).val('');
                $('#comment-preview-placeholder').html('').hide();
                $('#comment-editor', form).val('');
                $('.ticket-comment .comment-reply a').show();

                // autoPublish = 0
                if (!response.data.length && response.message) {
                    Tickets.Message.info(response.message);
                }
                else {
                    Tickets.comment.insert(response.data.comment);
                    Tickets.utils.goto($(response.data.comment).attr('id'));
                }

                Tickets.comment.getlist();
                prettyPrint();
            }
            else {
                var cap = $('#comment-form-placeholder label[for=comment-captcha]').text().replace(/[^0-9+]/gi, '');
                if (cap.indexOf('+') > 0 ) {
                    numbers = cap.split('+');
                } else {
                    numbers = cap.split('-');
                }
                var sum = numbers.reduce(function(a, b) {
                    return parseInt(a) + parseInt(b);
                }, 0);
                
                if (response.data && $('input[name="captcha"]', form).val() != sum) {
                    Tickets.Message.error(response.message);
                    var errors = [];
                    var i, field;
                    for (i in response.data) {
                        field = response.data[i];
                        var elem = $(form).find('[name="' + field.field + '"]').parent().find('.error');
                        if (!elem.length) {
                            elem = $(form).find('.' + field.field + '-error');
                        }
                        if (elem.length) {
                            elem.text(field.message)
                        }
                        else if (field.field && field.message) {
                            errors.push(field.field + ': ' + field.message);
                        }
                    }
                    if (errors.length) {
                        Tickets.Message.error(errors.join('
'));
                    }
                    $('input[name="captcha"]', form).val('');
                }
            }
            if (response.data.captcha) {
                $('.comment-captcha', form).text(response.data.captcha);
            }
        }
        
    });
    return false;
},

К слову: Только вот непонятно почему после этих изменений отправляется только после второго раза, как жмешь кнопку отправить. То есть приходится вводить капчу 2 раза или/ жмешь отправить, а потом только вводишь, зато хоть работает, пример выше.
Riwka
Riwka
Павел, скрипт у вас просто замечательный! Только одно но, или 2, смотря как считать… Сниппет требует от браузеров пользователей очень много ресурсов и долго загружается, что понижает показатели сайта, которые сейчас очень важны для поисковиков. В его js файле используется JQ, который, в свою очередь, требует подключения соответствующей библиотеки. Подгружать сниппет аяксом не получается, поскольку тогда не срабатывают обработчики js, из-за того что соответствующих объектов нет в DOM. Пробовала откладывать загрузку js до полной прогрузки страницы, но тогда вылезает ошибка как в комментарии Кровельного. Скажите, пожалуйста, у вас в планах есть желание переписать сниппет сделав возможным его отложенную загрузку, или вы его забросили?
Riwka
Riwka
Я с таким встречалась когда пыталась отложить загрузку скрипта, т. е. у вас код js не успевает обрабатываться до вызова нового объекта. Как-то так.
Алексей Шумаев
Алексей Шумаев
Это не «хотелка», а обязательный стандартный функционал любого магазина.
Причём с механикой уведомлений о том, что цена в корзине изменилась в ту или иную сторону и на сколько.
Тоже самое с остатками.
Компоненты скидок и т.п. сами должны реализовывать свою логику в зависимости от изменения цены товара в корзине.
Александр Туниеков
Александр Туниеков
Ну планируется что расчеты будут делать клиенты на сайте. А чтоб они не могли приписать себе любую цену товара считать цену надо на стороне сервера. Так что сам расчет на стороне сервера на php.
Дима Касаткин
Дима Касаткин
Крутые обновления! Просто класс! Спасибо!

Хотел уточнить:
Scheduler… Для MiniShop3, я (что логично) планирую и дальше использовать эту систему, дополнив ее новым заданиями. Но как оказалось компонент не поддерживает MODX3 — а значит мне придется выпустить аналог.
Есть предложение поддерживать Fork, а не плодить компоненты!
У меня даже есть концепт, как отличать компоненты, у нас есть постфикс версии, как правило это -beta или -pl (и даже -pl2 и т.п.). Я анализировал код установщика и не нашел никаких опасных привязок к этим постфиксам.

А значит, мы можем использовать постфикс в стиле:
Scheduler 1.4.1-plScheduler 1.4.1-modx-pro, где modx-pro — github-логин автора форка. Довольно системно получается, и ничего не сломает. Можно использовать и в других компонентах аналогично!

После этого спокойно выпускать новые версии, не оглядываясь на оригинальный пакет. Раз уж там не понятно почему, не принимают PR-ы (вроде
этого), из-за чего, полагаю @Николай Савин и не рассматриваешь изначально затащить туда поддержку MODX3 (хоть она и заявлена у оригинального автора).

Что скажете, коллеги?
Николай Савин
Николай Савин
Расскажи ка мне друг мой, как ты при помощи события отменишь добавление в корзину или отправку заказа?
А как, при подписке на одно событие — ты прервешь выполнение других, если первое событие сигнализирует о прерывании действия. И еще пожалуйста дай знать, как работать в событиях с асинхронными запросами.

Я и сам думал обойдусь событиями. Но основательно взявшись за работу, понял что они нефига не справляются.
Ivan
Ivan
Не знаю где написать хотелку. Напишу тут.
А можно сделать так, чтобы если товары в корзине с устаревшей ценой, то у них цена становилась актуальной?
А то приходится плагин свой делать для этого. А мне кажется это важно и логично для любого магазина…
Тут конечно могут быть сложности, когда используются всякие компоненты скидок и прочего. Но можно сделать галочку в админке — актуализировать цены если в корзине они старые.