Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 7 |
CRAP | |
0.00% |
0 / 107 |
| MessageForm | |
0.00% |
0 / 1 |
|
0.00% |
0 / 7 |
272 | |
0.00% |
0 / 107 |
| __construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 6 |
|||
| create | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 8 |
|||
| form | |
0.00% |
0 / 1 |
20 | |
0.00% |
0 / 54 |
|||
| actions | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 9 |
|||
| preview | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 4 |
|||
| validateForm | |
0.00% |
0 / 1 |
30 | |
0.00% |
0 / 13 |
|||
| save | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 13 |
|||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\contact\MessageForm. | |
| */ | |
| namespace Drupal\contact; | |
| use Drupal\Core\Datetime\DateFormatterInterface; | |
| use Drupal\Core\Entity\ContentEntityForm; | |
| use Drupal\Core\Entity\EntityManagerInterface; | |
| use Drupal\Core\Flood\FloodInterface; | |
| use Drupal\Core\Form\FormStateInterface; | |
| use Drupal\Core\Language\LanguageManagerInterface; | |
| use Symfony\Component\DependencyInjection\ContainerInterface; | |
| /** | |
| * Form controller for contact message forms. | |
| */ | |
| class MessageForm extends ContentEntityForm { | |
| /** | |
| * The message being used by this form. | |
| * | |
| * @var \Drupal\contact\MessageInterface | |
| */ | |
| protected $entity; | |
| /** | |
| * The flood control mechanism. | |
| * | |
| * @var \Drupal\Core\Flood\FloodInterface | |
| */ | |
| protected $flood; | |
| /** | |
| * The language manager service. | |
| * | |
| * @var \Drupal\Core\Language\LanguageManagerInterface | |
| */ | |
| protected $languageManager; | |
| /** | |
| * The contact mail handler service. | |
| * | |
| * @var \Drupal\contact\MailHandlerInterface | |
| */ | |
| protected $mailHandler; | |
| /** | |
| * The date formatter service. | |
| * | |
| * @var \Drupal\Core\Datetime\DateFormatterInterface | |
| */ | |
| protected $dateFormatter; | |
| /** | |
| * Constructs a MessageForm object. | |
| * | |
| * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager | |
| * The entity manager. | |
| * @param \Drupal\Core\Flood\FloodInterface $flood | |
| * The flood control mechanism. | |
| * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager | |
| * The language manager service. | |
| * @param \Drupal\contact\MailHandlerInterface $mail_handler | |
| * The contact mail handler service. | |
| * @param \Drupal\Core\Datetime\DateFormatterInterface $date_formatter | |
| * The date service. | |
| */ | |
| public function __construct(EntityManagerInterface $entity_manager, FloodInterface $flood, LanguageManagerInterface $language_manager, MailHandlerInterface $mail_handler, DateFormatterInterface $date_formatter) { | |
| parent::__construct($entity_manager); | |
| $this->flood = $flood; | |
| $this->languageManager = $language_manager; | |
| $this->mailHandler = $mail_handler; | |
| $this->dateFormatter = $date_formatter; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public static function create(ContainerInterface $container) { | |
| return new static( | |
| $container->get('entity.manager'), | |
| $container->get('flood'), | |
| $container->get('language_manager'), | |
| $container->get('contact.mail_handler'), | |
| $container->get('date.formatter') | |
| ); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function form(array $form, FormStateInterface $form_state) { | |
| $user = $this->currentUser(); | |
| $message = $this->entity; | |
| $form = parent::form($form, $form_state, $message); | |
| $form['#attributes']['class'][] = 'contact-form'; | |
| if (!empty($message->preview)) { | |
| $form['preview'] = array( | |
| '#theme_wrappers' => array('container__preview'), | |
| '#attributes' => array('class' => array('preview')), | |
| ); | |
| $form['preview']['message'] = $this->entityManager->getViewBuilder('contact_message')->view($message, 'full'); | |
| } | |
| $form['name'] = array( | |
| '#type' => 'textfield', | |
| '#title' => $this->t('Your name'), | |
| '#maxlength' => 255, | |
| '#required' => TRUE, | |
| ); | |
| $form['mail'] = array( | |
| '#type' => 'email', | |
| '#title' => $this->t('Your email address'), | |
| '#required' => TRUE, | |
| ); | |
| if ($user->isAnonymous()) { | |
| $form['#attached']['library'][] = 'core/drupal.form'; | |
| $form['#attributes']['data-user-info-from-browser'] = TRUE; | |
| } | |
| // Do not allow authenticated users to alter the name or email values to | |
| // prevent the impersonation of other users. | |
| else { | |
| $form['name']['#type'] = 'item'; | |
| $form['name']['#value'] = $user->getUsername(); | |
| $form['name']['#required'] = FALSE; | |
| $form['name']['#plain_text'] = $user->getUsername(); | |
| $form['mail']['#type'] = 'item'; | |
| $form['mail']['#value'] = $user->getEmail(); | |
| $form['mail']['#required'] = FALSE; | |
| $form['mail']['#plain_text'] = $user->getEmail(); | |
| } | |
| // The user contact form has a preset recipient. | |
| if ($message->isPersonal()) { | |
| $form['recipient'] = array( | |
| '#type' => 'item', | |
| '#title' => $this->t('To'), | |
| '#value' => $message->getPersonalRecipient()->id(), | |
| 'name' => array( | |
| '#theme' => 'username', | |
| '#account' => $message->getPersonalRecipient(), | |
| ), | |
| ); | |
| } | |
| $form['copy'] = array( | |
| '#type' => 'checkbox', | |
| '#title' => $this->t('Send yourself a copy'), | |
| // Do not allow anonymous users to send themselves a copy, because it can | |
| // be abused to spam people. | |
| '#access' => $user->isAuthenticated(), | |
| ); | |
| return $form; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function actions(array $form, FormStateInterface $form_state) { | |
| $elements = parent::actions($form, $form_state); | |
| $elements['submit']['#value'] = $this->t('Send message'); | |
| $elements['preview'] = array( | |
| '#type' => 'submit', | |
| '#value' => $this->t('Preview'), | |
| '#submit' => array('::submitForm', '::preview'), | |
| ); | |
| return $elements; | |
| } | |
| /** | |
| * Form submission handler for the 'preview' action. | |
| */ | |
| public function preview(array $form, FormStateInterface $form_state) { | |
| $message = $this->entity; | |
| $message->preview = TRUE; | |
| $form_state->setRebuild(); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function validateForm(array &$form, FormStateInterface $form_state) { | |
| $message = parent::validateForm($form, $form_state); | |
| // Check if flood control has been activated for sending emails. | |
| if (!$this->currentUser()->hasPermission('administer contact forms') && (!$message->isPersonal() || !$this->currentUser()->hasPermission('administer users'))) { | |
| $limit = $this->config('contact.settings')->get('flood.limit'); | |
| $interval = $this->config('contact.settings')->get('flood.interval'); | |
| if (!$this->flood->isAllowed('contact', $limit, $interval)) { | |
| $form_state->setErrorByName('', $this->t('You cannot send more than %limit messages in @interval. Try again later.', array( | |
| '%limit' => $limit, | |
| '@interval' => $this->dateFormatter->formatInterval($interval), | |
| ))); | |
| } | |
| } | |
| return $message; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function save(array $form, FormStateInterface $form_state) { | |
| $message = $this->entity; | |
| $user = $this->currentUser(); | |
| $this->mailHandler->sendMailMessages($message, $user); | |
| $this->flood->register('contact', $this->config('contact.settings')->get('flood.interval')); | |
| drupal_set_message($this->t('Your message has been sent.')); | |
| // To avoid false error messages caused by flood control, redirect away from | |
| // the contact form; either to the contacted user account or the front page. | |
| if ($message->isPersonal() && $user->hasPermission('access user profiles')) { | |
| $form_state->setRedirectUrl($message->getPersonalRecipient()->urlInfo()); | |
| } | |
| else { | |
| $form_state->setRedirect('<front>'); | |
| } | |
| // Save the message. In core this is a no-op but should contrib wish to | |
| // implement message storage, this will make the task of swapping in a real | |
| // storage controller straight-forward. | |
| $message->save(); | |
| } | |
| } |