Нет описания

CaptchaRenderer.php 4.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. <?php
  2. namespace MailPoet\Subscription;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\Entities\FormEntity;
  5. use MailPoet\Form\FormsRepository;
  6. use MailPoet\Form\Renderer as FormRenderer;
  7. use MailPoet\Util\Url as UrlHelper;
  8. use MailPoet\WP\Functions as WPFunctions;
  9. class CaptchaRenderer {
  10. /** @var UrlHelper */
  11. private $urlHelper;
  12. /** @var WPFunctions */
  13. private $wp;
  14. /** @var CaptchaSession */
  15. private $captchaSession;
  16. /** @var SubscriptionUrlFactory */
  17. private $subscriptionUrlFactory;
  18. /** @var FormRenderer */
  19. private $formRenderer;
  20. /** @var FormsRepository */
  21. private $formsRepository;
  22. public function __construct(
  23. UrlHelper $urlHelper,
  24. WPFunctions $wp,
  25. CaptchaSession $captchaSession,
  26. SubscriptionUrlFactory $subscriptionUrlFactory,
  27. FormsRepository $formsRepository,
  28. FormRenderer $formRenderer
  29. ) {
  30. $this->urlHelper = $urlHelper;
  31. $this->wp = $wp;
  32. $this->captchaSession = $captchaSession;
  33. $this->subscriptionUrlFactory = $subscriptionUrlFactory;
  34. $this->formRenderer = $formRenderer;
  35. $this->formsRepository = $formsRepository;
  36. }
  37. public function getCaptchaPageTitle() {
  38. return $this->wp->__("Confirm you’re not a robot", 'mailpoet');
  39. }
  40. public function getCaptchaPageContent($sessionId) {
  41. $this->captchaSession->init($sessionId);
  42. $fields = [
  43. [
  44. 'id' => 'captcha',
  45. 'type' => 'text',
  46. 'params' => [
  47. 'label' => $this->wp->__('Type in the characters you see in the picture above:', 'mailpoet'),
  48. 'value' => '',
  49. 'obfuscate' => false,
  50. ],
  51. ],
  52. ];
  53. $form = array_merge(
  54. $fields,
  55. [
  56. [
  57. 'id' => 'submit',
  58. 'type' => 'submit',
  59. 'params' => [
  60. 'label' => $this->wp->__('Subscribe', 'mailpoet'),
  61. ],
  62. ],
  63. ]
  64. );
  65. $captchaSessionForm = $this->captchaSession->getFormData();
  66. $formId = 0;
  67. $showSuccessMessage = !empty($_GET['mailpoet_success']);
  68. $showErrorMessage = !empty($_GET['mailpoet_error']);
  69. if (isset($captchaSessionForm['form_id'])) {
  70. $formId = (int)$captchaSessionForm['form_id'];
  71. } elseif ($showSuccessMessage) {
  72. $formId = (int)$_GET['mailpoet_success'];
  73. } elseif ($showErrorMessage) {
  74. $formId = (int)$_GET['mailpoet_error'];
  75. }
  76. $formModel = $this->formsRepository->findOneById($formId);
  77. if (!$formModel instanceof FormEntity) {
  78. return false;
  79. }
  80. if ($showSuccessMessage) {
  81. // Display a success message in a no-JS flow
  82. return $this->renderFormMessages($formModel, $showSuccessMessage);
  83. }
  84. $formHtml = '<form method="POST" ' .
  85. 'action="' . admin_url('admin-post.php?action=mailpoet_subscription_form') . '" ' .
  86. 'class="mailpoet_form mailpoet_captcha_form" ' .
  87. 'novalidate>';
  88. $formHtml .= '<input type="hidden" name="data[form_id]" value="' . $formId . '" />';
  89. $formHtml .= '<input type="hidden" name="data[captcha_session_id]" value="' . htmlspecialchars($this->captchaSession->getId()) . '" />';
  90. $formHtml .= '<input type="hidden" name="api_version" value="v1" />';
  91. $formHtml .= '<input type="hidden" name="endpoint" value="subscribers" />';
  92. $formHtml .= '<input type="hidden" name="mailpoet_method" value="subscribe" />';
  93. $formHtml .= '<input type="hidden" name="mailpoet_redirect" ' .
  94. 'value="' . htmlspecialchars($this->urlHelper->getCurrentUrl(), ENT_QUOTES) . '" />';
  95. $width = 220;
  96. $height = 60;
  97. $captchaUrl = $this->subscriptionUrlFactory->getCaptchaImageUrl($width, $height, $this->captchaSession->getId());
  98. $formHtml .= '<div class="mailpoet_form_hide_on_success">';
  99. $formHtml .= '<p class="mailpoet_paragraph">';
  100. $formHtml .= '<img class="mailpoet_captcha mailpoet_captcha_update" src="' . $captchaUrl . '" width="' . $width . '" height="' . $height . '" title="' . $this->wp->__('Click to refresh the CAPTCHA', 'mailpoet') . '" />';
  101. $formHtml .= '</p>';
  102. // subscription form
  103. $formHtml .= $this->formRenderer->renderBlocks($form, [], $honeypot = false);
  104. $formHtml .= '</div>';
  105. $formHtml .= $this->renderFormMessages($formModel, $showSuccessMessage, $showErrorMessage);
  106. $formHtml .= '</form>';
  107. return $formHtml;
  108. }
  109. private function renderFormMessages(
  110. FormEntity $formModel,
  111. $showSuccessMessage = false,
  112. $showErrorMessage = false
  113. ) {
  114. $settings = $formModel->getSettings() ?? [];
  115. $formHtml = '<div class="mailpoet_message">';
  116. $formHtml .= '<p class="mailpoet_validate_success" ' . ($showSuccessMessage ? '' : ' style="display:none;"') . '>' . $settings['success_message'] . '</p>';
  117. $formHtml .= '<p class="mailpoet_validate_error" ' . ($showErrorMessage ? '' : ' style="display:none;"') . '>' . $this->wp->__('The characters you entered did not match the CAPTCHA image. Please try again with this new image.', 'mailpoet') . '</p>';
  118. $formHtml .= '</div>';
  119. return $formHtml;
  120. }
  121. }