Шаблоны электронной почты хранятся в формате XML. Как выполнить PHP внутри XML? - PullRequest
0 голосов
/ 18 августа 2010

У меня есть XML-файл электронной почты, подобный этому:

<?xml version='1.0' standalone='yes'?>
<emails>
 <email id="contract-expired">
    <description>We send this email when we want to inform a user that a contract is coming up to it's expiration date</description>
    <subject>Example: Contract Expiration</subject>
    <parameters>
        <param>name</param>
        <param>number_of_contracts</param>
    </parameters>
    <content>
        <html>
            <![CDATA[
            Dear %name%, <br />
            <p>
            <?php
                       foreach($contract as $value):
                         echo $value->getTitle()
                       endforeach;
                    ?>
            You have %number_of_contracts% contracts that are due to expire in under 30 days. Please log in to example.com to review the contracts.
            <br /><br />
            This is an automated email. Please do not reply.
            </p>
            ]]>
        </html>
        <plain>
            Dear %name%, You have %number_of_contracts% contracts that are due to expired in under 30 days. Please log in to example.com to review the contracts. This is an automated email. Please do not reply.
        </plain>
    </content>
 </email>
</emails>

У меня есть класс, который обрабатывает шаблон электронной почты.

Т.е. вы устанавливаете параметр следующим образом:

$mail->setParameter("name", "Jamie");

И когда вы вызываете setContent, он будет выполнять str_replace для содержимого% name% и всех других параметров.Достаточно просто.

И тогда я понял, что если мне нужно сделать цикл в шаблоне, чтобы вывести список всех контрактов и т. Д. Мне нужно сделать цикл php в файле xml, но как я могу это сделать?пройти через объект, а затем выполнить содержимое как php и получить вывод?

Есть идеи?

Спасибо, парень!

РЕДАКТИРОВАТЬ: Просто, чтобы быть ясно, что-то.Я не хочу создавать HTML, а затем передать его в качестве параметра.Я использую Symfony и, следовательно, я хочу, чтобы держать HTML из контроллера.

Вот где он вызывается:

  public function executeContractExpired(sfWebRequest $request)
  {
    $mail = new Mail("contract-expired");
    $mail->setParameter("name", "Joe Bloggs");
    $mail->setParameter("number_of_contracts", 567);
    $mail->setContent();

    $message = $this->getMailer()->compose();
    $message->setSubject($mail->getSubject());
    $message->setTo("example@example.com");
    $message->setFrom(array("jamie@example.com"=>"Automated Message"));
    $message->setBody($mail->getHtmlContent(), 'text/html');
    $message->addPart($mail->getPlainContent(), 'text/plain');

    $this->getMailer()->send($message);
  }

Делая что-то вроде (в действии):

$contracts_html = "<ul>";
foreach($contracts as $contract)
{
    $contracts .= "<li>" . $contract->getTitle() . "</li>"
}
$contracts .= "</il>";

И затем передавая это как параметр:

$mail->addParameter("contracts", $contracts_html);

Этот метод просто ужасен.

Ответы [ 3 ]

1 голос
/ 18 августа 2010

Я бы посоветовал не иметь логику в шаблоне.Добавьте заполнитель %contracts% и научите свой класс обработки шаблонов, как заменить это из PHP, а не шаблона.Вы можете написать вспомогательный класс, который будет сопровождать ваш класс Mailer.Таким образом, вы можете держать его вне контроллера.IMO, код, настраивающий Mailer, также не должен быть там, но в классе Service в модели.

На sidenote это, кажется, хороший кандидат для XSLT .

0 голосов
/ 18 августа 2010

может быть, вы можете использовать ob_start для подготовки вывода перед отправкой на электронную почту

Извините, я не делаю этого в режиме класса. но я надеюсь, что это даст вам понимание.

код выглядит примерно так:

function callback($buffer)
{   
    // bundle of string you want to replace
    return str_replace("name", "Mr.John" , $buffer);
}

function getEmail($email_template_path, $contacts){
    ob_start();
    include($email_template_path);
    $email_to_send = ob_get_contents(); 
    ob_end_clean();

    return callback($email_to_send);
}

echo getEmail("/opt/lampp/htdocs/index.html",array("Mr. Smith", "Mrs.Smith"));
0 голосов
/ 18 августа 2010
$contractTitles = implode(',', $contract);

$mail->setParameter("contract_titles", $contractTitles);

Замените цикл for на %contract_titles%

            <![CDATA[
            Dear %name%, <br />
            <p>
           %contract_titles%
            You have %number_of_contracts% contracts that are due to expire in under 30 days. Please log in to example.com to review the contracts.
            <br /><br />
            This is an automated email. Please do not reply.
            </p>
            ]]>

Итак, составьте список названий ваших контрактов и замените его в теле сообщения.

...