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

Артур Шевченко
23 апреля 2021, 09:51
0
Вечно эти опытные программисты находят изъяны и не дают насладиться маленьким триумфом от собственного роста? Я понял вас, спасибо. Что до повторной отправки, можно предусмотреть: пишем в поле comment ссылку domain.ru?msorder=2 и выводим это поле в таблице заказов. Логгирование ошибок в скрипте отправки есть, надо только возвращать false и наверное уведомлять админа. Про чтение json это прям сильно))) А вот когда вырастет, тогда можно будет переделать и ещё немного заработать ?
Алексей Шумаев
23 апреля 2021, 09:39
0
Ну да, как вариант — конкретная реализация от задачи.

Вангую немного на будущее:
— вдруг проект вырастет?
— вдруг выяснится, что народ закрывает страницу не дожидаясь отправки и не получает билеты, а потом жалуется?
— вдруг сбой отправки и вы об этом не узнаете, а повторной отправки не предусмотрено?
— вдруг надо будет ещё что-то делать вместе с отправкой билета?
Это я к тому, что лучше этот процесс перенести полностью на бэк, где вы его будете контролировать.

Чтобы БД не запрашивать (хотя для небольших проектов это не имеет особого значения, да и вообще — кому нужна БД — узкое место же :-) ) — можно в файлы json писать: есть файл -> читаем, получаем указанный заказ, отправляем, удаляем. Если отправка каких-то писем не удалась — пишем в лог и данный файл не удаляем. Однако, имхо, это немного извращение.
Артур Шевченко
23 апреля 2021, 09:24
0
Понимаете какое дело, бо́льшую часть времени крон будет работать в холостую. Получается он должен раз в минуту, пусть даже раз в пять минут запускать скрипт который будет делать запрос в БД, и если есть письмо, отправлять, если нет, то ничего не делать. Но мероприятия маленькие до 500-600 человек, это примерно по 1 письму в час, если продажу начинать за месяц, в лучшем случае. В общем у меня нет каких-то обоснованных аргументов, но сам факт того что скрипт будет срабатывать впустую мне не нравится))) Я лучше пятисекудный таймер добавлю, чтобы ajax точно скрипт запустил типа «Отправляем билеты. Ждите 5...4...3...2...1 Билеты отправлены. До скорой встречи!»)))
Алексей Шумаев
23 апреля 2021, 09:13
0
Да, именно на крон. Сохраняем очередь отправки в отдельную таблицу, потом кроном раз в ~ 1 мин отправляем накопившиеся и удаляем из таблицы. Лимит на отправку за один запуск скрипта ~ 5-10 писем, чтобы не иметь проблем с хостером (чтобы за спам 100% не принимали).
Артур Шевченко
23 апреля 2021, 09:09
0
Спасибо за комментарии. По первым двум пунктам спорить не буду, особенно по второму. Что касается третьего, изначально так и было, однако отправка письма с вложением при покупке разом больше одного билета вызывала зависание от 3 секунд, возможно это связано с логикой работы ms2, поэтому я решил данный функционал вынести на отдельную страницу, потому как пользователь на неё в любом случае переходит и там он уже ничего не заметит. Если будет сбоить, повешу задачу в крон. А что до ms2 и его нужности, будь к меня скилл повыше, наверное, я его бы не использовал, но с другой стороны ms2 дал почти весь функционал, я ведь совсем немного логику подправил и генерацию билета прикрутил и всё, к тому же ещё оплату подключать, а для ms2 уже есть модули.
Алексей Шумаев
23 апреля 2021, 08:56
+3
Навскидку несколько моментов:
1. «Чтобы избежать повторных отправок, записываем id заказа в куки… » — лучше таки флаг отправки сохранить в БД, например в properties msOrder. Ибо на страницу domain.ru?msorder=1 можно перейти не раз + она запросто может попасть в индекс яндекса (проверено) и будет весело. Запретите индексацию таких страниц в robots.
2. Откликаться будет ТОЛЬКО на ajax запросы: if ($_SERVER['REQUEST_METHOD'] != 'POST')…
Этот код будет работать при любом запросе к данной странице постом.
Меняйте на что-то вроде:
if(empty($_SERVER['HTTP_X_REQUESTED_WITH']) || $_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') die;
3. Отправку писем нужно повесить на событие оформления заказа или иное подходящее.

И я бы такой функционал в принципе не вязал бы с MS2, он тут по факту не нужен )

За публикацию личного опыта — спасибо.
Михаил
23 апреля 2021, 08:29
0
Надо будет протестировать. Спасибо!
Николай Савин
23 апреля 2021, 08:12
+1
Ровно так же как и родные поля таблицы адреса, через get
$properties = $msOrder->get('properties');
YuriyKarelin
23 апреля 2021, 03:20
0
Вечер добрый. Тоже столкнулся с этой проблемой. Мне помогло вмешательство в код (судя по всему автор модуля его забросил).
Я поменял количество запрашиваемых данных
в файле /core/components/msync/model/msync/msynccataloghandler.class.php
в функции prepareProducts()
в вызове $productsData = $this->getProductTempData(500, $lastProduct);
Поэкспериментируйте со значением.
Максим
22 апреля 2021, 23:39
0
Здравствуйте, спасибо большое за плагин!

