Form * @copyright Tamaranga */ class ContactForm extends Form { /** @var string */ public $title = ''; /** @var string */ public $captcha = '1'; /** @var string */ public $captcha_key = 'contact-form'; /** @var string|null */ public $successUrl; public function init() { parent::init(); $this->setTemplate('contact.form', 'contacts'); $this->setTitle(_t('@contacts', 'Contact Form')); $this->useBlocksRotation(); } public function data() { $data = parent::data(); $user = $this->request->user(); $data['user'] = ($user ? $user->data(['name', 'email']) : ['name' => '', 'email' => '']); $data['guest'] = $this->isGuest(); $data['captcha'] = $this->hasCaptcha(); $data['types'] = Contacts::getContactTypes(); return $data; } public function submit() { $data = $this->validate(); if ($this->errors->any()) { return parent::submit(); } $type = $data['type']; unset($data['type']); $data['user_ip'] = $this->request->remoteAddress(); $data['useragent'] = $this->request->userAgent(); $contact = Contacts::sendContactMessage($data, $type, $this->request->user()); if (! $contact) { $this->errors->reloadPage(); return parent::submit(); } if ($this->successUrl) { $this->respond('redirect', $this->successUrl); } else { $this->respond('message', _t('contacts', 'Your message was successfully sent.
We will try to answer it as soon as possible.')); } return parent::submit(); } public function validate($data = []) { $data = $this->validateUsingRules($data, [ 'name' => [ TYPE_NOTAGS, 'limit' => $this->config('contacts.form.name.limit', 70, TYPE_UINT), function (&$name) { # todo $clean = ['name' => &$name]; Users::i()->cleanUserData($clean, ['name'], ['name_length' => mb_strlen($name)]); return true; }, ], 'email' => [ TYPE_NOTAGS, 'limit' => $this->config('contacts.form.email.limit', 70, TYPE_UINT), 'email' => ['message' => _t('contacts', 'Incorrect email address')], ], 'message' => [ TYPE_TEXT, 'limit' => $this->config('contacts.form.message.limit', 3000, TYPE_UINT), 'min' => [ $this->config('contacts.form.message.min', 10, TYPE_UINT), 'message' => _t('contacts', 'Message text is too short'), ], ], 'type' => TYPE_UINT, ]); if ($this->errors->any()) { return $data; } $user = $this->request->user(); if ($user) { $data['name'] = $data['name'] ?: $user->data('name'); if (! $this->input->isEmail($data['email'])) { $data['email'] = $user->email(); } } else { if (empty($data['name'])) { $this->errors->set(_t('contacts', 'Enter your name'), 'name'); } if (! $this->input->isEmail($data['email'])) { $this->errors->set(_t('contacts', 'Incorrect email address'), 'email'); } } $data = $this->validateBlocks($data); if ($this->errors->any()) { return $data; } if ($this->hasCaptcha()) { $this->isCaptchaValid($this->captcha_key); } else { if ($this->errors->no()) { $this->tooManyRequests($this->getKey()); } } return $data; } /** * Is current user guest * @return bool */ public function isGuest() { return is_null($this->request->user()); } /** * Use captcha (if guest) * @return bool */ public function hasCaptcha() { if (! $this->isGuest()) { return false; } return Captcha::enabled($this->captcha_key); } /** * @inheritdoc */ public function settingsForm($form) { $form->text('title', _t('@site', 'Form Title'), _t('contacts', 'Contact Form', true)); $form->select('captcha', _t('@contacts', 'Captcha in the form'), $this->captcha, function () { return Captcha::actionDriverOptions(); }) ->sysAdmin('captcha.enabled.' . $this->captcha_key); } }