Как прикрепить к письму файл что был сгенерирован в хуке в ajaxForm/Formit?

В форме нет файла(так же нет в приципе инпута, и указания мультипарта), но в хуке перед отправкой создаётся файл, как его прикрепить к письму?
Vladimir
01 июня 2023, 07:58
modx.pro
4
361
0

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

Артур Шевченко
01 июня 2023, 10:59
0
Ссылкой или свою отправку сделать. Или посмотреть код хука Email может там есть ответ.
    Алексей Смирнов
    01 июня 2023, 11:13
    1
    +3
    Прикрепляется очень просто. Ответа на поверхнисти нет особо, будет тут.
    Для начала создаем сниппет в админке — это будет наш хук. Примерное содеражание его таково на примере xls:
    $myfile = array(
        "name" => "Name-of-file.xls",
        "type" => "application/vnd.ms-excel",
        "tmp_name"=> MODX_ASSETS_PATH."path_more/Name-of-file.xls",
        "error"=> 0
        );
    $hook->setValue('file', $myfile);
    return true;
    Тут вам нужно будет указать реальные имена файла в нужных местах и полный путь к файлу в tmp_name. Тут пример с папкой /assets/.
    Ну и указать MIME тип присоединяемого файла. (type)

    После указываем данный хук в formIT(ajaxForm) и проверяем что все приходит.
    У формы на фронте еще должно быть указано enctype=«multipart/form-data» в теге form:
    <form method="post" action="/" enctype="multipart/form-data">
    Тестируйте, проверяйте.
    Удачи.
      Vladimir
      01 июня 2023, 14:31
      0
      Спасибо огромное, работает, я так и думал что могу поставить значение в хуке, только думал что нужно всё же создать будет тег, и не знал как прикрепить сам
        Vladimir
        01 июня 2023, 15:06
        1
        0
        Можете пожалуйста подсказать как вернуть какие-нибудь данные во фронт через ajaxForm пытался так:

        return $AjaxForm->success('Спасибо! Ваш отзыв отправлен', array(
            'data' => array('invoice_of_payment' => $generateInvoice))
        );

        Потом так 1

        return $AjaxForm->success('Спасибо! Ваш отзыв отправлен', array('invoice_of_payment' => $generateInvoice)
        );
        Потом так 2

        return $AjaxForm->success(array(
            'status' => 1,
            'message' => 'Спасибо! Ваш отзыв отправлен',
            'data' => array('invoice_of_payment' => $generateInvoice))
        );
        Но всё равно сообщение не меняется и данные которые отправляю они не поступают на фронт, в доках не нашёл ничего. Данные хочу подставить в хуке, ведь на фронт всё равно приходит ответ, как мне подставит то что нужно мне?
          Алексей Смирнов
          01 июня 2023, 16:41
          0
          Успешность отправки вообще делается не в хуке, а в настройках при вызове formIT:
          {'!AjaxForm' | snippet : [
          'successMessage' => 'Спасибо! Ваш отзыв отправлен.',
          ]}
          ну и доку посмотрите: docs.modx.com/current/en/extras/formit/formit.hooks
            Vladimir
            01 июня 2023, 17:20
            0
            Главная вещь что мне нужно это отправить тот самый сгенерированный файл( его ссылку), ответ мне приходит от ajaxform и в ответе есть уже готовый ключ data, но как туда отправить данные, если мой файл генерируется в хуке formit. Судя по исходному коду AJaxForm
            core/components/ajaxform/model/ajaxform/ajaxform.class.php
            Метод success принимает 3 параметра.


            и согласно этому методу, код ниже валиден и должен вернуть данные на фронт ajaxform в триггер af_complete
            return $AjaxForm->success(
                    'Спасибо! Ваш отзыв отправлен', 
                    array(
                        'invoice_of_payment' => $generateInvoice
                    )
                );
            Сообщение просто для теста стоит.
            Если я в хуке верну true или просто любое другое, то ajaxform перестаёт работать, когда делаю через
            return $AjaxForm->success
            то хотя бы всё работает, по этому я пытаюсь результат засунуть туда.

            Как я понял мой код будет работать без проблем если я заменю formit на свой снипет, а что если мне нужен именно всё в таком виде, как мне подбросить эти данные из хука формита в ответ ajaxform
              Алексей Смирнов
              01 июня 2023, 17:27
              0
              А куда вы хотите эту ссылку отправить? На почту? Показать человеку на экран?
              это $AjaxForm->success — оно работает, только если вы запускаете свой сниппет, а не formit.
              Поэтому если нужно на почту ссылку отправить — просто добавьте еще поле одно с сылкой.
              А если вы хотите показать, то тут сложнее.
                Vladimir
                01 июня 2023, 17:28
                0
                Да показать нужно на экран, я так понял такого сопряжения formit и ajaxform нет, как вариант можно запихнуть в кэш и потом в исходнике поправить и взять с кэша
                  Vladimir
                  02 июня 2023, 14:41
                  0
                  Сделал так в вызов добавил 2а новых параметра:
                  1)cacheDataVarName (это имена переменой в кеше из которой возмётся результат)
                  2)formSelector (это для фронта чтобы отсортировать результат для каждой формы если нужно)

                  Создал снипет в котором записывается данные в кэш а так же их получения.
                  Способ вызова для записи:
                  $saveInvoiceToCache = $modx->runSnippet('customCacheStorage', ['cacheVarName' => 'newInvoice', 'cacheValue' => $generateInvoice['downloadLink']]);
                  Сам сниппет:

                  <?php
                  if ($modx->cacheManager->get($cacheVarName) && !$cacheValue) {
                      // Если есть кэш
                      $output = $modx->cacheManager->get($cacheVarName);
                  }else{
                      $output = $cacheValue;
                      // Запись в кэш
                      $modx->cacheManager->set($cacheVarName, $output, 40);
                  }
                  
                  return $output;
                  *********************
                  Затём в файле core/components/ajaxform/model/ajaxform/ajaxform.class.php
                  Добавил в конструктор ("__construct") след вещи:

                  $this->cacheDataVarName = '';
                  $this->formSelector = '';

                  В том же файле, уже в методе "process" записал значение для 2х параметров указаных выше:

                  $this->formSelector = $scriptProperties['formSelector'] ? $scriptProperties['formSelector'] : 'have no form';
                  $this->cacheDataVarName = $scriptProperties['cacheDataVarName'];

                  ***************************************************************
                  Затем в методе "success" в начало тела добавил следующие

                  if($this->cacheDataVarName){
                      $getInvoiceFromCache = $this->modx->runSnippet('customCacheStorage', ['cacheVarName' => $this->cacheDataVarName]);
                  
                      if(!$data){
                          $data = array();
                      }
                  
                      $data['fileLink'] = $getInvoiceFromCache;
                      $data['responseFormSelector'] = $this->formSelector;
                  }


                  А на фронте в тригере "af_complete" делаю нужные вещи (само сабой разделяю на === true и === false)
                  if(response.data && response.data.responseFormSelector && response.data.responseFormSelector == 'invoiceForm'){}
                  и так далее.

                  Само собой это не лучший вариант, и не совсем продакшен, к тому же это делалось для внутренних целей, не для публики. ПОЖАЛУЙСТА кто может добавьте что лучше сделать для данной задачи, с радостью исправлю и научусь новому.
                  .
                  Само собой лучше не трогать исходники, и есть лучшие методы для моей задачи, такое как заменить снипет формит и не пришлось бы городить балаган с исходниками и кэшем, и просто там отправить письма! Позже так и сделаю
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          9