Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF2][Symfony2][Symfony]Swiftmailer
Forum PHP.pl > Forum > PHP > Frameworki
kosmos
Witam,
Mam problem z wysyłaniem danych z formularza na konto pocztowe przy pomocy Swiftmailera.

Formularz widok:

  1. <h2>Formularz Kontaktowy</h2>
  2. <?php echo $view['form']->start($form)?> // Nie używam tutaj przykładowo <form action = "{{path('success') }}" method="POST". Jak wskazać namiar na akcję kontrolera
  3. // po wysłaniu formularza?
  4. <?php echo $view['form']->errors($form) ?>
  5. <div>
  6. <?php echo $view['form']->row($form['name'],array(
  7. 'label' => false,
  8. 'attr' => array(
  9. 'class' => 'name',
  10. 'placeholder' => ' Imię'),)) ?>
  11. </div>
  12. <div>
  13. <?php echo $view['form']->row($form['surname'],array(
  14. 'label' => false,
  15. 'attr' => array(
  16. 'class' => 'surname',
  17. 'placeholder' => ' Nazwisko'),)) ?>
  18. </div>
  19. <div>
  20. <?php echo $view['form']->row($form['email'],array(
  21. 'label' => false,
  22. 'attr' => array(
  23. 'class' => 'email',
  24. 'placeholder' => ' Email'),)) ?>
  25. </div>
  26. <div>
  27. <?php echo $view['form']->row($form['subject'],array(
  28. 'label' => false,
  29. 'attr' => array(
  30. 'class' => 'subject',
  31. 'placeholder' => ' Temat'),)) ?>
  32. </div>
  33. <div>
  34. <?php echo $view['form']->row($form['note'],array(
  35. 'label' => false,
  36. 'attr' => array(
  37. 'class' => 'note',
  38. 'placeholder' => ' Wiadomość...'),
  39. )
  40. ) ?>
  41. </div>
  42.  
  43. <input type="submit" class="btn-form-style" value="WYŚLIJ" ?>"/>
  44.  
  45. <?php echo $view['form']->end($form) ?>


Message.php
<?php

// src/Acme/PageBundle/Entity/Message.php
namespace Acme\PageBundle\Entity;

  1. class Message
  2. {
  3. protected $name;
  4. protected $surname;
  5. protected $email;
  6. protected $subject;
  7. protected $note;
  8.  
  9.  
  10. public function getMessage()
  11. {
  12. return $this->message;
  13. }
  14. public function setMessage($message)
  15. {
  16. $this->message = $message;
  17. }
  18.  
  19. public function getName()
  20. {
  21. return $this->name;
  22. }
  23. public function setName($name)
  24. {
  25. $this->name = $name;
  26. }
  27.  
  28. public function getSurname()
  29. {
  30. return $this->surname;
  31. }
  32. public function setSurname($surname)
  33. {
  34. $this->surname = $surname;
  35. }
  36.  
  37. public function getEmail()
  38. {
  39. return $this->email;
  40. }
  41. public function setEmail($email)
  42. {
  43. $this->email = $email;
  44. }
  45.  
  46. public function getSubject()
  47. {
  48. return $this->subject;
  49. }
  50. public function setSubject($subject)
  51. {
  52. $this->subject = $subject;
  53. }
  54.  
  55. public function getNote()
  56. {
  57. return $this->note;
  58. }
  59. public function setNote($note)
  60. {
  61. $this->note = $note;
  62. }
  63. }
  64.  
  65. ?>


Controller

  1. public function contactAction(Request $request)
  2. {
  3.  
  4. $message = new Message();
  5. $form = $this->createForm(new ContactType(),$message);
  6.  
  7.  
  8.  
  9. if ($form->isValid()) { // Moge zastosować tu taki warunek?
  10. $message = \Swift_Message::newInstance()
  11. ->setSubject($message->getSubject())
  12. ->setFrom(array($message->getEmail()))
  13. ->setTo('.....@gmail.com')
  14. ->setBody($message->getNote());
  15. $this->get('mailer')->send($message);
  16. return $this->redirect($this->generateUrl('acme_task_success'));
  17. }
  18.  
  19.  
  20. return $this->render('AcmePageBundle:Default:contact.html.php', array(
  21. 'form' => $form->createView(),
  22. ));
  23.  
  24. }


