Заменить несколько заполнителей на PHP?

У меня есть функция, которая отправляет электронные письма сайта (используя phpmailer), и я хочу, чтобы php заменял все плахехолдеры в файле email.tpl контентом, который я ему подаю. Проблема для меня в том, что я не хочу повторять код, поэтому я создал функцию (ниже).

Без функции php я бы сделал следующее в скрипте

// email template file
$email_template = "email.tpl";

// Get contact form template from file
$message = file_get_contents($email_template);

// Replace place holders in email template
$message = str_replace("[{USERNAME}]", $username, $message);
$message = str_replace("[{EMAIL}]", $email, $message);

Теперь я знаю, как сделать все остальное, но я застрял на str_replace(), как показано выше, у меня есть несколько функций str_replace() для замены заполнителей в шаблоне электронной почты. Я хотел бы добавить str_replace() к моей функции (ниже) и заставить ее находить все экземпляры [\] в шаблоне электронной почты, который я ему даю, и заменять его значениями заполнителей, которые я дам ему следующим образом: str_replace("[\]", 'replace_with', $email_body)

Проблема в том, что я не знаю, как передать несколько заполнителей и их заменяющие значения в свою функцию и заставить str_replace("[{\}]", 'replace_with', $email_body) обработать все заполнители, которые я ему даю, и заменить их соответствующими значениями.

Поскольку я хочу использовать функцию в нескольких местах и ​​избегать дублирования кода, в некоторых сценариях я могу передать функции 5 заполнителей и их значения, а другому сценарию может потребоваться передать 10 заполнителей и их значения в функцию для использования в шаблоне электронной почты.

Я не уверен, что мне нужно будет использовать массив в скрипте (скриптах), который будет использовать функцию и цикл for в функции, возможно, чтобы заставить мою php-функцию принимать заполнители xx и значения xx из скрипта и чтобы перебирать заполнители и заменять их значениями.

Вот моя функция, о которой я упоминал выше. Я прокомментировал сценарий, который может объяснить намного проще.

// WILL NEED TO PASS PERHAPS AN ARRAY OF MY PLACEHOLDERS AND THERE VALUES FROM x SCRIPT
// INTO THE FUNCTION ?
function phpmailer($to_email, $email_subject, $email_body, $email_tpl) {

// include php mailer class
require_once("class.phpmailer.php");

// send to email (receipent)
global $to_email;
// add the body for mail
global $email_subject;
// email message body
global $email_body;
// email template
global $email_tpl;

// get email template
$message = file_get_contents($email_tpl);

// replace email template placeholders with content from x script
// FIND ALL INSTANCES OF [{}] IN EMAIL TEMPLATE THAT I FEED THE FUNCTION 
// WITH AND REPLACE IT WITH THERE CORRESPOING VALUES.
// NOT SURE IF I NEED A FOR LOOP HERE PERHAPS TO LOOP THROUGH ALL 
// PLACEHOLDERS I FEED THE FUNCTION WITH AND REPLACE WITH THERE CORRESPONDING VALUES
$email_body       = str_replace("[{\}]", 'replace', $email_body);

// create object of PHPMailer
$mail = new PHPMailer();

// inform class to use smtp
$mail->IsSMTP();
// enable smtp authentication
$mail->SMTPAuth   = SMTP_AUTH;
// host of the smtp server
$mail->Host       = SMTP_HOST;
// port of the smtp server
$mail->Port       = SMTP_PORT;
// smtp user name
$mail->Username   = SMTP_USER;
// smtp user password
$mail->Password   = SMTP_PASS;
// mail charset
$mail->CharSet    = MAIL_CHARSET;

// set from email address
$mail->SetFrom(FROM_EMAIL);
// to address
$mail->AddAddress($to_email);
// email subject
$mail->Subject = $email_subject;
// html message body
$mail->MsgHTML($email_body);
// plain text message body (no html)
$mail->AltBody(strip_tags($email_body));

// finally send the mail
if(!$mail->Send()) {
  echo "Mailer Error: " . $mail->ErrorInfo;
  } else {
  echo "Message sent Successfully!";
  }
}

person PHPLOVER    schedule 11.04.2012    source источник


Ответы (3)


Просто, см. strtrдокументы:

$vars = array(
    "[{USERNAME}]" => $username,
    "[{EMAIL}]" => $email,
);

$message = strtr($message, $vars);

Добавьте столько (или меньше) пар замены, сколько хотите. Но я предлагаю вам обработать шаблон перед вызовом функции phpmailer, чтобы все было отдельно: создание шаблонов и отправка почты:

class MessageTemplateFile
{
    /**
     * @var string
     */
    private $file;
    /**
     * @var string[] varname => string value
     */
    private $vars;

    public function __construct($file, array $vars = array())
    {
        $this->file = (string)$file;
        $this->setVars($vars);
    }

    public function setVars(array $vars)
    {
        $this->vars = $vars;
    }

    public function getTemplateText()
    {
        return file_get_contents($this->file);
    }

    public function __toString()
    {
        return strtr($this->getTemplateText(), $this->getReplacementPairs());
    }

    private function getReplacementPairs()
    {
        $pairs = array();
        foreach ($this->vars as $name => $value)
        {
            $key = sprintf('[{%s}]', strtoupper($name));
            $pairs[$key] = (string)$value;
        }
        return $pairs;
    }
}

Тогда использование может быть значительно упрощено, и вы можете передать весь шаблон любой функции, которая требует ввода строки.

$vars = compact('username', 'message');
$message = new MessageTemplateFile('email.tpl', $vars);
person hakre    schedule 11.04.2012
comment
большое спасибо, первый фрагмент кода объясняет мне все это, класс, который вы сделали, очень ценен, но я еще не изучил oop, поэтому пропущу его, но первый образец отлично работает с тем, что мне нужно сделать, поэтому спасибо , очень признателен! :) - person PHPLOVER; 11.04.2012

Решения PHP могут быть:

Пожалуйста, найдите обширный ответ на Programmers.StackExchange, чтобы узнать о других подходах к шаблонам электронной почты PHP.

person Farside    schedule 17.05.2016

Почему бы вам просто не сделать шаблон электронной почты файлом php? Затем вы можете сделать что-то вроде:

Hello <?=$name?>, my name is <?=$your_name?>, today is <?=$date?>

внутри письма, чтобы сгенерировать HTML-код, а затем отправить результат по электронной почте.

Мне кажется, вы идете по этому пути?

person Laurence    schedule 11.04.2012
comment
Потому что это может привести к уязвимости, связанной с внедрением кода? Кстати, короткие теги устарели. - person symcbean; 11.04.2012
comment
если вы замените X на значение $y, то это будет тот же чистый результат, что и замена $x на значение $y — значит, нет новой уязвимости по внедрению кода? - person Laurence; 11.04.2012
comment
вы предполагаете, что шаблон управляется так же, как (остальная часть) php-кода - person symcbean; 11.04.2012
comment
Короткие теги @symcbean не устарели. Они требуют, чтобы в файле php.ini были включены short_open_tags. Стандарты кодирования PSR-1 предлагают использовать только ‹?php ?› или ‹?= ?› (краткие эхо-теги). - person Brainfeeder; 14.01.2014
comment
На самом деле, поскольку короткие теги PHP5.4 теперь включены по умолчанию. - person Laurence; 16.01.2014