Я пытаюсь отобразить шаблон веточки как переменную, используя symfony. У меня есть контроллер sendAction, который использует API mailgun для отправки писем в один или несколько списков рассылки. Вот мой код для контроллера:
public function sendAction(Request $request, Newsletter $newsletter, MailgunManager $mailgunManager) {
$form = $this->createForm(SendForm::class);
$form->handleRequest($request);
$formData = array();
if ($form->isSubmitted() && $form->isValid()) {
$formData = $form->getData();
$mailingLists = $formData['mailingLists'];
foreach ($mailingLists as $list) {
$mailgunManager->sendMail($list->getAddress(), $newsletter->getSubject(), 'test', $newsletter->getHtmlContent());
return $this->render('webapp/newsletter/sent.html.twig');
}
}
return $this->render('webapp/newsletter/send.html.twig', array(
'newsletter' => $newsletter,
'form' => $form->createView()
));
}
}
А вот моя функция sendMail (mailgun):
public function sendMail($mailingList, $subject, $textBody, $htmlBody) {
$mgClient = new Mailgun($this::APIKEY);
# Make the call to the client.
$mgClient->sendMessage($this::DOMAIN, array(
'from' => $this::SENDER,
'to' => $mailingList,
'subject' => $subject,
'text' => $textBody,
'html' => $htmlBody
));
}
Я хочу, чтобы мой «$ newsletter-> getHtmlContent ()» отображал шаблон с именем «newsletter.twig.html». может ли кто-нибудь помочь мне или указать мне правильное направление относительно того, что я могу сделать или где я могу найти учебные пособия или заметки о том, что я пытаюсь сделать. документация Symfony довольно расплывчата.
Вы должны просто сделать что-то вроде, например, $mailgunManager->sendMail($list->getAddress(), $newsletter->getSubject(), 'test', $this->render($newsletter->getTemplate()));
Добро пожаловать в переполнение стека, если ответ вам поможет, вы можете отметить его как правильный, щелкнув галочку слева от ответа.
@DarkBee: Почему вы продолжаете удалять теги php и twig? Вам не кажется, что вопрос связан с PHP или Twig?
@lxg Не думаю, что нет. Здесь нет буквы twig, и это не проблема php сама по себе.
Но речь идет о рендеринге шаблона Twig и доступе к механизму рендеринга. И, конечно же, это вопрос PHP. Посмотрите практически на все вопросы, связанные с языком, почти все они связаны с конкретной технологией, реализованной на данном языке. Я думаю, вы немного переусердствовали с редактированием тегов. Кстати, (простые) изменения тегов не добавляются к вашему счету редактирования, поэтому они не помогут вам получить оставшиеся 3 балла для значка «Редактор копий». ;)
@Lxg Я здесь не значок .. Чего это стоит (а потом я заткнулся) OP даже мог бы попытаться отрендерить шаблон smarty. Я просто стараюсь использовать минимальное количество тегов и использовать их наилучшим образом. Я имею в виду, что кто-то может щелкнуть тег twig для этого вопроса и не сможет его решить, потому что он фокусируется на том, как передать / получить доступ к экземпляру службы внутри контроллера.
Может быть, но это верно для многих вопросов, и я не думаю, что слишком многих людей это беспокоит. Кстати, вы можете начать исправлять теги в своих вопросах, например почему вопрос stackoverflow.com/questions/49231031/… содержит тег linux? Кроме того, почему бы вам не использовать freedts в своих вопросах, касающихся библиотеки FreeDTS? Другой пост содержит тег php, но также не является «проблемой php сам по себе». Вы непоследовательны.




Вы можете использовать getContent(), привязанный к вашей функции рендеринга.
return $this->render('webapp/newsletter/send.html.twig', array(
'newsletter' => $newsletter,
'form' => $form->createView()
))->getContent();
Итак, вы создаете объект Symfony\Component\HttpFoundation\Response только для того, чтобы получить визуализированный контент? Хороший хак. ;)
Нет, не знал. Метод getContent() находится на объекте Response, возвращаемом $this->render(). Вы фактически возвращаете тело ответа.
Ага, изначально не заметил, моя беда :)
Просто вставьте экземпляр Symfony\Bundle\FrameworkBundle\Templating\EngineInterface в свое действие, и вы сможете напрямую использовать Twig:
public function sendAction(Request $request, EngineInterface $tplEngine, Newsletter $newsletter, MailgunManager $mailgunManager)
{
// ... other code
$html = $tplEngine->render('webapp/newsletter/send.html.twig', [
'newsletter' => $newsletter,
'form' => $form->createView()
]);
}
Обратите внимание, что $this->render() (в действии контроллера) вернет экземпляр Symfony\Component\HttpFoundation\Response, а $tplEngine->render() вернет строку HTML.
Дело также в том, что тема и тело текста должны быть вставлены в шаблон, так как у меня есть заполнители для этих переменных в шаблоне.
По сути, я не хочу, чтобы подписчик получал электронное письмо только как HTML-контент, а получал его как шаблон со всеми другими переменными, введенными в шаблон.
Вы можете просто передать дополнительные значения в массив, который является вторым параметром метода render. Они будут доступны как переменные Twig по имени ключа массива.
Вы хотите визуализировать шаблон
newsletter.twig.htmlвнутри шаблонаwebapp/newsletter/send.html.twig?