Budowanie formularza

<?php
// src/Acme/PageBundle/Form/Type/ContactType.php
namespace Acme\PageBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
  1. class ContactType extends AbstractType
  2. {
  3. public function buildForm(FormBuilderInterface $builder, array $options)
  4. {
  5. $builder
  6. ->add('name','text')
  7. ->add('surname','text')
  8. ->add('email','email')
  9. ->add('subject','text')
  10. ->add('note','textarea');
  11. }
  12.  
  13. public function getName()
  14. {
  15. return 'name';
  16. }
  17. }


routing.yml
  1. acme_task_success:
  2. path: /homepage/
  3. defaults: { _controller: AcmePageBundle:Default:homepage }




Całość niestety nie działa. Po wypełnieniu pól oraz wysłaniu formularza, następuje przekierowanie na tą samą stronę, a mail nie dociera do odbiorcy.

Prośba o wsparcie w tym temacie.


Jeszcze:

  1. # Swiftmailer Configuration
  2. swiftmailer:
  3. transport: smtp
  4. host: mail.nazwadomeny.pl
  5. username: kontakt.nazwadomeny.pl
  6. password: haslo
  7. spool: { type: memory }


Na gmailu, localhoście, wszystko chodziło jak należy.

Ten warunek
  1. if ($form->isValid()) {

nie działa.

Może po kolei uda mi sie rozwiązac z Waszą pomoca ten problem.
Więc krok po kroku ...
Po wywołaniu akcji send na formularzu, jak powinienem poprawnie przekazać jego dane do kontrolera a konkretnie akcji contactAction ?
Forti
Nie wiesz jak się pracuje z formularzami.

Tworzysz formularz i potem wywołujesz $form->handleRequest(Request $request) lub $form->submit(array $request->request->all()); Inaczej zawsze $form->isValid() === false wink.gif
kosmos
Dodałem:

  1. public function contactAction(Request $request)
  2. {
  3.  
  4. $message = new Message();
  5. $form = $this->createForm(new ContactType(),$message);
  6. // $form->handleRequest(Request $request) <-- forti nie zrobiłeś tu błędu?
  7. $form->handleRequest($request); tak nei zwraca błędu
  8.  
  9. if ($form->isValid()) {



ale teraz otrzymuje taki komunikat:
Parse error: syntax error, unexpected '[', expecting ')' in /home/kosmos/domains/nazwadomeny.pl/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php on line 80
czyli linijka z array:
  1. protected function loadMetadata($name)
  2. {
  3. $loaded = parent::loadMetadata($name);
  4.  
  5. array_map([$this, 'resolveDiscriminatorValue'], array_map([$this, 'getMetadataFor'], $loaded));
  6.  
  7. return $loaded;
  8. }
Turson
Masz wersje php ktora nie obsluguje jeszcze tablic []
kosmos
Obecnie mam ustawioną 5.3 ale moge zmienic na 5.4 5.5 5.6
Za kilka minut będę miał 5.6 to sprawdzę czy to to.

Ok to było to .... Po zmianie na 5.6 wchodzi w petlę
  1. if ($form->isValid()) {

Dzięki Turson!

Następnie pojawia mi się taki komunikat
Oops! An Error Occurred
The server returned a "500 Internal Server Error".
Something is broken. Please let us know what you were doing when this error occurred. We will fix it as soon as possible. Sorry for any inconvenience caused.

a w is valid mam

  1. if ($form->isValid()) {
  2. $message = \Swift_Message::newInstance()
  3. ->setSubject($message->getSubject())
  4. ->setFrom(array($message->getEmail()))
  5. ->setTo('adres@gmail.com')
  6. ->setBody($message->getNote());
  7. $this->get('mailer')->send($message);
  8. return $this->redirect($this->generateUrl('acme_task_success'));
  9. }
Forti
A jaki dostajesz błąd? Włącz wersje deweloperską ...
kosmos
Popatrzyłem w logi produkcyjne i miałem problem z przekierowaniem smile.gif Nie znajdowal routingu.

Teraz jest taka sytuacja, że formularz sie wysyła, nie zglasza żadnego błędu, ale mail nie dociera na skrzynkę.

Coś mam nie tak z wypełnianiem obiektu danymi z formularza:
Teraz kod wygląda tak:

  1. if ($form->isValid()) {
  2. $message = \Swift_Message::newInstance()
  3. ->setSubject($message->getSubject())
  4. ->setFrom(array($message->getEmail()))
  5. ->setTo('terefere@o2.pl')
  6. ->setBody($message->getNote());
  7.  
  8. print_r($message->getSubject);
  9. print_r($message->getEmail);
  10.  
  11. $this->get('mailer')->send($message);
  12. return $this->redirect($this->generateUrl('acme_page_success'));
  13. }
  14.  
  15. if (!$form->isValid()) {
  16. return $this->render('AcmePageBundle:Default:contact.html.php', array(
  17. 'form' => $form->createView(),
  18. ));
  19. }


nic nie drukuje ...

Pytanie,
dobrze mam zrobiony ten formularz który przytoczyłem w pierwszym poście?
Chodzi mi konkretnie o wysyłanie danych z formularza (przekazywanie ich do widoku)
Turson
Nie getSubject a getSubject()
kosmos
Tak widzę już .... dzieki, za długo nad tym siedze i nie zauważyłem.

  1. Mam taki kod:
  2. if ($form->isValid()) {
  3. $message = \Swift_Message::newInstance()
  4. ->setName($message->getName())
  5. ->setSurname($message->getSurname())
  6. ->setEmail($message->getEmail())
  7. ->setSubject($message->getSubject())
  8. ->setTo('kontakt@nazwadomeny.pl')
  9. ->setBody($message->getNote());
  10.  
  11.  
  12. print_r($message->getName());
  13. print_r($message->getSurname());
  14. print_r($message->getEmail());
  15. print_r($message->getSubject());
  16. print_r($message->getNote());
  17.  
  18.  
  19. $this->get('mailer')->send($message);
  20. return $this->redirect($this->generateUrl('acme_page_success'));
  21. }


i jak chce to wydrukować ... wali błędem że nie może znaleźć metody:


Fatal error: Call to undefined method Swift_Message::setName() in /home/kosmos/domains/nazwadomeny.pl/src/Acme/PageBundle/Controller/DefaultController.php on line 27
brak metody
Turson
Nadpisales zmienna message przez swifta
kosmos
Możesz jaśniej ?
memory
  1. $message = \Swift_Message::newInstance()
  2. ->setName($message->getName())


$message to Entity czy SwiftMessage? Bo się pogubiłeś
kosmos
memory - dzięki za wskazanie błędu.

Poprawiłem i zmieniłem nieco kod

Controller:

  1. public function contactAction(Request $request)
  2. {
  3. $message = new Message();
  4. $form = $this->createForm(new ContactType(),$message);
  5. $form->handleRequest($request);
  6.  
  7. if ($form->isValid()) {
  8. $to_send = \Swift_Message::newInstance()
  9.  
  10. ->setSubject($message->getSubject())
  11. ->setFrom($message->getFrom())
  12. ->setTo('nazwadomeny.pl')
  13. ->setBody($message->getNote());
  14.  
  15. $this->get('mailer')->send($to_send);
  16. return $this->redirect($this->generateUrl('acme_page_success'));
  17. }
  18.  
  19. if (!$form->isValid()) {
  20. return $this->render('AcmePageBundle:Default:contact.html.php', array(
  21. 'form' => $form->createView(),
  22. ));
  23. }
  24. }


Message.php

  1. <?php
  2.  
  3. // src/Acme/PageBundle/Entity/Message.php
  4. namespace Acme\PageBundle\Entity;
  5.  
  6. class Message
  7. {
  8. protected $name;
  9. protected $surname;
  10. protected $from;
  11. protected $subject;
  12. protected $note;
  13.  
  14.  
  15. public function getMessage()
  16. {
  17. return $this->message;
  18. }
  19. public function setMessage($message)
  20. {
  21. $this->message = $message;
  22. }
  23.  
  24. public function getName()
  25. {
  26. return $this->name;
  27. }
  28. public function setName($name)
  29. {
  30. $this->name = $name;
  31. }
  32.  
  33. public function getSurname()
  34. {
  35. return $this->surname;
  36. }
  37. public function setSurname($surname)
  38. {
  39. $this->surname = $surname;
  40. }
  41.  
  42. public function getFrom()
  43. {
  44. return $this->from;
  45. }
  46. public function setFrom($from)
  47. {
  48. $this->from = $from;
  49. }
  50.  
  51. public function getSubject()
  52. {
  53. return $this->subject;
  54. }
  55. public function setSubject($subject)
  56. {
  57. $this->subject = $subject;
  58. }
  59.  
  60. public function getNote()
  61. {
  62. return $this->note;
  63. }
  64. public function setNote($note)
  65. {
  66. $this->note = $note;
  67. }
  68. }
  69.  
  70. ?>


Teraz po wywołaniu strony z formularzem mam :
Oops! An Error Occurred
The server returned a "500 Internal Server Error".
Something is broken. Please let us know what you were doing when this error occurred. We will fix it as soon as possible. Sorry for any inconvenience caused.


a w logach:

[2015-04-27 19:43:07] request.INFO: Matched route "acme_page_contact" (parameters: "_controller": "Acme\PageBundle\Controller\DefaultController::contactAction", "_route": "acme_page_contact") [] [] [2015-04-27 19:43:07] request.CRITICAL: Uncaught PHP Exception Symfony\Component\PropertyAccess\Exception\NoSuchPropertyException: "Neither the property "email" nor one of the methods "getEmail()", "email()", "isEmail()", "hasEmail()", "__get()" exist and have public access in class "Acme\PageBundle\Entity\Message"." at /home/kosmos/domains/nazwadomeny.pl/vendor/symfony/symfony/src/Symfony/Component/PropertyAccess/PropertyAccessor.php line 371 {"exception":"[object] (Symfony\\Component\\PropertyAccess\\Exception\\NoSuchPropertyException(code: 0): Neither the property \"email\" nor one of the methods \"getEmail()\", \"email()\", \"isEmail()\", \"hasEmail()\", \"__get()\" exist and have public access in class \"Acme\\PageBundle\\Entity\\Message\". at /home/kosmos/domains/nazwadomeny.pl/vendor/symfony/symfony/src/Symfony/Component/PropertyAccess/PropertyAccessor.php:371)"} []

Pytanie dlaczego?
Pozmieniałem w encji Message nazwy metod i zmienne to fakt. Nie ma już tam zmiennej email a pomimo to w logach zwracany jest komunikat że takowa jest.

UPDATE
Znalazłem błąd:
Polegał na tym że w widoku w dalszym ciągu miałem w formularzu email zamiast from smile.gif

Strona z formularzem wyświetla się, po wysłaniu formularza następuje przekierowanie na stronę home, ale wiadomość nadal nie dochodzi na skrzynkę pocztową dry.gif

ZAPIS Z LOGÓW

ERROR: Exception occurred while flushing email queue: Failed to authenticate on SMTP server with username "tumojanazwadomeny.pl" using 2 possible authenticators [] []

Czyli wszystko jasne ale nie do końca ;/

UPDATE

Sukces okazało się że miałem niepoprawnie skonfigurowane uwierzytelniane do skrzynki pocztowej wink.gif

Mam ostatnią rzecz do zrobienia
Obecnie w mailu przesyłam

->setSubject($message->getSubject())
->setFrom($message->getFrom())
->setTo('kontakt@nazwadomeny.pl')
->setBody($message->getNote());

ale w formularzu mam jeszcze pola name i surname. Jak mogę je umieścić w setBody?
Turson
  1. $body = 'Od '.$message->getName().' '.$message->getSurname().'<br>Tresc:<br>'.$message->getNote();

  1. ->setBody($body;

kosmos
Dzięki Turson
Wrzuciłem to do from smile.gif

  1. ->setFrom(array($message->getFrom() => $name_surname))


Wysyłanie działa więc kończę temat smile.gif

Dzięki wszystkim za pomoc smile.gif
Forti
Dzisiaj ostatnio raz Tobie pomogłem z symfony smile.gif Czasami miło jak ktoś kliknie pomógł gdy faktycznie się pomaga wink.gif
com
@up naprawdę przyszedłeś tu tylko dla tego pomógł? jak tak to może czas porzucić to forum. Widzę już kolejny taki post od Ciebie, jak Ci żal, że ktoś Ci nie dał to pisz do moderatora i dostaniesz. W regulaminie masz taki zapis, jest gdzieś przepięte tongue.gif
skowron-line
Cytat(Forti @ 27.04.2015, 21:22:22 ) *
Dzisiaj ostatnio raz Tobie pomogłem z symfony smile.gif Czasami miło jak ktoś kliknie pomógł gdy faktycznie się pomaga wink.gif

o ja pie*****
Forti
Cytat(com @ 27.04.2015, 22:44:53 ) *
@up naprawdę przyszedłeś tu tylko dla tego pomógł? jak tak to może czas porzucić to forum. Widzę już kolejny taki post od Ciebie, jak Ci żal, że ktoś Ci nie dał to pisz do moderatora i dostaniesz. W regulaminie masz taki zapis, jest gdzieś przepięte tongue.gif


A co! Tylko po to biggrin.gif Jak ja kiedyś pisałem tematy to klikałem tongue.gif Jak kolega na no.. po mnie jechał że nie czytam ze zrozumieniem co się pisze tongue.gif Już nie bądźcie tacy zdziwieni. Poświęcam czas na przeczytanie danego kodu, znalezienie błędu, odpisanie i wyjaśnienie to takie zwykłe "pomógł" cieszy jape. Może Tobie nie, ale mi tak wink.gif
com
No i fajnie, że klikałeś, inni też klikają, nie chodzi przecież o to, tylko płaczesz o to, że Ci nie dali a chyba jesteśmy dorośli. Te pomógł itak niczego Ci przecież nie daje, prócz tego iż jest to podziękowanie za nasz trud. Nie dziwie się, że autor nie dał bo jakbyś u mnie się prosił też bym nie dał. Każdy kto komuś pomaga tu poświęca swój czas i pewnie, że cieszy jak się dostanie ale no bez przesady.
Turson
Ilość "pomógł" to przedłużenie p...

#potwierdzoneInfo
com
Ta bo to ma jakiekolwiek znaczenie, nie ilość się liczy a jakość wink.gif
Forti
Za bardzo poważnie di tego podchodzicie tongue.gif ja tan lubie cyferki i gdy ktos mi to kliknie. Dla mnie to zabawa i mam z tego radość. Wy macie radość z pomagania, ja z tego ze ktos mi klika pomógł tongue.gif jak się nie podoba to sorki, przykro mi. Mi sie nie podoba ze nie dostaje pomógł i tyle w temacie! tongue.gif
skowron-line
@Forti może ton twoich wypowiedzi nie odpowiada ludziom. Piszesz komuś kto prosi o pomoc że nie potrafi pracować z formularzami po to pyta aby się nauczyć.
Forti
1. temat dotyczy swiftmailera. Nie sprawdził porządnie gdzie ma błąd
2. "developuje" na produkcjnym śwodowisku - serio?
3. Kiedyś pytał o formularze i udzielałem bardzo szczegółowych odpowiedzi. Nie kliknął z tego co pamiętam tongue.gif (mogę się mylić)
4. Gdyby spełnił punkt 2, czyli pracował tak jak powinno się, to dostał by wielki exception wink.gif Nie podoba się ton wypowiedzi? Przepraszam.. next time dam czekolade za chęci napisania tematu z kodem, który zajmuje kilkukrotnie więcej czasu niż sprawdzenie logów.

Serio?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.