Всего 124 000 комментариев

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

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"
в чём может быть проблема?
Александр Туниеков
04 декабря 2024, 22:19
0
Из-за сложной структуры extJS оказалось, что нужно написать бессмысленно много PHP кода. Когда счет новых процессоров пошел на второй десяток — пришлось остановиться
Вообще конечно когда классные процессоры выпустили для MODX это было думаю круто. Наверно сократило кол-во кода. Наумкин помню ими восторгался. Но все равно это для меня оказалось не хорошим решением. Кода все равно много писать пришлось. Для getTables я CRUD делал в одном файле. Это сократило кол-во контроллеров php с 5-7 на таблицу на 1 контроллер общий для всех таблиц.
Можно попробовать процессоры create, getlist, update и т.д. переписать на 1 процессор на таблицу для extJS. Или может даже 1 процессор на все таблицы. Но здесь не уверен. ExtJs сейчас уже подзабыл.

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

Но с большими объемами кода ИИ вечно косячит, может просто взять и половину логики потерять, речь в частности просто о ChatGPT. Поэтому простыням кода от него я не доверяю.
cronAbs
04 декабря 2024, 12:05
0
Нужно проверять метод 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
04 декабря 2024, 11:30
0
Павел, скрипт у вас просто замечательный! Только одно но, или 2, смотря как считать… Сниппет требует от браузеров пользователей очень много ресурсов и долго загружается, что понижает показатели сайта, которые сейчас очень важны для поисковиков. В его js файле используется JQ, который, в свою очередь, требует подключения соответствующей библиотеки. Подгружать сниппет аяксом не получается, поскольку тогда не срабатывают обработчики js, из-за того что соответствующих объектов нет в DOM. Пробовала откладывать загрузку js до полной прогрузки страницы, но тогда вылезает ошибка как в комментарии Кровельного. Скажите, пожалуйста, у вас в планах есть желание переписать сниппет сделав возможным его отложенную загрузку, или вы его забросили?
Riwka
04 декабря 2024, 11:15
0
Я с таким встречалась когда пыталась отложить загрузку скрипта, т. е. у вас код js не успевает обрабатываться до вызова нового объекта. Как-то так.
Алексей Шумаев
04 декабря 2024, 08:48
0
Оставленная «на потом» дока будет камнем на шее успешного запуска нового модуля.
Про платную расширенную версию ещё не забываем.
Алексей Шумаев
04 декабря 2024, 08:45
0
Это не «хотелка», а обязательный стандартный функционал любого магазина.
Причём с механикой уведомлений о том, что цена в корзине изменилась в ту или иную сторону и на сколько.
Тоже самое с остатками.
Компоненты скидок и т.п. сами должны реализовывать свою логику в зависимости от изменения цены товара в корзине.
Arahort
04 декабря 2024, 01:24
+1
в phpStorm плагин Codeium для автодополнения, а так в браузере Gemini (https://aistudio.google.com/app/prompts/new_chat) он намного намного лучше chatgpt в плане Modx Revo и не только (использую свежие эксперементальные модели)
Александр Туниеков
03 декабря 2024, 23:11
0
Ну планируется что расчеты будут делать клиенты на сайте. А чтоб они не могли приписать себе любую цену товара считать цену надо на стороне сервера. Так что сам расчет на стороне сервера на php.
Дима Касаткин
03 декабря 2024, 19:20
0
Крутые обновления! Просто класс! Спасибо!

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

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

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

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

Я и сам думал обойдусь событиями. Но основательно взявшись за работу, понял что они нефига не справляются.
Евгений Webinmd
03 декабря 2024, 19:01
+1
xtype: modx-combo-user
Это xtype (тип поля) самого MODX, выводит всех пользователей modUser
Список всех возможных типов полей
Ivan
03 декабря 2024, 18:13
+1
Не знаю где написать хотелку. Напишу тут.
А можно сделать так, чтобы если товары в корзине с устаревшей ценой, то у них цена становилась актуальной?
А то приходится плагин свой делать для этого. А мне кажется это важно и логично для любого магазина…
Тут конечно могут быть сложности, когда используются всякие компоненты скидок и прочего. Но можно сделать галочку в админке — актуализировать цены если в корзине они старые.
Ivan
03 декабря 2024, 18:06
+1
А можете сказать какая из этих строк указывает на то, что должно находиться в выпадающем списке? Просто как-то не понятно откуда там берутся все эти пользователи)
Спасибо
Даниил
03 декабря 2024, 17:31
0
Пишет не валидный токен «Невалидный токен»
Полностью переустановил modx полностью переустановил sendit

