При наличии выпадающего пункта укажите соответствующий адрес электронной почты из базы данных Symfony. - PullRequest
1 голос
/ 01 апреля 2019

Я пытаюсь динамически выбрать получателя из базы данных с раскрывающимся списком.У меня есть список элементов, которые являются двумя элементами Department1, Department2, которые являются двумя элементами моего раскрывающегося списка.

Для Department1 у меня есть email1@email.com

Для Department2 у меня естьemail2@email.com

Если я выберу Отдел1 в раскрывающемся списке, я хочу, чтобы он был отправлен на email1@email.com.

Моя форма выглядит так:

имя: StringTypeфамилия: StringTypeemail: EmailTypeОтделы: EntityType

У меня есть две сущности:

  • ContactForm
  • Отдел

Отношение между этой сущностью 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"]);
...