Нет описания

Widget.php 8.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. <?php
  2. namespace MailPoet\Form;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\API\JSON\API;
  5. use MailPoet\Config\Renderer as ConfigRenderer;
  6. use MailPoet\DI\ContainerWrapper;
  7. use MailPoet\Entities\FormEntity;
  8. use MailPoet\Form\Renderer as FormRenderer;
  9. use MailPoet\Settings\SettingsController;
  10. use MailPoet\Util\Security;
  11. use MailPoet\WP\Functions as WPFunctions;
  12. class Widget extends \WP_Widget {
  13. private $renderer;
  14. private $wp;
  15. /** @var AssetsController */
  16. private $assetsController;
  17. /** @var FormRenderer */
  18. private $formRenderer;
  19. /** @var FormsRepository */
  20. private $formsRepository;
  21. public function __construct() {
  22. parent::__construct(
  23. 'mailpoet_form',
  24. WPFunctions::get()->__('MailPoet 3 Form', 'mailpoet'),
  25. ['description' => WPFunctions::get()->__('Add a newsletter subscription form', 'mailpoet')]
  26. );
  27. $this->wp = new WPFunctions;
  28. $this->renderer = new \MailPoet\Config\Renderer(!WP_DEBUG, !WP_DEBUG);
  29. $this->assetsController = new AssetsController($this->wp, $this->renderer, SettingsController::getInstance());
  30. $this->formRenderer = ContainerWrapper::getInstance()->get(FormRenderer::class);
  31. $this->formsRepository = ContainerWrapper::getInstance()->get(FormsRepository::class);
  32. if (!is_admin()) {
  33. $this->setupIframe();
  34. } else {
  35. WPFunctions::get()->addAction('widgets_admin_page', [
  36. $this->assetsController,
  37. 'setupAdminWidgetPageDependencies',
  38. ]);
  39. }
  40. }
  41. public function setupIframe() {
  42. $formId = (isset($_GET['mailpoet_form_iframe']) ? (int)$_GET['mailpoet_form_iframe'] : 0);
  43. if (!$formId || !$this->formsRepository->findOneById($formId)) return;
  44. $formHtml = $this->widget(
  45. [
  46. 'form' => $formId,
  47. 'form_type' => 'iframe',
  48. ]
  49. );
  50. $scripts = $this->assetsController->printScripts();
  51. // language attributes
  52. $languageAttributes = [];
  53. $isRtl = (bool)(function_exists('is_rtl') && WPFunctions::get()->isRtl());
  54. if ($isRtl) {
  55. $languageAttributes[] = 'dir="rtl"';
  56. }
  57. if (get_option('html_type') === 'text/html') {
  58. $languageAttributes[] = sprintf('lang="%s"', WPFunctions::get()->getBloginfo('language'));
  59. }
  60. $languageAttributes = WPFunctions::get()->applyFilters(
  61. 'language_attributes', implode(' ', $languageAttributes)
  62. );
  63. $data = [
  64. 'language_attributes' => $languageAttributes,
  65. 'scripts' => $scripts,
  66. 'form' => $formHtml,
  67. 'mailpoet_form' => [
  68. 'ajax_url' => WPFunctions::get()->adminUrl('admin-ajax.php', 'absolute'),
  69. 'is_rtl' => $isRtl,
  70. ],
  71. ];
  72. try {
  73. echo $this->renderer->render('form/iframe.html', $data);
  74. } catch (\Exception $e) {
  75. echo $e->getMessage();
  76. }
  77. exit();
  78. }
  79. /**
  80. * Save the new widget's title.
  81. */
  82. public function update($newInstance, $oldInstance) {
  83. $instance = $oldInstance;
  84. $instance['title'] = strip_tags($newInstance['title']);
  85. $instance['form'] = (int)$newInstance['form'];
  86. return $instance;
  87. }
  88. /**
  89. * Output the widget's option form.
  90. */
  91. public function form($instance) {
  92. $instance = WPFunctions::get()->wpParseArgs(
  93. (array)$instance,
  94. [
  95. 'title' => WPFunctions::get()->__('Subscribe to Our Newsletter', 'mailpoet'),
  96. ]
  97. );
  98. $formEditUrl = WPFunctions::get()->adminUrl('admin.php?page=mailpoet-form-editor&id=');
  99. // set title
  100. $title = isset($instance['title']) ? strip_tags($instance['title']) : '';
  101. // set form
  102. $selectedForm = isset($instance['form']) ? (int)($instance['form']) : 0;
  103. // get forms list
  104. $forms = $this->formsRepository->findBy(['deletedAt' => null], ['name' => 'asc']);
  105. ?><p>
  106. <label for="<?php $this->get_field_id( 'title' ) ?>"><?php WPFunctions::get()->_e('Title:', 'mailpoet'); ?></label>
  107. <input
  108. type="text"
  109. class="widefat"
  110. id="<?php echo $this->get_field_id('title') ?>"
  111. name="<?php echo $this->get_field_name('title'); ?>"
  112. value="<?php echo WPFunctions::get()->escAttr($title); ?>"
  113. />
  114. </p>
  115. <p>
  116. <select class="widefat" id="<?php echo $this->get_field_id('form') ?>" name="<?php echo $this->get_field_name('form'); ?>">
  117. <?php
  118. foreach ($forms as $form) {
  119. $isSelected = ($selectedForm === $form->getId()) ? 'selected="selected"' : '';
  120. $formName = $form->getName() ? $this->wp->escHtml($form->getName()) : "({$this->wp->_x('no name', 'fallback for forms without a name in a form list')})"
  121. ?>
  122. <option value="<?php echo $form->getId(); ?>" <?php echo $isSelected; ?>><?php echo $formName; ?></option>
  123. <?php } ?>
  124. </select>
  125. </p>
  126. <p>
  127. <a href="javascript:;" onClick="createSubscriptionForm()" class="mailpoet_form_new"><?php WPFunctions::get()->_e('Create a new form', 'mailpoet'); ?></a>
  128. </p>
  129. <script type="text/javascript">
  130. function createSubscriptionForm() {
  131. MailPoet.Ajax.post({
  132. endpoint: 'forms',
  133. action: 'create',
  134. api_version: window.mailpoet_api_version
  135. }).done(function(response) {
  136. if (response.data && response.data.id) {
  137. window.location =
  138. "<?php echo $formEditUrl; ?>" + response.data.id;
  139. }
  140. }).fail((response) => {
  141. if (response.errors.length > 0) {
  142. MailPoet.Notice.error(
  143. response.errors.map((error) => { return error.message; }),
  144. { scroll: true }
  145. );
  146. }
  147. });
  148. return false;
  149. }
  150. </script>
  151. <?php
  152. return '';
  153. }
  154. /**
  155. * Output the widget itself.
  156. */
  157. public function widget($args, $instance = null) {
  158. $this->assetsController->setupFrontEndDependencies();
  159. $beforeWidget = !empty($args['before_widget']) ? $args['before_widget'] : '';
  160. $afterWidget = !empty($args['after_widget']) ? $args['after_widget'] : '';
  161. $beforeTitle = !empty($args['before_title']) ? $args['before_title'] : '';
  162. $afterTitle = !empty($args['after_title']) ? $args['after_title'] : '';
  163. if ($instance === null) {
  164. $instance = $args;
  165. }
  166. $title = $this->wp->applyFilters(
  167. 'widget_title',
  168. !empty($instance['title']) ? $instance['title'] : '',
  169. $instance,
  170. $this->id_base // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
  171. );
  172. // get form
  173. if (empty($instance['form'])) return '';
  174. $form = $this->formsRepository->findOneById($instance['form']);
  175. if (!$form) return '';
  176. if ($form->getDeletedAt()) return '';
  177. if ($form->getStatus() !== FormEntity::STATUS_ENABLED) return '';
  178. $formType = 'widget';
  179. if (isset($instance['form_type']) && in_array(
  180. $instance['form_type'],
  181. [
  182. 'html',
  183. 'php',
  184. 'iframe',
  185. 'shortcode',
  186. ]
  187. )) {
  188. $formType = $instance['form_type'];
  189. }
  190. $body = (!empty($form->getBody()) ? $form->getBody() : []);
  191. $output = '';
  192. $settings = $form->getSettings();
  193. if (!empty($body) && is_array($settings)) {
  194. $formId = $this->id_base . '_' . $form->getId(); // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
  195. $data = [
  196. 'form_html_id' => $formId,
  197. 'form_id' => $form->getId(),
  198. 'form_type' => $formType,
  199. 'form_success_message' => $settings['success_message'],
  200. 'title' => $title,
  201. 'styles' => $this->formRenderer->renderStyles($form, '#' . $formId, FormEntity::DISPLAY_TYPE_OTHERS),
  202. 'html' => $this->formRenderer->renderHTML($form),
  203. 'before_widget' => $beforeWidget,
  204. 'after_widget' => $afterWidget,
  205. 'before_title' => $beforeTitle,
  206. 'after_title' => $afterTitle,
  207. ];
  208. // (POST) non ajax success/error variables
  209. $data['success'] = (
  210. (isset($_GET['mailpoet_success']))
  211. &&
  212. ((int)$_GET['mailpoet_success'] === $form->getId())
  213. );
  214. $data['error'] = (
  215. (isset($_GET['mailpoet_error']))
  216. &&
  217. ((int)$_GET['mailpoet_error'] === $form->getId())
  218. );
  219. // generate security token
  220. $data['token'] = Security::generateToken();
  221. // add API version
  222. $data['api_version'] = API::CURRENT_VERSION;
  223. // render form
  224. $renderer = new ConfigRenderer();
  225. try {
  226. $output = $renderer->render('form/front_end_form.html', $data);
  227. $output = WPFunctions::get()->doShortcode($output);
  228. $output = $this->wp->applyFilters('mailpoet_form_widget_post_process', $output);
  229. } catch (\Exception $e) {
  230. $output = $e->getMessage();
  231. }
  232. }
  233. if ($formType === 'widget') {
  234. echo $output;
  235. } else {
  236. return $output;
  237. }
  238. }
  239. }