Я тут во время теста обнаружил один момент, при оплате не подтягивает стоимость доставки
Дмитрий
22 апреля 2021, 22:30
0
Была такая же проблема. Решил отключением компонента «modRelation».
kudesia
22 апреля 2021, 22:28
0
Генерация PDF на ДЕМО сайте не работает.

No input file specified.
kudesia
22 апреля 2021, 22:27
0
Может компонент отправлять файл на почту заказчику?
Семён Кудрявцев
22 апреля 2021, 22:03
0
Автору респект за классные идеи и очень крутые компоненты.
Есть вопрос — поизучал компонент, наткнулся на пару моментов, про которые хотелось бы спросить
1)Светится абсолютный путь на сервере, по мне это не очень «секьюрно» раскрывать файловую структуру выше корня сайта.

2)Иногда последняя вкладка формирования файла — выгрузка и параметры, падает с ошибками

То есть файл она формирует, но отредактировать его уже не получается, там просто пусто и ошибка в консоли на скрипт.
Буду благодарен если автор прокомментирует эти моменты.
Sergey
22 апреля 2021, 21:54
0
Спасибо, работает ))

Еще не подскажете пожалуйста как получить и отправить доп. значения из заказа минишоп. Поля созданы как тут https://modx.pro/solutions/10040
Николай Савин
22 апреля 2021, 21:04
+1
В вашем случае size из заказа нужно вытаскивать примерно так
$options = $product->get('options');
$size = $options['size'];
Sergey
22 апреля 2021, 20:06
0
Добрый вечер! Нужна помощь.

Как получить значение (https://prnt.sc/11vqy4a) size из заказа в формате:Размер: AirPods 1/2

Пробовал {$product['size']}, {$product->size}, $product->Product->get('size')} ничего не работает (

<?php
if($modx->event->name != 'msOnCreateOrder') return;

$token = $modx->getOption('mstelegram_token', null, false);
$recipients = explode(',', $modx->getOption('mstelegram_recipients', null, ''));

$contacts = $modx->getObject('msOrderAddress', array('id'=> $msOrder->address));
$_products = $msOrder->getMany('Products');
$profile = $msOrder->getOne('UserProfile');
$properties = $msOrder->get('properties');

// Список товаров в заказе
$i = 0;
$products = '';
foreach ($_products as $product) {
    $i++;
    $products .= "{$i}. {$product->name} ({$product->count} шт.) - {$product->Product->get('price')} грн";
}

if ($msOrder->delivery == '1') {
    $deli = 'Способ доставки: Самовывоз';
    } else if ($msOrder->delivery == '2') {
        $deli = 'Курьерская доставка Деливери';
    } else {
   $deli = 'Самовывоз из Новой Почты';
}

if ($msOrder->payment == '2') {
    $pay = 'Способ оплаты: Оплата на карту ПриватБанка';
    } else {
   $pay = 'Способ оплаты: Оплата при получении';
}
// Текст сообщения
$message = "
Новый заказ #{$msOrder->num}
на сумму {$msOrder->cost} грн.
--------------------------------------
{$pay}
{$deli}
--------------------------------------
Данные доставки:

Имя: {$contacts->receiver}
Телефон: {$contacts->phone}
--------------------------------------
Товары:

{$products}
--------------------------------------
Email: {$profile->email}";



$message = urlencode($message);
foreach($recipients as $id){
	$id = trim($id);
	if(!$id) continue;
    $url = "https://api.telegram.org/bot{$token}/sendMessage?chat_id={$id}&text={$message}";
    $ch = curl_init();
    curl_setopt_array($ch, array(CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true));
    $result = curl_exec($ch);
    curl_close($ch);
}
Виноградов Тимур
22 апреля 2021, 17:19
0
Черт возьми, заработало!
Большое спасибо!
Проблема была тут:
&docid=`[[+id]]`
А у меня в чанке было:
&docid=`[[*id]]`
Роман
22 апреля 2021, 17:07
0
Вот так попробуйте:
[[!getImageList?
  &tvname=`photos`
  &tpl=`photo-chunk`
  &limit=`20`        
  &docid=`[[+id]]`
]]
Сортировка кстати, вот так правильно.
&sortby=`[{"MIGX_id":"ASC"}]`
И &includeTVs=`photos` по-моему не нужно, так как вы его подтягиваете в getImageList запросе.
[[pdoResources
пока не кэшируйте:
[[!pdoResources
Илья Уткин
22 апреля 2021, 17:06
0
Вы как разработчик сайта лучше знаете, как пользователи будут искать друг друга. Вы можете, например, использовать сниппет pdoUsers для вывода списка всех пользователей. Тогда в чанке-шаблоне указываете просто {'remessages_page' | config | url}/id{$id}. Если у вас на сайте у каждого пользователя есть личная страница, то на ней вы так же выводите ссылку [[~[[++remessages_page]]]]/id[[+user_id]]. Я не экстрасенс, я же не знаю, какая специфика у вашего сайта.