Apache:
2.4.55
Панель управления Beget MySQL:
8-beget
Панель управления Beget Nginx:
1.21.1
Панель управления Beget Perl:
5.14.2
Панель управления Beget PHP:
8.3
Панель управления Beget Python:
2.7.3

Консоль
{«success»:false,«message»:"\u041d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d.",«data»:{«successMessage»:"\u0424\u043e\u0440\u043c\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430!",«hooks»:«FormItSaveForm,email»,«emailTpl»:«siDefaultEmail»,«emailFrom»:«noreply@complab59.ru»,«formName»:«SimpleForm»,«emailSubject»:"\u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0441\u0430\u0439\u0442\u0430 complab59.ru",«validate»:«email:email:required,name:required,politics:required»,«sendGoal»:«0»,«counterId»:""}}
{success: false, message: «Невалидный токен.»,…}
data
:
{successMessage: «Форма отправлена!», hooks: «FormItSaveForm,email», emailTpl: «siDefaultEmail»,…}
counterId
:
""
emailFrom
:
«noreply@complab59.ru»
emailSubject
:
«Письмо с сайта complab59.ru»
emailTpl
:
«siDefaultEmail»
formName
:
«SimpleForm»
hooks
:
«FormItSaveForm,email»
sendGoal
:
«0»
successMessage
:
«Форма отправлена!»
validate
:
«email:email:required,name:required,politics:required»
message
:
«Невалидный токен.»
success
:
false

ЛОГИ

[2024-12-02 11:33:09] (ERROR @ /home/e/e8788408/complab/public_html/core/vendor/xpdo/xpdo/src/xPDO/xPDO.php: 787) siSession::load() is not a valid static method.
[2024-12-02 11:33:09] (ERROR @ /home/e/e8788408/complab/public_html/core/vendor/xpdo/xpdo/src/xPDO/xPDO.php: 667) Could not load class: siSession from mysql.sisession
[2024-12-02 11:33:09] (ERROR @ /home/e/e8788408/complab/public_html/core/components/sendit/services/sendit.class.php: 1132) Table si_sessions not found
[2024-12-02 11:33:10] (ERROR @ /home/e/e8788408/complab/public_html/core/vendor/xpdo/xpdo/src/xPDO/xPDO.php: 667) Could not load class: siSession from mysql.sisession
[2024-12-02 11:33:10] (ERROR @ /home/e/e8788408/complab/public_html/core/vendor/xpdo/xpdo/src/xPDO/xPDO.php: 787) siSession::load() is not a valid static method.
[2024-12-02 11:33:10] (ERROR @ /home/e/e8788408/complab/public_html/core/vendor/xpdo/xpdo/src/xPDO/xPDO.php: 667) Could not load class: siSession from mysql.sisession
[2024-12-02 11:33:10] (ERROR @ /home/e/e8788408/complab/public_html/core/components/sendit/services/sendit.class.php: 1132) Table si_sessions not found

Ошибка указывает на проблемы с попыткой загрузки класса siSession, который должен быть связан с таблицей mysql.sisession. Однако, в вашей базе данных нет таблицы с таким названием — вместо этого у вас есть таблицы modx_session и modx_si_sessions. Ошибка говорит, что метод siSession::load() является недействительным, и также проблема с загрузкой класса siSession. Скорее всего, какой-то скрипт пытается загрузить класс siSession, но не может найти соответствующую таблицу в базе данных.