2016-11-17 3 views
1

У меня есть форма, которая содержит 4 вопроса, да или нет может быть выбран для каждого вопроса. Когда форма отправлена, я хочу отправить один адрес электронной почты с помощью PHPMailer. Есть 7 человек, которые, возможно, должны быть cc'd, но только, если да, для ответа на вопрос, который относится к ним.PHP-форма отправляет письма различным получателям на основе да или нет переменных

Вопрос 1: Если да, куб.см recipient1

Вопрос 2: Если да, куб.см recipient2, recipient3

Вопрос 3: Если да, куб.см recipient4, recipient5, recipient6, recipient7

Вопрос 4: Если да, cc recipient6, recipient7

В настоящее время я использую инструкцию switch, которая работает, но я имеют в общей сложности 16 случаев. Есть ли более простой способ сделать это, о котором я не думаю?

switch (true) { 
    case ($Question1 === 'Yes' and $Question2 === 'Yes' and $Question3 === 'Yes' and $Question4 === 'Yes'): 
    sendmail('[email protected]', '[email protected]', '[email protected]', '[email protected]', '[email protected]@goodwin.edu', '[email protected]', '[email protected]'); 
    break; 

    case ($Question1 === 'Yes' and $Question2 === 'Yes' and $Question3 === 'Yes' and $Question4 === 'No'): 
    sendmail('[email protected]', '[email protected]', '[email protected]', '[email protected]', '[email protected]@goodwin.edu', '[email protected]', '[email protected]'); 
    break; 

    case ($Question1 === 'Yes' and $Question2 === 'Yes' and $Question3 === 'No' and $Question4 === 'Yes'): 
    sendmail('[email protected]', '[email protected]', '[email protected]', '[email protected]', '[email protected]'); 
    break; 

    case ($Question1 === 'Yes' and $Question2 === 'Yes' and $Question3 === 'No' and $Question4 === 'No'): 
    sendmail('[email protected]', '[email protected]', '[email protected]'); 
    break; 

    case ($Question1 === 'Yes' and $Question2 === 'No' and $Question3 === 'Yes' and $Question4 === 'Yes'): 
    sendmail('[email protected]', '[email protected]', '[email protected]@goodwin.edu', '[email protected]', '[email protected]'); 
    break; 

    case ($Question1 === 'Yes' and $Question2 === 'No' and $Question3 === 'Yes' and $Question4 === 'No'): 
    sendmail('[email protected]', '[email protected]', '[email protected]@goodwin.edu', '[email protected]', '[email protected]'); 
    break; 

    case ($Question1 === 'Yes' and $Question2 === 'No' and $Question3 === 'No' and $Question4 === 'Yes'): 
    sendmail('[email protected]', '[email protected]', '[email protected]'); 
    break; 

    case ($Question1 === 'Yes' and $Question2 === 'No' and $Question3 === 'No' and $Question4 === 'No'): 
    sendmail('[email protected]'); 
    break; 

    case ($Question1 === 'No' and $Question2 === 'Yes' and $Question3 === 'Yes' and $Question4 === 'No'): 
    sendmail('[email protected]', '[email protected]', '[email protected]', '[email protected]@goodwin.edu', '[email protected]', '[email protected]'); 
    break; 

    case ($Question1 === 'No' and $Question2 === 'Yes' and $Question3 === 'No' and $Question4 === 'Yes'): 
    sendmail('[email protected]', '[email protected]', '[email protected]', '[email protected]'); 
    break; 

    case ($Question1 === 'No' and $Question2 === 'Yes' and $Question3 === 'No' and $Question4 === 'No'): 
    sendmail('[email protected]', '[email protected]'); 
    break; 

    case ($Question1 === 'No' and $Question2 === 'Yes' and $Question3 === 'Yes' and $Question4 === 'Yes'): 
    sendmail('[email protected]', '[email protected]', '[email protected]', '[email protected]@goodwin.edu', '[email protected]', '[email protected]'); 
    break; 

    case ($Question1 === 'No' and $Question2 === 'No' and $Question3 === 'Yes' and $Question4 === 'Yes'): 
    sendmail('[email protected]', '[email protected]@goodwin.edu', '[email protected]', '[email protected]'); 
    break; 

    case ($Question1 === 'No' and $Question2 === 'No' and $Question3 === 'Yes' and $Question4 === 'No'): 
    sendmail('[email protected]', '[email protected]@goodwin.edu', '[email protected]', '[email protected]'); 
    break; 

    case ($Question1 === 'No' and $Question2 === 'No' and $Question3 === 'No' and $Question4 === 'Yes'): 
    sendmail('[email protected]', '[email protected]'); 
    break; 

    case ($Question1 === 'No' and $Question2 === 'No' and $Question3 === 'No' and $Question4 === 'No'): 
    sendmail(); 
    break; 

    default: 
sendmail(); 

    } 



function sendmail($cc, $cc2, $cc3, $cc4, $cc5, $cc6, $cc7){ 
$mail    = new PHPMailer; 
more PHPMailer code here 
} 
+3

Создайте вместо этого массив писем. Тогда вам нужно только 4 условных выражения. Отправьте электронное письмо после создания массива. –

ответ

1

Я не включил все ваши случаи, но вы можете видеть здесь, что, добавив каждого получателя электронной почты в массив, упомянутый @Alejandro C в комментариях, вы можете создать свой список рассылки. При необходимости измените условия и дополнения к электронной почте.

