У меня есть функция, которая отправляет электронные письма с сайта (с использованием phpmailer), что я хочу сделать, это в основном для php, чтобы заменить всех plachholders в файле 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!"; } }
Простой, см. strtr
Docs :
$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);
Решениями PHP могут быть:
%placeholder%
:
str_replace
, strtr
, preg_replace
Пожалуйста, найдите широкий ответ на Programmers.StackExchange, чтобы узнать другие подходы к шаблонам PHP по электронной почте .
Почему бы вам просто не создать шаблон электронной почты для php-файла? Тогда вы можете сделать что-то вроде:
Hello <?=$name?>, my name is <?=$your_name?>, today is <?=$date?>
внутри электронной почты, чтобы сгенерировать ваш HTML-код, а затем отправить результат в виде электронной почты.
Кажется мне, как вы это делаете с трудом?