Вызов Formit для множества адресов почты, каждый адрес для определенного контента

Добрый день.
Стоит задача отправлять пользователя с запросом на разную почту, разъясню:
Есть каталог в форме таблицы
Наименование - деталировка -артикул-наличие-запросить цену
Возникает необходимость перенаправления по определенным позициям каталога запроса пользователя (запросить цену) на другую почту абсолютно на другом почтовом сервисе. Вызов Formit настроен на основную почту
&emailTo=`1@site.ru`
, при добавление еще одного адресата в
&emailTo=`1@site.ru,2@site.ru`
, я получаю письмо как и второй адресат, по аналогии добавив третьего адресата
&emailTo=`1@site.ru,2@site.ru,3@site.ru`
мы все получим эти письма. Подскажите можно обыграть в Formit так, чтобы почта шла какому-либо одному адресату по этим отдельным позициям, т.е. данная вся отправка оставалась видна только почте 1@site.ru, а почты 2@site.ru и 3@site.ru видели только свои запросы.
Так как это все на одной странице контента, id ресурса один и как это изящно обыграть тямы не хватает :). Не хочется просто создавать отдельные ресурсы с отдельными формами отправки и в каталоге перенаправлять на эти формы уже запрос, хотелось бы в рамках одной формы сделать.
Виталий
23 октября 2022, 13:33
modx.pro
1 726
0

Комментарии: 24

