Я пытаюсь динамически выбрать получателя из базы данных с раскрывающимся списком.У меня есть список элементов, которые являются двумя элементами Department1, Department2, которые являются двумя элементами моего раскрывающегося списка.
Для Department1 у меня есть email1@email.com
Для Department2 у меня естьemail2@email.com
Если я выберу Отдел1 в раскрывающемся списке, я хочу, чтобы он был отправлен на email1@email.com.
Моя форма выглядит так:
имя: StringTypeфамилия: StringTypeemail: EmailTypeОтделы: EntityType
У меня есть две сущности:
Отношение между этой сущностью ContactForm и сущностью Department - OneToMany.
Я уже пытался использовать репозиторий, но не смог заставить его работать, даже создал собственный DQL.
Попытка доступа к нему с помощью $ form ["Department"] ["email"] Но получено исключение: не удалось получить доступ к строке ("")
Моя попытка DQL Я получил ожидаемый результат с чистымSQL, но не может найти его для работы с Doctrine
public function fetchDepartmentName($value){
return $this->createQueryBuilder('c')
->join('c.department', 'd')
->andWhere('d.id=:val')
->setParameter('val',$value)
->select('d.nom')
->getQuery()
->getResult()
;
}
ContactFormController
namespace App\Controller;
use App\Form\ContactFormType;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Swift_SmtpTransport;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\ORM\EntityManagerInterface;
class ContactFormController extends AbstractController
{
public function SendMail(\Swift_Mailer $mailer, $form)
{
$message = (new \Swift_Message('Test email'))
->setFrom('email@gmail.com')
->setTo($department)
->setBody(
$this->renderView(
// templates/emails/registration.html.twig
'contactform/mail_contact.html.twig', [
'form' => $form
]
),
'text/html'
)
;
$mailer->send($message);
}
/**
* @param EntityManagerInterface $em
* @param Request $request
* @return \Symfony\Component\HttpFoundation\Response
* @Route("/contact")
*/
public function new(EntityManagerInterface $em, Request $request)
{
$transport = (new Swift_SmtpTransport('smtp.gmail.com', 587, 'tls'))
->setUsername('Email')
->setPassword('Password')
;
$mailer = new \Swift_Mailer($transport);
$form = $this->createForm(ContactFormType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$contactForm = $form->getData();
// $repository = $this->getDoctrine()->getRepository(ContactForm::class);
// $department= $repository->fetchDepartmentName($form->get('Department')->getName());
$cf = $request->get($form->getName());
$em->persist($contactForm);
$em->flush();
$this->SendMail($mailer, $cf);
$this->addFlash('success', 'Successfully submitted !');
return $this->redirectToRoute('app_contactform_new');
}
return $this->render('contactform/contact.html.twig', [
'form' => $form->createView(),
]);
}
}
ContactFormType
namespace App\Form;
use App\Entity\Department;
use App\Entity\ContactForm;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class ContactFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('Firstname', TextType::class)
->add('Lastname', TextType::class)
->add('Email', EmailType::class)
->add('Message', TextareaType::class)
->add('Department', EntityType::class, [
'class' => Department::class,
'choice_label' => 'nom'
])
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => ContactForm::class
]);
}
}
ContactForm
namespace App\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="App\Repository\ContactFormRepository")
*/
class ContactForm
{
private $id;
/**
* @ORM\Column(type="string", length=25)
*/
private $firstName;
/**
* @ORM\Column(type="string", length=50)
*/
private $lastName;
/**
* @ORM\Column(type="string", length=100)
*/
private $email;
/**
* @ORM\Column(type="text")
*/
private $message;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Department", mappedBy="contactForm")
*/
private $department;
public function __construct()
{
$this->department = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getFirstName(): ?string
{
return $this->firstName;
}
public function setFirstName(string $firstName): self
{
$this->firstName = $firstName;
return $this;
}
public function getLastName(): ?string
{
return $this->lastName;
}
public function setLastName(string $lastName): self
{
$this->lastName = $lastName;
return $this;
}
public function getEmail(): ?string
{
return $this->email;
}
public function setEmail(string $email): self
{
$this->email = $email;
return $this;
}
public function getMessage(): ?string
{
return $this->message;
}
public function setMessage(string $message): self
{
$this->message = $message;
return $this;
}
/**
* @return Collection|Department[]
*/
public function getDepartment(): Collection
{
return $this->department;
}
/**
* @param mixed $department
* @return ContactForm
*/
public function setDepartment(Department $department): self
{
if (!$this->department->contains($department)) {
$this->department[] = $department;
$department->setContactForm($this);
}
return $this;
}
public function addDepartment(Department $department): self
{
if (!$this->department->contains($department)) {
$this->department[] = $department;
$department->setContactForm($this);
}
return $this;
}
public function removeDepartment(Department $department): self
{
if ($this->department->contains($department)) {
$this->department->removeElement($department);
// set the owning side to null (unless already changed)
if ($department->getContactForm() === $this) {
$department->setContactForm(null);
}
}
return $this;
}
}
Ожидаемый результат заключается в том, что он отправляет на правильный адрес электронной почты с учетом отдела.На самом деле, я не могу получить $department
динамически и передать его своей почтовой программе.
РЕДАКТИРОВАТЬ:
Мне удалось использовать свою функцию DQL, которую я сделал, чтобы получить электронную почту Департамента с ее идентификатором.
public function fetchDepartmentEmail($value)
{
return $this->createQueryBuilder('c')
->join('c.departement', 'd')
->andWhere('d.id=:val')
->setParameter('val', $value)
->select('d.email')
->getQuery()
->getResult();
}
Добавлен параметр $departement
для передачи в мою функцию SendMail и использования его в параметре setTo
, который сейчас:
->setTo($departement[0]["email"])
И добавил эти строки в мой контроллер
$repository = $this->getDoctrine()->getRepository(ContactForm::class);
$departement = $repository->fetchDepartmentEmail($cf["Departement"]);