X-Git-Url: http://www.aleph1.co.uk/gitweb/?a=blobdiff_plain;f=web%2Fcore%2Fmodules%2Fcontact%2Fsrc%2FMessageForm.php;fp=web%2Fcore%2Fmodules%2Fcontact%2Fsrc%2FMessageForm.php;h=16d41b5acc482b77060d91745eecaa91d693deb8;hb=a2bd1bf0c2c1f1a17d188f4dc0726a45494cefae;hp=0000000000000000000000000000000000000000;hpb=57c063afa3f66b07c4bbddc2d6129a96d90f0aad;p=yaffs-website diff --git a/web/core/modules/contact/src/MessageForm.php b/web/core/modules/contact/src/MessageForm.php new file mode 100644 index 000000000..16d41b5ac --- /dev/null +++ b/web/core/modules/contact/src/MessageForm.php @@ -0,0 +1,238 @@ +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'), + $container->get('entity_type.bundle.info'), + $container->get('datetime.time') + ); + } + + /** + * {@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'] = [ + '#theme_wrappers' => ['container__preview'], + '#attributes' => ['class' => ['preview']], + ]; + $form['preview']['message'] = $this->entityManager->getViewBuilder('contact_message')->view($message, 'full'); + } + + $form['name'] = [ + '#type' => 'textfield', + '#title' => $this->t('Your name'), + '#maxlength' => 255, + '#required' => TRUE, + ]; + $form['mail'] = [ + '#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->getDisplayName(); + $form['name']['#required'] = FALSE; + $form['name']['#plain_text'] = $user->getDisplayName(); + + $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'] = [ + '#type' => 'item', + '#title' => $this->t('To'), + '#value' => $message->getPersonalRecipient()->id(), + 'name' => [ + '#theme' => 'username', + '#account' => $message->getPersonalRecipient(), + ], + ]; + } + + $form['copy'] = [ + '#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'] = [ + '#type' => 'submit', + '#value' => $this->t('Preview'), + '#submit' => ['::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.', [ + '%limit' => $limit, + '@interval' => $this->dateFormatter->formatInterval($interval), + ])); + } + } + + return $message; + } + + /** + * {@inheritdoc} + */ + public function save(array $form, FormStateInterface $form_state) { + $message = $this->entity; + $user = $this->currentUser(); + // 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(); + $this->mailHandler->sendMailMessages($message, $user); + $contact_form = $message->getContactForm(); + + $this->flood->register('contact', $this->config('contact.settings')->get('flood.interval')); + if ($submission_message = $contact_form->getMessage()) { + drupal_set_message($submission_message); + } + + // 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->setRedirectUrl($contact_form->getRedirectUrl()); + } + } + +}