We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 1611
    • 591 Posts
    По просьбе и участии сообщника KiR. А также, используя советы сообщника Andchir, собрал и оформил сниппет который используя функциональность eForm и modx API отправляет сообщение всем менеджерам сайта.

    Решение:
    Сниппет alertToManagers
    <?php
    function alertToManagers( &$fields ){
    	global $modx;
    	foreach ($fields as &$value){
    		$value = str_replace("\n",'<br />',$value);
    	}
    	$reportTpl = $fields['reportTpl'];
    	$txt = $modx->parseChunk($reportTpl, $fields, '[+', '+]');
    	$txt = str_replace("\n",'',$txt);
    	$txt = $modx->db->escape($txt);
    	
    	$table = $modx->getFullTableName("manager_users");
    	$managers = $modx->db->select('id', $table);
    	$managers = $modx->db->getColumn('id', $managers);
    	for($i=0; $i<count($managers); $i++){
    		$modx->sendAlert('alert',$managers[$i],1, 'Message to All!', $txt,1);
    	}
    	return true;	
    }
    ?>


    Делаем на странице следующий вызов eForm.
    [!eForm? &runSnippet=`alertToManagers` &protectSubmit=`0` &debug=`1` &noemail=`1` &formid=`ContactForm` &tpl=`form` &report=`report` &subject=`Сообщение` &eFormOnBeforeMailSent=`alertToManagers`!]

    Здесь &protectSubmit=`0` &debug=`1` необходимо поставить в противоположные значения на боевом сайте, или вообще убрать. Если нужно вдобавок отправлять письмо, то нужно убрать &noemail=`1` и сделать соответствующие настройки адресов.

    Для примера привожу чанки form и report, чтобы вы могли протестировать сниппет.
    form:
    [+validationmessage+]
    <form id="ContactForm" method="post" action="">
           <p>
                   Обязательные к<br />заполнению поля
           </p>
           <p>
                   <label for="name">Ф.И.О.</label><br />
                   <input type="text" id="name" name="name" eform="Ф.И.О.:string:1" />
           </p>
           <p>
                   <label for="message">Сообщение</label><br />
                   <textarea id="message" name="message" eform="Сообщение:string:1"></textarea>
                   <br />
                   <input type="submit" name="submit" id="submit" value="Отправить" />
           </p>
           <input type="hidden" name="reportTpl" value="report" />
    </form>


    Обратите внимание на атрибут id тега form, он должен совпадать с параметром &formid, а также на скрытое поле, в котором нужно указать название чанка report.

    report:
    <div style="font-family: Tahoma, Arial, sans-serif;">
    <h1>Сообщение всем-всем-всем</h1>
    <strong>Ф.И.О.:</strong> [+name+]<br />
    <strong>Сообщение:</strong><br />
    [+message+]
    </div>


    Тестировал на modx 0.9.6.3, eform 1.4.4.5.

    Примечания:
    1. Чтобы отправлять сообщение только админу необходимо изменить сниппет следующим образом
    <?php
    function alertToManagers( &$fields ){
           global $modx;
           $reportTpl = $fields['reportTpl'];
           $txt = $modx->parseChunk($reportTpl, $fields, '[+', '+]');
           $txt = str_replace("\n","",$txt);
           $txt = $modx->db->escape($txt);
           $modx->sendAlert('alert',1,1, 'Message to Admin only', $txt,1);
           return true;        
    }
    ?>

    Первая единица в вызове senAlert определяет id пользователя, которому будет послано сообщение. Допускается писать там username, но это влечет за собой лишний запрос к базе данных.

    2. Большая часть кода здесь нужна для работы eForm. Если требуется просто послать алерт всем менеджерам из сниппета, достаточно будет следующих строк:
           global $modx;
           $subject = 'Тема сообщения'
           $txt = 'Текст сообщения'
           $table = $modx->getFullTableName("manager_users");
           $managers = $modx->db->select('id', $table);
           $managers = $modx->db->getColumn('id', $managers);
           for($i=0; $i<count($managers); $i++){
                   $modx->sendAlert('alert',$managers[$i],1, $subject, $txt,1);
           }
    


    Буду рад предложениям и пожеланиям.
      • 785
      • 2,113 Posts
      Не вникая особенно глубоко, скажу о команде $txt = str_replace("\n","",$txt);. В большинстве случаев если убирать переводы строк, последнее слово предыдущей строки слипнется с первым следующей, то есть лучше менять переводы строк на пробелы. Хотя может тут есть какой-то глубинный смысл именно в удалении...
        Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
        Статьи о MODx, регулярно новые публикации
        • 1477
        • 515 Posts
        Quote from: AKots at Jun 25, 2009, 09:32 AM

        Не вникая особенно глубоко, скажу о команде $txt = str_replace("\n","",$txt);. В большинстве случаев если убирать переводы строк, последнее слово предыдущей строки слипнется с первым следующей, то есть лучше менять переводы строк на пробелы. Хотя может тут есть какой-то глубинный смысл именно в удалении...
        Не вникая, можно много что сказать wink Смысл в этой функции есть. Проверено.
        <div style="display: none;">
        <input type="hidden" name="reportTpl" value="report" />
        </div>
        А вот скрывать скрытое поле смысла точно нету. Но это мелочи. В целом по-моему всё хорошо. Респект Андрею за то что довел всё это до ума!
          Shopkeeper - сниппет и модуль для создания интернет-магазина.
          TVimageResizer - плагин для изменения размеров (а также наложения водяных знаков и скругления углов) картинок TV при создании документа.
          PickDocsInTree - плагин для выбора документов из дерева.
          Paykeeper 1.5 - Сниппет для онлайн-оплаты в интернет-магазине MODx + Shopkeeper (Webmoney и Robokassa).
          • 785
          • 2,113 Posts
          Quote from: Andchir at Jun 25, 2009, 11:33 AM

          Смысл в этой функции есть. Проверено.
          Ну если нравится читать слова без пробелов, дело хозяйское...
            Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
            Статьи о MODx, регулярно новые публикации
            • 1477
            • 515 Posts
            Quote from: AKots at Jun 25, 2009, 01:31 PM

            слова без пробелов
            Это утверждение основано на предположении или ты (ничего что я на "ты"?) проверял?
            Там дело в том, что создатели MODx делали функцию sendAlert именно для обмена сообщениями между менеджерами, а отправка сообщений менеджерам из eForm не была предусмотрена. Ну это по-моему логично. И где-то (в какой-то функции MODx или eForm) происходит замена всех переводов строки на
            . В том числе переводов строк в шаблоне report. И получается если вовремя не убрать переводы строк, то на почту придет письмо с таким html-кодом:
            <tr>...</tr><br />
            <tr>..</tr><br />
            <tr>...
            Я не разбирался где и когда происходит замена \n на
            (nl2br()) Просто убрал переводы строки. Результат меня устроил (на 99%). А Андрей скопировал эту мою строку кода, возможно перед этим проверив зачем она нужна. А если у тебя нет пробелов в письме, сделай пожалуйста скриншот и покажи. Пользы будет больше чем строить пустые предположения. Надеюсь без обид.
              Shopkeeper - сниппет и модуль для создания интернет-магазина.
              TVimageResizer - плагин для изменения размеров (а также наложения водяных знаков и скругления углов) картинок TV при создании документа.
              PickDocsInTree - плагин для выбора документов из дерева.
              Paykeeper 1.5 - Сниппет для онлайн-оплаты в интернет-магазине MODx + Shopkeeper (Webmoney и Robokassa).
              • 785
              • 2,113 Posts
              Quote from: Andchir at Jun 25, 2009, 03:45 PM

              ничего что я на "ты"?
              Лучше на «Вы».

              Мне не надо объяснять, зачем выполняется замена строк, но если я что-то понимаю в PHP, если в шаблоне написано «перевод\nстроки», то после преобразования получится «переводстроки», хотя, наверное, «перевод строки» смотрелся бы лучше. Если где-то в MODx перед переводом строки всегда добавляются пробелы, то такой проблемы нет, но что-то я в этом сомневаюсь. Могу предположить, что при тестировании переводы строк стояли только после HTML-тэгов, так что никаких проблем не было обнаружено.

              Andchir – Вы в очередной раз слишком эмоционально реагируете на простейшие вещи.
                Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
                Статьи о MODx, регулярно новые публикации
                • 1477
                • 515 Posts
                Quote from: AKots at Jun 25, 2009, 09:39 PM

                Если где-то в MODx перед переводом строки всегда добавляются пробелы, то такой проблемы нет, но что-то я в этом сомневаюсь. Могу предположить...
                Какой смысл писать тут свои предположения? Я согласен, что обычно правильнее заменять \n на пробелы, но в данном случае на выходе получается всё как надо. А если сделать замену на пробел, то они потом окажутся после перевода строк. Переводы строк на выходе возвращены все на свои места. Не знаю почему и как это происходит, но это так.
                Quote from: AKots at Jun 25, 2009, 09:39 PM

                Andchir – Вы в очередной раз слишком эмоционально реагируете на простейшие вещи.
                А с чего вы взяли, что я писал эмоционально? Я даже хотел перейти с вами на "ты" в знак дружбы и уважения (серьезно).
                  Shopkeeper - сниппет и модуль для создания интернет-магазина.
                  TVimageResizer - плагин для изменения размеров (а также наложения водяных знаков и скругления углов) картинок TV при создании документа.
                  PickDocsInTree - плагин для выбора документов из дерева.
                  Paykeeper 1.5 - Сниппет для онлайн-оплаты в интернет-магазине MODx + Shopkeeper (Webmoney и Robokassa).
                  • 11307
                  • 136 Posts
                  у меня дурацкий вопрос - а можно посылать сообщение и админу, и на определенный почтовый адрес?
                    • 1611
                    • 591 Posts
                    Andchir, AKots давайте не будем ссориться. Я действительно скопировал эту строчку и не подумал на счет ситуации, описанной AKots. Смоделирую, протестирую, поправлю если что.

                    Скрытый див остался от предыдущей формы. Соглашусь, смысла в нем в таком виде нет. (Пожалуй поправлю первое сообщение.)

                    gregst, да, можно сделать одновременную отсылку письма. Для этого нужно убрать параметр noemail из вызова eForm и добавить в него парметры, to, from, и другие, которые вам возможно понадобятся. (Т.е. все как обычно с eForm). (Кстати, по умолчанию, сообщение отошлется всем менеджерам)
                      • 1611
                      • 591 Posts
                      Протестировал.
                      Выводы:
                      1. На отправляемое письмо (если отправляется) эта строчка не влияет вообще, т.к. не изменяет массив &$fields. Но следовало бы заменить все переводы строк на
                      , т.к. если письмо приходит в html формате, то \n отображается пробелом. (Хотя в исходном коде письма, отображается перенос строки.
                      2. В приходящем сообщении. При замене \n в пробел, в админке переноса не видно, в исходном коде между словами два пробела.
                      3. В приходящем сообщении. При удалении \n, в админке переноса не видно, в исходном коде между словами по пробелу. Т.е. не сливаются. (Хотя странно)
                      4. В приходящем сообщении. Если оставляем \n какждый перевод строки заменяется на
                      . Все переносы строк удваиваются (включая те, что в чанке report)

                      В связи со всем перечисленным, я решил менять все переводы строк на явное
                      во всех (для универсальности) полях формы. А также, удалять все переводы строк которые появятся после обработки чанка report.
                      Сниппет в первом сообщении поправил.