Замяна на няколко контейнера с PHP?

Имам функция, която изпраща имейли на сайта (използвайки phpmailer), това, което искам да направя, е основно php да замени всички placheholders във файла 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 контейнера и там стойности към функцията, за да използва в шаблона за имейл.

Не съм сигурен дали ще трябва да използвам масив an в скрипта(овете), който ще използва функцията и 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
благодаря ви много, първата част от кода ми обяснява всичко, класът, който направихте, е много оценен, но още не съм научил, така че ще го пропусна, но първата проба работи чудесно с това, което трябва да направя, така че благодаря , оценявам го! :) - 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 кратки тагове не са остарели. Те изискват short_open_tags да бъдат активирани във файла php.ini. Стандартите за кодиране PSR-1 предлагат да се използва само ‹?php ?› или ‹?= ?› (ехо кратки тагове). - person Brainfeeder; 14.01.2014
comment
Всъщност, тъй като кратките тагове на PHP5.4 вече са включени по подразбиране - person Laurence; 16.01.2014