Артур Шевченко
23 октября 2022, 21:03
+2
Для начала можно было бы заглянуть в документацию по FormIt. Если это не помогло, можно было бы поискать в Яндекс или Гугл. Если и это не помогло, тогда можно было поискать тут. И только потом писать свой вопрос.
Подсказка: в документации есть решение.
    Виталий
    23 октября 2022, 21:46
    0
    Артур, спасибо за подсказку, как говорится смотрел в книгу а видел фигу. Каюсь пропустил данный пункт в мануале, еще раз спасибо.
      Виталий
      24 октября 2022, 19:47
      0
      Артур, мы немного не поняли друг друга, твоя подсказка подразумевает выбор почты со стороны пользователя. А мне необходимо, чтобы пользователь просто отправлял дефолтный запрос, а пути следования запроса к адресату я указываю. Другими словами, объясню проще: в каталоге запчастей допустим я договорился со сторонней организацией что запросы пользователей по определённым позициям будут приходить на почту этой организации. С другой организацией такой же договорняк. А пользователь должен просто клацать запрашивая стоимость, ему не нужно знать какая организация получит запрос. Главное чтобы почта ушедшая с одной позиции организации номер 1 не приходила организации №2.
      Так что, я опять на начале пути, еще бы подсказку…
        Артур Шевченко
        24 октября 2022, 20:19
        +1
        Я прекрасно вас понял. Вам нужно сделать выбор вместо пользователя, т.е. добавить в форму скрытое поле в котором будет указан адрес получателя и менять его по нужным вам условиям или при помощи JS или средствами CMS, смотря какие условия. В вашем случаем можно в шаблоне проверять родителя текущего товара и в зависимости от него устанавливать почту получателя.
          Виталий
          26 октября 2022, 13:00
          0
          Парни спасибо за советы, но к сожалению для меня это слишком сложно прописать в JS как будет меняться почта.
          Выбрал вариант для чайника с выбором почты со стороны пользователя, просто добавлю в таблицу еще один в столбец: — Поставщик
          Наименование - Деталировка -Артикул-Наличие-Поставщик-Запросить цену
          Проверил все работает, при выборе почта уходит по назначению, единственное надо как-то связать этот столбец Поставщик (номер поставщика) с формой, чтобы при выборе если пользователь случайно выбрал не того поставщика выскакивала ошибка, что «Выбранный Поставщик не соответствует позиции».
          Так как использую старый шаблон то jquery-1.3.2.min.js, возможно из-за этого не срабатывает
          &successMessage
          , ошибка в консоли
          default.js:16 Uncaught TypeError: $(...).off is not a function

          modal.js:21 Uncaught TypeError: $(...).on is not a function
          при попытке обновить jquery до v.1.8.3 ошибки в консоли пропадают, но при вызовы модальное окно отсутствует только остается фон.
          Вызов AjaxForm
          [[!AjaxForm?
             &snippet=`FormIt`
             &hooks=`email`
             &emailFrom=`1@site.ru`
             &form=`tpl.AjaxForm`
             &emailTpl=`modal-zv-tpl`
             &emailSelectTo=`1@site.ru;2@site.ru;3@site.ru`
             &emailSelectToName=`1;2;3`
             &emailSelectField=`emailselect`
             &emailSubject=`Заказ звонка с сайта`
             &validate=`phone-zv:required`
             &validationErrorMessage=`Пожалуйста, заполните поля помеченные *`
             &successMessage=`Сообщение успешно отправлено, наш менеджер свяжется с Вами в ближайшее время`
          ]]
          </div>
          <div id="overlay"></div>
          Чанк формы tpl.AjaxForm
          <form method="post" class="ajax_form af_example">
                  <input type="hidden" name="title" value="[[*pagetitle]]">
          	    <input type="hidden" name="link" value="[[*uri]]">
                  <input type="text" placeholder="Как вас зовут?" value="[[+fi.name-zv]]" name="name-zv" id="name" class="input_text form-control"/>
                  <input type="text" placeholder="Контактный телефон *" name="phone-zv" value="[[+fi.phone-zv]]" id="phone-zv" class="phone-zv form-control"/>
          		<div class="comment">Поля отмеченные <span class="required">*</span> обязательны для заполнения</div>
                  <input class="button" type="submit" value="Перезвоните мне">
                  [[+fi.success:is=`1`:then=`
              <div class="alert alert-success">[[+fi.successMessage]]</div>
              `]]
              [[+fi.validation_error:is=`1`:then=`
              <div class="alert alert-danger">[[+fi.validation_error_message]]</div>
              `]]
              <select name="emailselect">
              <option value="" selected disabled>Выбрать поставщика</option>
              <option value="1" [[!+fi.emailselect:default=`1`:FormItIsSelected=`2`]]>Поставщик 1</option>
              <option value="2" [[!+fi.emailselect:default=`2`:FormItIsSelected=`3`]]>Поставщик 2</option>
              <option value="3" [[!+fi.emailselect:default=`3`:FormItIsSelected=`4`]]>Поставщик 3</option>
            </select>
          </form>
          JS скрипт modal.js
          $(function() { // вся мaгия пoсле зaгрузки стрaницы
          	$('.modal').click( function(event){ // лoвим клик пo ссылки с class="modal"
          	event.preventDefault(); // выключaем стaндaртную рoль элементa
          	$('#overlay').fadeIn(400, // снaчaлa плaвнo пoкaзывaем темную пoдлoжку
          	function(){ // пoсле выпoлнения предъидущей aнимaции
          	$('#modal_form') 
          	.css('display', 'block') // убирaем у мoдaльнoгo oкнa display: none;
          	.animate({opacity: 1, top: '50%'}, 200); // плaвнo прибaвляем прoзрaчнoсть oднoвременнo сo съезжaнием вниз
          	});
          	});
          	/* Зaкрытие мoдaльнoгo oкнa, тут делaем тo же сaмoе нo в oбрaтнoм пoрядке */
          	$('.exit, #overlay').click( function(){ // лoвим клик пo крестику или пoдлoжке
          	$('#modal_form')
          	.animate({opacity: 0, top: '45%'}, 200,  // плaвнo меняем прoзрaчнoсть нa 0 и oднoвременнo двигaем oкнo вверх
          		function(){ // пoсле aнимaции
          		$(this).css('display', 'none'); // делaем ему display: none;
          		$('#overlay').fadeOut(400); // скрывaем пoдлoжку
          		}
          	);
          });
          $(document).on('af_complete', function(event, response) {
              if (response.success) { //Если форма заполнена и нет ошибок
             $('#modal_form')
          	.animate({opacity: 0, top: '45%'}, 500,  // плaвнo меняем прoзрaчнoсть нa 0 и oднoвременнo двигaем oкнo вверх
          		function(){ // пoсле aнимaции
          		$(this).css('display', 'none'); // делaем ему display: none;
          		$('#overlay').fadeOut(400); // скрывaем пoдлoжку
              });
              }
              });
          });
          Был бы признателен если тыкнете носом где ошибка в коде и как исправить
          страница где тестирую jquery-1.3.2.min.js
          http://pdfmanual.ru/zakaz-cherez-formu
          страница где тестируюjquery-1.8.3.min.js
          http://pdfmanual.ru/zakaz-cherez-formu-1
      Виталий
      24 октября 2022, 19:48
      0
      Извините если объяснил как-то не так
      Александр Туниеков
      25 октября 2022, 16:24
      0
      А если феном использовать?
      {switch каталог}
      {case 'поставщик1'}
      {'!formit' | snippet : ['emailto'=>'a1@b.ru']}
      {case 'поставщик2'}
      {'!formit' | snippet : ['emailto'=>'a2@b.ru']}
      {/switch}
      или заводишь тв email в каталоге. Когда показываешь каталог цепляешь тв и в формит на каждую позицию с отдельным емаил. Хотя так конечно ерунда получается.
        Александр Туниеков
        25 октября 2022, 16:38
        +1
        В общем. Думаю надо тв позиции в каталоге email
        при выводе
        <a data-email="[[+email]]">запросить цену</a>
        js берем data-email и подставляем в скрытое поле
        добавить в форму скрытое поле в котором будет указан адрес получателя
          Михаил
          26 октября 2022, 08:22
          +1
          Для таких целей есть прехуки
            Виталий
            26 октября 2022, 22:55
            0
            Решил проблему с ошибками с jquery 1.8.3 в консоли сейчас чисто(просто удалил лишние скрипты наверное конфликтовали), начал срабатывать
            &successMessage
            .
            Осталось решить вопрос:
            1. Почему то при не выборе поставщика срабатывает уведомление что отправлено, хотя ничего на почту не приходит.
            2. И еще не соображу как привязать нумерацию в столбце Поставщик к выбору поставщика в форме, чтобы отрабатывалась ошибка что выбран не соответствующий поставщик.
              Артур Шевченко
              26 октября 2022, 23:16
              +1
              1. Почему то при не выборе поставщика срабатывает уведомление что отправлено, хотя ничего на почту не приходит.
              Скорее всего в вызове есть валидатор для поля, которого нет в форме. Во всяком случае у меня недавно была такая же проблема и решилась она добавлением потерянного поля.

              2. И еще не соображу как привязать нумерацию в столбце Поставщик к выбору поставщика в форме, чтобы отрабатывалась ошибка что выбран не соответствующий поставщик.
              Вероятно нужен кастомный валидатор для этого поля.
                Виталий
                27 октября 2022, 17:05
                0
                Артур по первой проблеме добавил валидацию, выбор поставщика теперь подсвечивается, но… если упоротый пользователь повторно кликнет не выбрав Поставщика в форме выбора все
                input
                очищаются, при третьем клике форма закрывается с оповещением что отправлено, но почта не уходит. Испытал все способы что тут описывали
                https://modx.pro/help/8772
                , проблему не решает.
                По второму вопросу кастомный валидатор, мне такое не осилить буду признателен если кто поможет.
                Вызов теперь такой
                [[!AjaxForm?
                   &snippet=`FormIt`
                   &hooks=`email`
                   &emailFrom=`1@site.ru`
                   &form=`tpl.AjaxForm`
                   &emailTpl=`modal-zv-tpl`
                   &emailSelectTo=`1@site.ru;2@site.ru;3@site.ru`
                   &emailSelectToName=`1;2;3`
                   &emailSelectField=`emailselect`
                   &emailSubject=`Заказ звонка с сайта`
                   &validate=`name-zv:required,email:email:required,phone-zv:required,message:required,,emailselect:required`
                   &validationErrorMessage=`Пожалуйста, заполните поля помеченные *`
                   &successMessage=`Сообщение успешно отправлено, наш менеджер свяжется с Вами в ближайшее время`
                ]]
                Форма чанка tpl.AjaxForm
                <form method="post" class="ajax_form af_example">
                        <input type="hidden" name="title" value="[[*pagetitle]]">
                	    <input type="hidden" name="link" value="[[*uri]]">
                        <input type="text" placeholder="Как вас зовут? *" value="[[+fi.name-zv]]" name="name-zv" id="name" class="input_text form-control"/>
                        <input type="text" placeholder="Email *" name="email" value="[[!+fi.email]]" id="email" class="phone-zv form-control"/>
                        <input type="text" placeholder="Контактный телефон *" name="phone-zv" value="[[+fi.phone-zv]]" id="phone-zv" class="phone-zv form-control"/>
                        <input type="text" placeholder="Сообщение *" name="message" value="[[!+fi.message]]" id="message" class="phone-zv form-control"/>
                		<select name="emailselect" id="emailselect" >
                    <option value="" selected disabled>Выбрать поставщика</option>
                    <option value="1" [[!+fi.emailselect:default=`1`:FormItIsSelected=`2`]]>Поставщик 1</option>
                    <option value="2" [[!+fi.emailselect:default=`2`:FormItIsSelected=`3`]]>Поставщик 2</option>
                    <option value="3" [[!+fi.emailselect:default=`3`:FormItIsSelected=`4`]]>Поставщик 3</option>
                  </select>
                		<div class="comment">Поля отмеченные <span class="required">*</span> обязательны для заполнения</div>
                        <input class="button" type="submit" value="Перезвоните мне">
                        [[+fi.success:is=`1`:then=`
                    <div class="alert alert-success">[[+fi.successMessage]]</div>
                    `]]
                    [[+fi.validation_error:is=`1`:then=`
                    <div class="alert alert-danger">[[+fi.validation_error_message]]</div>
                    `]]
                    
                </form>
                Страница где тестирую
                http://pdfmanual.ru/zakaz-cherez-formu-1
                  Артур Шевченко
                  27 октября 2022, 20:07
                  0
                  pdfmanual.ru/zakaz-cherez-formu-1
                  Где тут форма?
                    Виталий
                    27 октября 2022, 22:39
                    0
                    Столбец «Запросить стоимость» — открыть окно. Понимаю что на ссылку не похоже, но говорю эта страница тестовая, потом что-нибудь придумаю, либо цветом и подчеркиванием текста выделю либо кнопку сделаю.
                      Артур Шевченко
                      28 октября 2022, 00:04
                      0
                      По первой проблеме. Всё как я и говорил у тебя стоит валидатор на поле emailselect, которое исчезает после второй неудачной попытки отправить форму. такое ощущение, что исходники AjaxForm переписаны, так как form.reset() срабатывает при неудачной отправке, из-за чего удаляется всё что внутри emailselect.
                      А по второй проблеме напомни почему именно пользователь должен выбрать emailselect? И как определить какого именно надо быбрать?
                        Виталий
                        28 октября 2022, 07:21
                        0
                        1. Исходники AjaxForm вроде не трогал, единственное где ковырял код это default.js. Снес и заново установил на всякий случай AjaxForm, ничего не изменилось.
                        2. В столбце таблицы Поставщик, в строках прописываю номер поставщика, в идеале конечно бы если бы перед отправкой AjaxForm сравнивал номер поставщика и если бы он не соответствовал выбору в форме, валидатор бы не давал отправить форму запроса. Но мне такое не осилить, хотя бы исправить чтобы
                        input
                        не очищался если вообще никто не выбран.
                          Артур Шевченко
                          28 октября 2022, 12:09
                          0
                          Исходники AjaxForm вроде не трогал
                          А обработчики события af_complete есть?

                          В столбце таблицы Поставщик, в строках прописываю номер поставщика
                          Открытие модалки же сделали, сделайте, чтобы при этом номер поставщика из строки вставлялся в скрытое поле в форме.
                            Виталий
                            28 октября 2022, 13:37
                            0
                            А обработчики события af_complete есть?
                            Раньше показывал скрипт modal.js он выше в теле публикации
                            $(document).on('af_complete', function(event, response) {
                                if (response.success) { //Если форма заполнена и нет ошибок
                               $('#modal_form')
                            	.animate({opacity: 0, top: '45%'}, 500,  // плaвнo меняем прoзрaчнoсть нa 0 и oднoвременнo двигaем oкнo вверх
                            		function(){ // пoсле aнимaции
                            		$(this).css('display', 'none'); // делaем ему display: none;
                            		$('#overlay').fadeOut(400); // скрывaем пoдлoжку
                            про ваш второй вопрос
                            Открытие модалки же сделали, сделайте, чтобы при этом номер поставщика из строки вставлялся в скрытое поле в форме.
                            Не могу понять как можно привязать кусок текста в контенте к выбору поставщика в форме, может хоть подсказку где почитать об этом или просто если можете кусок кода
                            <input type="hidden".........
                              Артур Шевченко
                              28 октября 2022, 15:04
                              0
                              Не могу понять как можно привязать кусок текста в контенте к выбору поставщика в форме
                              Дело в том, что это не просто текст, а HTML, а с ним можно работать в js. Например можно кнопке, которая открывает модалку, добавить атрибут data-postavshik=«1» и при открытии модалки брать значение этого атрибута и вставлять в скрытое поле формы. Тогда выбирать поставщика вообще не нужно.
                              Если у вас сложность с JS, то либо надо подучить, либо найти того, кто сделает всё за вас, скорее всего за деньги.
                                Виталий
                                29 октября 2022, 19:10
                                0
                                Артур, по первой проблеме решилось, сменил выводы ошибок, убрал jGrowl, сделал вывод в самой форме, теперь
                                <option>
                                если не выбрать поставщика не очищаются.
                                По вопросу Дело в том, что это не просто текст, а HTML, а с ним можно работать в js. Например можно кнопке, которая открывает модалку, добавить атрибут data-postavshik=«1» и при открытии модалки брать значение этого атрибута и вставлять в скрытое поле формы. если бы я мог платить, я бы не писал в раздел вопросы. Можно по этому вопросу подсказочку или отсылку на пример или мануал.Спасибо.
                                Артур Шевченко
                                29 октября 2022, 19:37
                                0
            Александр Мельник
            29 октября 2022, 20:01
            0
            Виталий, ответьте пожалуйста на вопросы:
            1) как формируется таблица на вашей странице pdfmanual.ru/zakaz-cherez-formu-1? Ее заполняет менеджер руками для этой страницы? Она формируется сниппетом, на основании товаров? Потому что я попробовал найти на вашем сайте первую из строк в этой таблице «Фильтр топливный» и нет такого товара.
            2) Что такое «поставщик» в рамках вашего сайта? Это какая то отдельная сущность? Я имею ввиду у вас на сайте где-то в админке есть место, где «создаются» поставщики? Или «поставщик» это просто руками введенное название в таблице на этой странице pdfmanual.ru/zakaz-cherez-formu-1
            3) правильно ли я понимаю «идеальный вариант» того, что вы хотите добиться — пользователь в таблице нажимает на кнопку, заполняет данные формы, а вот то на какую почту отправится это письмо зависит от того, какой email у поставщика, который указан в этой строке прайса? Просто решение с выбором поставщика в выпадающем списке несколько странное и наводит меня на мысль, что я не совсем понимаю, чего вы хотите добиться.
              Виталий
              29 октября 2022, 21:33
              0
              Александр, спасибо за участие.
              1. Правильно конечно было поставить miniShop2, но для функционала задуманного это не надо, так как просто делаю информационный сайт, просто в силу специфики контента присутствует парт каталоги запчастей, вот и возникла мысль может люди кто занимается продажей захотят к себе целевую аудиторию, поэтому максимум на перспективу парсинг пользователей на мыло продавцов запчастей. И да таблица это просто название и артикул + привяжу деталировку и кнопка запроса. Остальные столбцы лишние, страница просто в тесте.
              2. Поставщик это просто адресат кому надо отправить запрос.
              3.Да все правильно, цель именно такая чтобы запрос ушел только на адрес соответствующий поставщику. Почему выпадающий список, ну вначале дали наводку пойти этим путем, вот как-то и пошло поехало.
              P/s в принципе того что хотел я добился, последним костылем было очистка
              option
              если не выбран поставщик, сейчас хоть до усери жми кнопку пока не выберешь не отправится форма, ну и закрыв ее спокойно можно посмотреть номер поставщика, выбрать и отправить запрос, тем более при закрытии поля не очищаются и заполнять снова не придется останется только выбрать правильного поставщика. Конечно если было бы валидация со столбцом Поставщик, было бы вообще Огонь, но мне такое тяжело осилить. Если у вас есть другие более интересные способы решения было бы интересно послушать.
              Александр Мельник
              29 октября 2022, 20:12
              0
              На мой взгляд, правильный алгоритм решения вашей задачи должен быть таким:
              — у вас должны быть поставщики в админке, чтобы их можно было создавать, удалять, редактировать.
              — к каждому поставщику должен быть привязан email
              — у вас на сайте должны быть товары (можно и просто страницы они же ресурсы), и у товара должна быть привязка к поставщику.
              — таблица на вашей странице должна формировать сниппетом, который будет выводить товары, получать информацию — как поставщик связан с этим товаров и выводить инфу о поставщике.
              — при отправке формы можно пойти 2-мя путями — решением задачи на php или на javascript. Пока не буду запутывать вас как именно это сделать, но да — и в том и в другом случае вам будут нужны знания.
                Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                24