$mailer = phpmailer(); 
$emailList = array(); 

if($Question1 == "Yes") { 
    $emailList[] = "[email protected]"; 
    $emailList[] = "[email protected]"; 
} 
if($Question2 == "Yes") { 
    $emailList[] = "[email protected]"; 
    $emailList[] = "[email protected]"; 
} 
if($Question3 == "Yes") { 
    $emailList[] = "[email protected]"; 
} 
if($Question4 == "Yes") { 
    $emailList[] = "[email protected]"; 
    $emailList[] = "[email protected]"; 
} 
$emailList = array_unique($emailList); 

foreach($emailList as $val) { 
    $mailer->addCC($val); 
} 

// make sure you have added all the other necessary info to $mailer 
if(!$mailer->send()) { 
    echo 'Message could not be sent.'; 
    echo 'Mailer Error: ' . $mail->ErrorInfo; 
} else { 
    echo 'Message has been sent'; 
} 
+0

Это отличный подход, но после этого вы должны отфильтровывать повторяющиеся адреса электронной почты. – Progrock

+0

Да @Progrock, array_unique ($ emailList) удалит ваши дубликаты. –

+0

Я пробовал это, но он, похоже, не работает. Также попытался добавить $ emailList = implode (',', $ emailList); sendmail ($ emailList); Массив содержит электронные письма, но PHPMailer, похоже, не распознает их как cc. – CB81

0

Мне лично это не нравится switch(true) подход. Clean Code (хорошая книга, кстати) всегда предложить нам использовать читаемый код, так что вы можете перевести так:

switch (true) { 
    case ($Question1 === 'Yes' and $Question2 === 'Yes' and $Question3 === 'Yes' and $Question4 === 'Yes'): 
    sendmail('[email protected]', '[email protected]', '[email protected]', '[email protected]', '[email protected]@goodwin.edu', '[email protected]', '[email protected]'); 
    break; 
... 

Для этого:

class AnswersEnum 
{ 
    const SCENARIO_1 = ['Yes', 'Yes', 'Yes', 'Yes']; //use meaningful names here 
    const SCENARIO_2 = ['Yes', 'Yes', 'Yes', 'No']; 
    const SCENARIO_3 = ['Yes', 'Yes', 'No', 'No']; 
    ... 
} 

OtherClass.php

.... 
$answers = [$Question1, $Question2, $Question3, $Question4]; 

switch($answers) { 
    case AnswersEnum::SCENARIO_1: //use a meaningful name here 
     sendMailToScenario1recipients(); 
     break; 
    case AnswersEnum::SCENARIO_2: //use a meaningful name here 
     sendMailToScenario2recipients(); 
     break; 
    .... 

private function sendMailToScenario1recipients() 
{ 
    sendmail(...); 
} 

Это один из подходов. Поскольку я не вижу весь ваш проект, нелегко сказать, какое решение лучше.

+0

Массивы в константах класса? – Progrock

+0

Вы можете сделать это в PHP 5.6+ –

1

Вот другой подход:

// Define answers as an array 
$answers = [ 
    'Q1' => 'Yes', 
    'Q2' => 'No', 
    'Q3' => 'No', 
    'Q4' => 'Yes', 
]; 

// Define subscribers (this could be database driven) 
$subscribers = [ 
    'Q1' => ['[email protected]'], 
    'Q2' => ['[email protected]', '[email protected]'], 
    'Q3' => ['[email protected]', '[email protected]', '[email protected]', '[email protected]'], 
    'Q4' => ['[email protected]', '[email protected]'] 
]; 

// Determine list of recipients 
$recipients = []; 
foreach ($answers as $question => $answer) { 
    if ($answer == 'Yes') { 
     $recipients = array_unique(array_merge($recipients, $subscribers[$question])); 
    } 
} 

// Send mail however you planned on sending it 
sendmail($recipients); 
0

Многое, как ответ Джереми, но с добавлением формы и ответ фильтра.

<?php 

$questions = [ 
    'Q1' => 'Do you like pigs?', 
    'Q2' => 'Is Percy a good name for a pig?', 
    'Q3' => 'Would you eat a pig?' 
]; 

$yes_people = [ 
    'Q1' => ['[email protected]'], 
    'Q2' => ['[email protected]', '[email protected]'], 
    'Q3' => ['[email protected]', '[email protected]', '[email protected]'], 
]; 

if($_SERVER['REQUEST_METHOD'] == 'POST') { 

    $answers = []; 

    foreach(array_keys($questions) as $key) 
     $answers[$key] = isset($_POST[$key]) ? $_POST[$key] : null; 

    function answer_filter($item) { 
     return in_array($item, ['Yes', 'No']) ? $item : 'Invalid'; 
    } 

    $answers = array_map('answer_filter', $answers); 

    // Build message content here. 

    $recipients = []; 
    foreach($answers as $key => $value) 
     if($value == 'Yes') 
      $recipients = array_unique(array_merge($recipients, $yes_people[$key])); 

    var_dump($recipients); 
} 
?> 
<form method="POST" action=""> 
    <?php foreach($questions as $key => $question) { ?> 
     <p><?= $question ?></p> 
     <input type="radio" name="<?= $key ?>" value="Yes">Yes 
     <input type="radio" name="<?= $key ?>" value="No">No 
    <?php } ?> 
    <br/> 
    <input type="submit" value="Go"> 
</form> 

 Смежные вопросы

  • Нет связанных вопросов^_^