praiadeseselle/wire/modules/Inputfield/InputfieldEmail.module

180 lines
4.8 KiB
Text
Raw Normal View History

2022-03-08 15:55:41 +01:00
<?php namespace ProcessWire;
/**
* An Inputfield for handling email addresses
*
2022-11-05 18:32:48 +01:00
* ProcessWire 3.x, Copyright 2022 by Ryan Cramer
2022-03-08 15:55:41 +01:00
* https://processwire.com
*
* @property int $confirm Specify 1 to make it include a second input for confirmation
* @property string $confirmLabel label to accompany second input
* @property int maxlength Max length of email address (default=512)
*
* @method string renderConfirm(array $attrs)
*
*/
class InputfieldEmail extends InputfieldText {
public static function getModuleInfo() {
return array(
'title' => __('Email', __FILE__), // Module Title
'version' => 101,
'summary' => __('E-Mail address in valid format', __FILE__) // Module Summary
);
}
/**
* Construct
*
*/
public function __construct() {
$this->setAttribute('name', 'email');
parent::__construct();
$this->setAttribute('type', 'email');
$this->setAttribute('maxlength', 250);
$this->setAttribute('size', 0);
$this->set('confirm', 0); // when 1, two inputs will appear and both must match
$this->set('confirmLabel', $this->_('Confirm'));
$this->set('value2', '');
}
/**
* Render input
*
* @return string
*
*/
public function ___render() {
if(!$this->label || $this->label === $this->attr('name')) {
$this->label = $this->_('E-Mail'); // label headline when no default specified
}
if($this->confirm && count($this->getErrors())) $this->val('');
$attrs = $this->getAttributes();
$out = "<input " . $this->getAttributesString($attrs) . " />";
if($this->confirm) $out .= $this->renderConfirm($attrs);
return $out;
}
/**
* Render the secondary “Confirm” email input
*
* @param array $attrs
* @return string
*
*/
protected function ___renderConfirm(array $attrs) {
foreach(array('id', 'name') as $key) {
if(isset($attrs[$key])) $attrs[$key] = '_' . $attrs[$key] . '_confirm';
}
$attrs['aria-label'] = $this->confirmLabel;
$attrs['placeholder'] = $this->confirmLabel;
return "<div style='margin-top:0.5em'><input " . $this->getAttributesString($attrs) . " /></div>";
}
/**
* Set attribute value
*
* @param string $value
* @return string
*
*/
protected function setAttributeValue($value) {
2022-11-05 18:32:48 +01:00
$value = (string) $value;
2022-03-08 15:55:41 +01:00
if(strlen($value)) {
$value = $this->wire()->sanitizer->email($value);
if(!strlen($value)) $this->error($this->_("Please enter a valid e-mail address")); // Error message when email address is invalid
}
return $value;
}
/**
* Process input
*
* @param WireInputData $input
* @return $this
*
*/
public function ___processInput(WireInputData $input) {
$field = $this->hasField;
$fieldtype = $field ? $field->type : $this->hasFieldtype; /** @var FieldtypeEmail $fieldtype */
$page = $this->hasPage;
$errors = array();
$valuePrevious = $this->val();
$name = $this->attr('name');
parent::___processInput($input);
$value = $this->val();
$changed = strtolower($value) !== strtolower($valuePrevious);
if($this->confirm) {
$value2 = $this->wire()->sanitizer->email($input["_{$name}_confirm"]);
if((strlen($value) || strlen($value2)) && strtolower($value) !== strtolower($value2)) {
$errors[] = $this->_('The emails you entered did not match, please enter again');
}
}
if($changed && $value && $field && $page && $field->hasFlag(Field::flagUnique)) {
$fields = $this->wire()->fields;
$pageId = $fields->tableTools()->valueExists($field, $value);
if($pageId && $pageId != $page->id) {
$errors[] = sprintf($this->_('Email “%s” is already in use, please use a different one'), $value);
}
}
if($fieldtype && $fieldtype instanceof FieldtypeEmail) {
$max = $fieldtype->getMaxEmailLength();
if(strlen($value) > $max) {
$errors[] = sprintf($this->_('Email exceeded max allowed length of %d characters'), $max);
}
}
if(count($errors)) {
foreach($errors as $error) $this->error($error);
$this->val($valuePrevious);
}
return $this;
}
/**
* Field config
*
* @return InputfieldWrapper
*
*/
public function ___getConfigInputfields() {
$inputfields = parent::___getConfigInputfields();
$skips = array('stripTags', 'pattern');
foreach($skips as $name) {
$f = $inputfields->get($name);
if($f) $inputfields->remove($f);
}
/** @var InputfieldCheckbox $f */
$f = $this->wire()->modules->get('InputfieldCheckbox');
$f->attr('name', 'confirm');
$f->label = $this->_('Confirm email address?');
$f->description = $this->_('When checked, two email inputs will appear and the user will have to enter their email address twice to confirm it. This helps reduce the possibility of typos.');
$f->attr('value', 1);
$f->collapsed = $this->confirm ? Inputfield::collapsedNo : Inputfield::collapsedYes;
if($this->confirm) $f->attr('checked', 'checked');
$inputfields->add($f);
return $inputfields;
}
}