From 03503075c16c25f226e64c54a2b825e50d64e3b1 Mon Sep 17 00:00:00 2001 From: Ryan Cramer Date: Thu, 20 Aug 2020 10:24:18 -0400 Subject: [PATCH] Minor code updates to FieldtypeEmail and InputfieldEmail --- wire/modules/Fieldtype/FieldtypeEmail.module | 68 +++++++++++-- .../modules/Inputfield/InputfieldEmail.module | 98 +++++++++++++++---- 2 files changed, 136 insertions(+), 30 deletions(-) diff --git a/wire/modules/Fieldtype/FieldtypeEmail.module b/wire/modules/Fieldtype/FieldtypeEmail.module index 5dae8899..c504c2b3 100644 --- a/wire/modules/Fieldtype/FieldtypeEmail.module +++ b/wire/modules/Fieldtype/FieldtypeEmail.module @@ -22,43 +22,91 @@ class FieldtypeEmail extends FieldtypeText { 'summary' => 'Field that stores an e-mail address', ); } - + + /** + * Get max email address length + * + * @return int + * + */ public function getMaxEmailLength() { - return $this->wire('database')->getMaxIndexLength(); + return $this->wire()->database->getMaxIndexLength(); } + /** + * Get Inputfield module for this Fieldtype + * + * @param Page $page + * @param Field $field + * @return InputfieldEmail + * + */ public function getInputfield(Page $page, Field $field) { /** @var InputfieldEmail $inputfield */ - $inputfield = $this->modules->get('InputfieldEmail'); - $inputfield->class = $this->className(); + $inputfield = $this->wire()->modules->get('InputfieldEmail'); + $inputfield->addClass($this->className()); return $inputfield; } + /** + * Sanitize value for page + * + * @param Page $page + * @param Field $field + * @param string $value + * @return string + * + */ public function sanitizeValue(Page $page, Field $field, $value) { if(strlen($value) > $this->getMaxEmailLength()) return ''; - return $this->wire('sanitizer')->email($value); + return $this->wire()->sanitizer->email($value); } + /** + * Get database schema for field + * + * @param Field $field + * @return array + * + */ public function getDatabaseSchema(Field $field) { $len = $this->getMaxEmailLength(); $schema = parent::getDatabaseSchema($field); $schema['data'] = "varchar($len) NOT NULL default ''"; if($field->hasFlag(Field::flagUnique) != (bool) $field->flagUnique) { - $fields = $this->wire('fields'); /** @var Fields $fields */ - $fields->tableTools()->checkUniqueIndex($field); + if($this->wire()->getStatus() >= ProcessWire::statusReady) { + $fields = $this->wire()->fields; + $fields->tableTools()->checkUniqueIndex($field); + } } return $schema; } - + + /** + * Is given value one that doesn’t need to be stored in DB? + * + * @param Page $page + * @param Field $field + * @param mixed $value + * @return bool + * + */ public function isDeleteValue(Page $page, Field $field, $value) { return empty($value); } - + + /** + * Advanced configuration for field + * + * @param Field $field + * @return InputfieldWrapper + * + */ public function ___getConfigAdvancedInputfields(Field $field) { $inputfields = parent::___getConfigAdvancedInputfields($field); - $fields = $this->wire('fields'); /** @var Fields $fields */ + $fields = $this->wire()->fields; $f = $fields->tableTools()->getUniqueIndexInputfield($field); $inputfields->prepend($f); return $inputfields; diff --git a/wire/modules/Inputfield/InputfieldEmail.module b/wire/modules/Inputfield/InputfieldEmail.module index 3ed294ea..3537029a 100644 --- a/wire/modules/Inputfield/InputfieldEmail.module +++ b/wire/modules/Inputfield/InputfieldEmail.module @@ -1,11 +1,16 @@ __('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(); @@ -29,30 +38,70 @@ class InputfieldEmail extends InputfieldText { $this->set('value2', ''); } + /** + * Render input + * + * @return string + * + */ public function ___render() { - if(!$this->label || $this->label == $this->name) $this->label = $this->_('E-Mail'); // label headline when no default specified - if($this->confirm && count($this->getErrors())) $this->attr('value', ''); - $attrs = $this->getAttributes(); - $out = "getAttributesString($attrs) . " />"; - if($this->confirm) { - foreach(array('id', 'name') as $key) { - if(isset($attrs[$key])) $attrs[$key] = '_' . $attrs[$key] . '_confirm'; - } - $attrs['aria-label'] = $this->confirmLabel; - $attrs['placeholder'] = $this->confirmLabel; - $out .= "
getAttributesString($attrs) . " />
"; + + 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 = "getAttributesString($attrs) . " />"; + + if($this->confirm) $out .= $this->renderConfirm($attrs); + return $out; } + /** + * Render the seoondary “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 "
getAttributesString($attrs) . " />
"; + } + + /** + * Set attribute value + * + * @param string $value + * @return string + * + */ protected function setAttributeValue($value) { if(strlen($value)) { - $value = $this->wire('sanitizer')->email($value); - if(!$value) $this->error($this->_("Please enter a valid e-mail address")); // Error message when email address is invalid + $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; @@ -60,6 +109,7 @@ class InputfieldEmail extends InputfieldText { $page = $this->hasPage; $errors = array(); $valuePrevious = $this->val(); + $name = $this->attr('name'); parent::___processInput($input); @@ -67,15 +117,15 @@ class InputfieldEmail extends InputfieldText { $changed = strtolower($value) !== strtolower($valuePrevious); if($this->confirm) { - $value2 = $this->wire('sanitizer')->email($input["_{$this->name}_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'); /** @var Fields $fields */ - $pageId = $fields->tableTools()->valueExists($this->hasField, $value); + $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); } @@ -96,17 +146,24 @@ class InputfieldEmail extends InputfieldText { 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 = $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.'); @@ -114,6 +171,7 @@ class InputfieldEmail extends InputfieldText { $f->collapsed = $this->confirm ? Inputfield::collapsedNo : Inputfield::collapsedYes; if($this->confirm) $f->attr('checked', 'checked'); $inputfields->add($f); + return $inputfields; }