protected function compile()
	{
		/** @var PageModel $objPage */
		global $objPage;

		$this->import(FrontendUser::class, 'User');

		$GLOBALS['TL_LANGUAGE'] = $objPage->language;

		System::loadLanguageFile('tl_member');
		$this->loadDataContainer('tl_member');

		// Call onload_callback (e.g. to check permissions)
		if (\is_array($GLOBALS['TL_DCA']['tl_member']['config']['onload_callback']))
		{
			foreach ($GLOBALS['TL_DCA']['tl_member']['config']['onload_callback'] as $callback)
			{
				if (\is_array($callback))
				{
					$this->import($callback[0]);
					$this->{$callback[0]}->{$callback[1]}();
				}
				elseif (\is_callable($callback))
				{
					$callback();
				}
			}
		}

		$this->Template->fields = '';

		$arrFields = array();
		$doNotSubmit = false;
		$hasUpload = false;
		$row = 0;

		// Predefine the group order (other groups will be appended automatically)
		$arrGroups = array
		(
			'personal' => array(),
			'address'  => array(),
			'contact'  => array(),
			'login'    => array(),
			'profile'  => array()
		);

		$blnModified = false;
		$objMember = MemberModel::findByPk($this->User->id);
		$strTable = $objMember->getTable();
		$strFormId = 'tl_member_' . $this->id;
		$session = System::getContainer()->get('session');
		$flashBag = $session->getFlashBag();

		// Initialize the versioning (see #7415)
		$objVersions = new Versions($strTable, $objMember->id);
		$objVersions->setUsername($objMember->username);
		$objVersions->setUserId(0);
		$objVersions->setEditUrl('contao/main.php?do=member&act=edit&id=%s&rt=1');
		$objVersions->initialize();

		// Build the form
		foreach ($this->editable as $field)
		{
			$arrData = &$GLOBALS['TL_DCA']['tl_member']['fields'][$field];

			// Map checkboxWizards to regular checkbox widgets
			if ($arrData['inputType'] == 'checkboxWizard')
			{
				$arrData['inputType'] = 'checkbox';
			}

			// Map fileTrees to upload widgets (see #8091)
			if ($arrData['inputType'] == 'fileTree')
			{
				$arrData['inputType'] = 'upload';
			}

			/** @var Widget $strClass */
			$strClass = $GLOBALS['TL_FFL'][$arrData['inputType']];

			// Continue if the class does not exist
			if (!$arrData['eval']['feEditable'] || !class_exists($strClass))
			{
				continue;
			}

			$strGroup = $arrData['eval']['feGroup'];

			$arrData['eval']['required'] = false;

			// Use strlen() here (see #3277)
			if ($arrData['eval']['mandatory'])
			{
				if (\is_array($this->User->$field))
				{
					if (empty($this->User->$field))
					{
						$arrData['eval']['required'] = true;
					}
				}
				else
				{
					if (!\strlen($this->User->$field))
					{
						$arrData['eval']['required'] = true;
					}
				}
			}

			$varValue = $this->User->$field;

			// Call the load_callback
			if (isset($arrData['load_callback']) && \is_array($arrData['load_callback']))
			{
				foreach ($arrData['load_callback'] as $callback)
				{
					if (\is_array($callback))
					{
						$this->import($callback[0]);
						$varValue = $this->{$callback[0]}->{$callback[1]}($varValue, $this->User, $this);
					}
					elseif (\is_callable($callback))
					{
						$varValue = $callback($varValue, $this->User, $this);
					}
				}
			}

			/** @var Widget $objWidget */
			$objWidget = new $strClass($strClass::getAttributesFromDca($arrData, $field, $varValue, $field, $strTable, $this));

			// Append the module ID to prevent duplicate IDs (see #1493)
			$objWidget->id .= '_' . $this->id;
			$objWidget->storeValues = true;
			$objWidget->rowClass = 'row_' . $row . (($row == 0) ? ' row_first' : '') . ((($row % 2) == 0) ? ' even' : ' odd');

			// Increase the row count if it is a password field
			if ($objWidget instanceof FormPassword)
			{
				if ($objMember->password != '')
				{
					$objWidget->mandatory = false;
				}

				$objWidget->rowClassConfirm = 'row_' . ++$row . ((($row % 2) == 0) ? ' even' : ' odd');
			}

			// Validate the form data
			if (Input::post('FORM_SUBMIT') == $strFormId)
			{
				$objWidget->validate();
				$varValue = $objWidget->value;

				$rgxp = $arrData['eval']['rgxp'];

				// Convert date formats into timestamps (check the eval setting first -> #3063)
				if ($varValue !== null && $varValue !== '' && \in_array($rgxp, array('date', 'time', 'datim')))
				{
					try
					{
						$objDate = new Date($varValue, Date::getFormatFromRgxp($rgxp));
						$varValue = $objDate->tstamp;
					}
					catch (\OutOfBoundsException $e)
					{
						$objWidget->addError(sprintf($GLOBALS['TL_LANG']['ERR']['invalidDate'], $varValue));
					}
				}

				// Make sure that unique fields are unique (check the eval setting first -> #3063)
				if ($arrData['eval']['unique'] && $varValue != '' && !$this->Database->isUniqueValue('tl_member', $field, $varValue, $this->User->id))
				{
					$objWidget->addError(sprintf($GLOBALS['TL_LANG']['ERR']['unique'], $arrData['label'][0] ?: $field));
				}

				// Trigger the save_callback (see #5247)
				if ($objWidget->submitInput() && !$objWidget->hasErrors() && \is_array($arrData['save_callback']))
				{
					foreach ($arrData['save_callback'] as $callback)
					{
						try
						{
							if (\is_array($callback))
							{
								$this->import($callback[0]);
								$varValue = $this->{$callback[0]}->{$callback[1]}($varValue, $this->User, $this);
							}
							elseif (\is_callable($callback))
							{
								$varValue = $callback($varValue, $this->User, $this);
							}
						}
						catch (\Exception $e)
						{
							$objWidget->class = 'error';
							$objWidget->addError($e->getMessage());
						}
					}
				}

				// Do not submit the field if there are errors
				if ($objWidget->hasErrors())
				{
					$doNotSubmit = true;
				}
				elseif ($objWidget->submitInput())
				{
					// Store the form data
					$_SESSION['FORM_DATA'][$field] = $varValue;

					// Set the correct empty value (see #6284, #6373)
					if ($varValue === '')
					{
						$varValue = $objWidget->getEmptyValue();
					}

					// Encrypt the value (see #7815)
					if ($arrData['eval']['encrypt'])
					{
						$varValue = Encryption::encrypt($varValue);
					}

					// Set the new value
					if ($varValue !== $this->User->$field)
					{
						$this->User->$field = $varValue;

						// Set the new field in the member model
						$blnModified = true;
						$objMember->$field = $varValue;
					}
				}
			}

			if ($objWidget instanceof \uploadable)
			{
				$hasUpload = true;
			}

			$temp = $objWidget->parse();

			$this->Template->fields .= $temp;
			$arrFields[$strGroup][$field] .= $temp;
			++$row;
		}

		// Save the model
		if ($blnModified)
		{
			$objMember->tstamp = time();
			$objMember->save();

			// Create a new version
			if ($GLOBALS['TL_DCA'][$strTable]['config']['enableVersioning'])
			{
				$objVersions->create();
			}
		}

		$this->Template->hasError = $doNotSubmit;

		// Redirect or reload if there was no error
		if (Input::post('FORM_SUBMIT') == $strFormId && !$doNotSubmit)
		{
			// HOOK: updated personal data
			if (isset($GLOBALS['TL_HOOKS']['updatePersonalData']) && \is_array($GLOBALS['TL_HOOKS']['updatePersonalData']))
			{
				foreach ($GLOBALS['TL_HOOKS']['updatePersonalData'] as $callback)
				{
					$this->import($callback[0]);
					$this->{$callback[0]}->{$callback[1]}($this->User, $_SESSION['FORM_DATA'], $this);
				}
			}

			// Call the onsubmit_callback
			if (\is_array($GLOBALS['TL_DCA']['tl_member']['config']['onsubmit_callback']))
			{
				foreach ($GLOBALS['TL_DCA']['tl_member']['config']['onsubmit_callback'] as $callback)
				{
					if (\is_array($callback))
					{
						$this->import($callback[0]);
						$this->{$callback[0]}->{$callback[1]}($this->User, $this);
					}
					elseif (\is_callable($callback))
					{
						$callback($this->User, $this);
					}
				}
			}

			// Check whether there is a jumpTo page
			if (($objJumpTo = $this->objModel->getRelated('jumpTo')) instanceof PageModel)
			{
				$this->jumpToOrReload($objJumpTo->row());
			}

			$flashBag->set('mod_personal_data_confirm', $GLOBALS['TL_LANG']['MSC']['savedData']);
			$this->reload();
		}

		$this->Template->loginDetails = $GLOBALS['TL_LANG']['tl_member']['loginDetails'];
		$this->Template->addressDetails = $GLOBALS['TL_LANG']['tl_member']['addressDetails'];
		$this->Template->contactDetails = $GLOBALS['TL_LANG']['tl_member']['contactDetails'];
		$this->Template->personalData = $GLOBALS['TL_LANG']['tl_member']['personalData'];

		// Add the groups
		foreach ($arrFields as $k=>$v)
		{
			// Deprecated since Contao 4.0, to be removed in Contao 5.0
			$this->Template->$k = $v;

			$key = $k . (($k == 'personal') ? 'Data' : 'Details');
			$arrGroups[$GLOBALS['TL_LANG']['tl_member'][$key]] = $v;
		}

		// Confirmation message
		if ($session->isStarted() && $flashBag->has('mod_personal_data_confirm'))
		{
			$arrMessages = $flashBag->get('mod_personal_data_confirm');
			$this->Template->message = $arrMessages[0];
		}

		$this->Template->categories = $arrGroups;
		$this->Template->formId = $strFormId;
		$this->Template->slabel = StringUtil::specialchars($GLOBALS['TL_LANG']['MSC']['saveData']);
		$this->Template->action = Environment::get('indexFreeRequest');
		$this->Template->enctype = $hasUpload ? 'multipart/form-data' : 'application/x-www-form-urlencoded';
		$this->Template->rowLast = 'row_' . $row . ((($row % 2) == 0) ? ' even' : ' odd');
	}
protected function compile()
	{
		
		global $objPage;

		$this->import(FrontendUser::class, 'User');

		$GLOBALS['TL_LANGUAGE'] = $objPage->language;

		System::loadLanguageFile('tl_member');
		$this->loadDataContainer('tl_member');

		
		if (\is_array($GLOBALS['TL_DCA']['tl_member']['config']['onload_callback']))
		{
			foreach ($GLOBALS['TL_DCA']['tl_member']['config']['onload_callback'] as $callback)
			{
				if (\is_array($callback))
				{
					$this->import($callback[0]);
					$this->{$callback[0]}->{$callback[1]}();
				}
				elseif (\is_callable($callback))
				{
					$callback();
				}
			}
		}

		$this->Template->fields = '';

		$arrFields = array();
		$doNotSubmit = false;
		$hasUpload = false;
		$row = 0;

		
		$arrGroups = array
		(
			'personal' => array(),
			'address'  => array(),
			'contact'  => array(),
			'login'    => array(),
			'profile'  => array()
		);

		$blnModified = false;
		$objMember = MemberModel::findByPk($this->User->id);
		$strTable = $objMember->getTable();
		$strFormId = 'tl_member_' . $this->id;
		$session = System::getContainer()->get('session');
		$flashBag = $session->getFlashBag();

		
		$objVersions = new Versions($strTable, $objMember->id);
		$objVersions->setUsername($objMember->username);
		$objVersions->setUserId(0);
		$objVersions->setEditUrl('contao/main.php?do=member&act=edit&id=%s&rt=1');
		$objVersions->initialize();

		
		foreach ($this->editable as $field)
		{
			$arrData = &$GLOBALS['TL_DCA']['tl_member']['fields'][$field];

			
			if ($arrData['inputType'] == 'checkboxWizard')
			{
				$arrData['inputType'] = 'checkbox';
			}

			
			if ($arrData['inputType'] == 'fileTree')
			{
				$arrData['inputType'] = 'upload';
			}

			
			$strClass = $GLOBALS['TL_FFL'][$arrData['inputType']];

			
			if (!$arrData['eval']['feEditable'] || !class_exists($strClass))
			{
				continue;
			}

			$strGroup = $arrData['eval']['feGroup'];

			$arrData['eval']['required'] = false;

			
			if ($arrData['eval']['mandatory'])
			{
				if (\is_array($this->User->$field))
				{
					if (empty($this->User->$field))
					{
						$arrData['eval']['required'] = true;
					}
				}
				else
				{
					if (!\strlen($this->User->$field))
					{
						$arrData['eval']['required'] = true;
					}
				}
			}

			$varValue = $this->User->$field;

			
			if (isset($arrData['load_callback']) && \is_array($arrData['load_callback']))
			{
				foreach ($arrData['load_callback'] as $callback)
				{
					if (\is_array($callback))
					{
						$this->import($callback[0]);
						$varValue = $this->{$callback[0]}->{$callback[1]}($varValue, $this->User, $this);
					}
					elseif (\is_callable($callback))
					{
						$varValue = $callback($varValue, $this->User, $this);
					}
				}
			}

			
			$objWidget = new $strClass($strClass::getAttributesFromDca($arrData, $field, $varValue, $field, $strTable, $this));

			
			$objWidget->id .= '_' . $this->id;
			$objWidget->storeValues = true;
			$objWidget->rowClass = 'row_' . $row . (($row == 0) ? ' row_first' : '') . ((($row % 2) == 0) ? ' even' : ' odd');

			
			if ($objWidget instanceof FormPassword)
			{
				if ($objMember->password != '')
				{
					$objWidget->mandatory = false;
				}

				$objWidget->rowClassConfirm = 'row_' . ++$row . ((($row % 2) == 0) ? ' even' : ' odd');
			}

			
			if (Input::post('FORM_SUBMIT') == $strFormId)
			{
				$objWidget->validate();
				$varValue = $objWidget->value;

				$rgxp = $arrData['eval']['rgxp'];

				
				if ($varValue !== null && $varValue !== '' && \in_array($rgxp, array('date', 'time', 'datim')))
				{
					try
					{
						$objDate = new Date($varValue, Date::getFormatFromRgxp($rgxp));
						$varValue = $objDate->tstamp;
					}
					catch (\OutOfBoundsException $e)
					{
						$objWidget->addError(sprintf($GLOBALS['TL_LANG']['ERR']['invalidDate'], $varValue));
					}
				}

				
				if ($arrData['eval']['unique'] && $varValue != '' && !$this->Database->isUniqueValue('tl_member', $field, $varValue, $this->User->id))
				{
					$objWidget->addError(sprintf($GLOBALS['TL_LANG']['ERR']['unique'], $arrData['label'][0] ?: $field));
				}

				
				if ($objWidget->submitInput() && !$objWidget->hasErrors() && \is_array($arrData['save_callback']))
				{
					foreach ($arrData['save_callback'] as $callback)
					{
						try
						{
							if (\is_array($callback))
							{
								$this->import($callback[0]);
								$varValue = $this->{$callback[0]}->{$callback[1]}($varValue, $this->User, $this);
							}
							elseif (\is_callable($callback))
							{
								$varValue = $callback($varValue, $this->User, $this);
							}
						}
						catch (\Exception $e)
						{
							$objWidget->class = 'error';
							$objWidget->addError($e->getMessage());
						}
					}
				}

				
				if ($objWidget->hasErrors())
				{
					$doNotSubmit = true;
				}
				elseif ($objWidget->submitInput())
				{
					
					$_SESSION['FORM_DATA'][$field] = $varValue;

					
					if ($varValue === '')
					{
						$varValue = $objWidget->getEmptyValue();
					}

					
					if ($arrData['eval']['encrypt'])
					{
						$varValue = Encryption::encrypt($varValue);
					}

					
					if ($varValue !== $this->User->$field)
					{
						$this->User->$field = $varValue;

						
						$blnModified = true;
						$objMember->$field = $varValue;
					}
				}
			}

			if ($objWidget instanceof \uploadable)
			{
				$hasUpload = true;
			}

			$temp = $objWidget->parse();

			$this->Template->fields .= $temp;
			$arrFields[$strGroup][$field] .= $temp;
			++$row;
		}

		
		if ($blnModified)
		{
			$objMember->tstamp = time();
			$objMember->save();

			
			if ($GLOBALS['TL_DCA'][$strTable]['config']['enableVersioning'])
			{
				$objVersions->create();
			}
		}

		$this->Template->hasError = $doNotSubmit;

		
		if (Input::post('FORM_SUBMIT') == $strFormId && !$doNotSubmit)
		{
			
			if (isset($GLOBALS['TL_HOOKS']['updatePersonalData']) && \is_array($GLOBALS['TL_HOOKS']['updatePersonalData']))
			{
				foreach ($GLOBALS['TL_HOOKS']['updatePersonalData'] as $callback)
				{
					$this->import($callback[0]);
					$this->{$callback[0]}->{$callback[1]}($this->User, $_SESSION['FORM_DATA'], $this);
				}
			}

			
			if (\is_array($GLOBALS['TL_DCA']['tl_member']['config']['onsubmit_callback']))
			{
				foreach ($GLOBALS['TL_DCA']['tl_member']['config']['onsubmit_callback'] as $callback)
				{
					if (\is_array($callback))
					{
						$this->import($callback[0]);
						$this->{$callback[0]}->{$callback[1]}($this->User, $this);
					}
					elseif (\is_callable($callback))
					{
						$callback($this->User, $this);
					}
				}
			}

			
			if (($objJumpTo = $this->objModel->getRelated('jumpTo')) instanceof PageModel)
			{
				$this->jumpToOrReload($objJumpTo->row());
			}

			$flashBag->set('mod_personal_data_confirm', $GLOBALS['TL_LANG']['MSC']['savedData']);
			$this->reload();
		}

		$this->Template->loginDetails = $GLOBALS['TL_LANG']['tl_member']['loginDetails'];
		$this->Template->addressDetails = $GLOBALS['TL_LANG']['tl_member']['addressDetails'];
		$this->Template->contactDetails = $GLOBALS['TL_LANG']['tl_member']['contactDetails'];
		$this->Template->personalData = $GLOBALS['TL_LANG']['tl_member']['personalData'];

		
		foreach ($arrFields as $k=>$v)
		{
			
			$this->Template->$k = $v;

			$key = $k . (($k == 'personal') ? 'Data' : 'Details');
			$arrGroups[$GLOBALS['TL_LANG']['tl_member'][$key]] = $v;
		}

		
		if ($session->isStarted() && $flashBag->has('mod_personal_data_confirm'))
		{
			$arrMessages = $flashBag->get('mod_personal_data_confirm');
			$this->Template->message = $arrMessages[0];
		}

		$this->Template->categories = $arrGroups;
		$this->Template->formId = $strFormId;
		$this->Template->slabel = StringUtil::specialchars($GLOBALS['TL_LANG']['MSC']['saveData']);
		$this->Template->action = Environment::get('indexFreeRequest');
		$this->Template->enctype = $hasUpload ? 'multipart/form-data' : 'application/x-www-form-urlencoded';
		$this->Template->rowLast = 'row_' . $row . ((($row % 2) == 0) ? ' even' : ' odd');
	}
protected function compile ( ) { /** @var PageModel $objPage */ global $ objPage ; $ this -> import ( FrontendUser :: class , 'User' ) ; $ GLOBALS [ 'TL_LANGUAGE' ] = $ objPage -> language ; System :: loadLanguageFile ( 'tl_member' ) ; $ this -> loadDataContainer ( 'tl_member' ) ; // Call onload_callback (e.g. to check permissions) if ( \ is_array ( $ GLOBALS [ 'TL_DCA' ] [ 'tl_member' ] [ 'config' ] [ 'onload_callback' ] ) ) { foreach ( $ GLOBALS [ 'TL_DCA' ] [ 'tl_member' ] [ 'config' ] [ 'onload_callback' ] as $ callback ) { if ( \ is_array ( $ callback ) ) { $ this -> import ( $ callback [ 0 ] ) ; $ this -> { $ callback [ 0 ] } -> { $ callback [ 1 ] } ( ) ; } elseif ( \ is_callable ( $ callback ) ) { $ callback ( ) ; } } } $ this -> Template -> fields = '' ; $ arrFields = array ( ) ; $ doNotSubmit = false ; $ hasUpload = false ; $ row = 0 ; // Predefine the group order (other groups will be appended automatically) $ arrGroups = array ( 'personal' => array ( ) , 'address' => array ( ) , 'contact' => array ( ) , 'login' => array ( ) , 'profile' => array ( ) ) ; $ blnModified = false ; $ objMember = MemberModel :: findByPk ( $ this -> User -> id ) ; $ strTable = $ objMember -> getTable ( ) ; $ strFormId = 'tl_member_' . $ this -> id ; $ session = System :: getContainer ( ) -> get ( 'session' ) ; $ flashBag = $ session -> getFlashBag ( ) ; // Initialize the versioning (see #7415) $ objVersions = new Versions ( $ strTable , $ objMember -> id ) ; $ objVersions -> setUsername ( $ objMember -> username ) ; $ objVersions -> setUserId ( 0 ) ; $ objVersions -> setEditUrl ( 'contao/main.php?do=member&act=edit&id=%s&rt=1' ) ; $ objVersions -> initialize ( ) ; // Build the form foreach ( $ this -> editable as $ field ) { $ arrData = & $ GLOBALS [ 'TL_DCA' ] [ 'tl_member' ] [ 'fields' ] [ $ field ] ; // Map checkboxWizards to regular checkbox widgets if ( $ arrData [ 'inputType' ] == 'checkboxWizard' ) { $ arrData [ 'inputType' ] = 'checkbox' ; } // Map fileTrees to upload widgets (see #8091) if ( $ arrData [ 'inputType' ] == 'fileTree' ) { $ arrData [ 'inputType' ] = 'upload' ; } /** @var Widget $strClass */ $ strClass = $ GLOBALS [ 'TL_FFL' ] [ $ arrData [ 'inputType' ] ] ; // Continue if the class does not exist if ( ! $ arrData [ 'eval' ] [ 'feEditable' ] || ! class_exists ( $ strClass ) ) { continue ; } $ strGroup = $ arrData [ 'eval' ] [ 'feGroup' ] ; $ arrData [ 'eval' ] [ 'required' ] = false ; // Use strlen() here (see #3277) if ( $ arrData [ 'eval' ] [ 'mandatory' ] ) { if ( \ is_array ( $ this -> User -> $ field ) ) { if ( empty ( $ this -> User -> $ field ) ) { $ arrData [ 'eval' ] [ 'required' ] = true ; } } else { if ( ! \ strlen ( $ this -> User -> $ field ) ) { $ arrData [ 'eval' ] [ 'required' ] = true ; } } } $ varValue = $ this -> User -> $ field ; // Call the load_callback if ( isset ( $ arrData [ 'load_callback' ] ) && \ is_array ( $ arrData [ 'load_callback' ] ) ) { foreach ( $ arrData [ 'load_callback' ] as $ callback ) { if ( \ is_array ( $ callback ) ) { $ this -> import ( $ callback [ 0 ] ) ; $ varValue = $ this -> { $ callback [ 0 ] } -> { $ callback [ 1 ] } ( $ varValue , $ this -> User , $ this ) ; } elseif ( \ is_callable ( $ callback ) ) { $ varValue = $ callback ( $ varValue , $ this -> User , $ this ) ; } } } /** @var Widget $objWidget */ $ objWidget = new $ strClass ( $ strClass :: getAttributesFromDca ( $ arrData , $ field , $ varValue , $ field , $ strTable , $ this ) ) ; // Append the module ID to prevent duplicate IDs (see #1493) $ objWidget -> id .= '_' . $ this -> id ; $ objWidget -> storeValues = true ; $ objWidget -> rowClass = 'row_' . $ row . ( ( $ row == 0 ) ? ' row_first' : '' ) . ( ( ( $ row % 2 ) == 0 ) ? ' even' : ' odd' ) ; // Increase the row count if it is a password field if ( $ objWidget instanceof FormPassword ) { if ( $ objMember -> password != '' ) { $ objWidget -> mandatory = false ; } $ objWidget -> rowClassConfirm = 'row_' . ++ $ row . ( ( ( $ row % 2 ) == 0 ) ? ' even' : ' odd' ) ; } // Validate the form data if ( Input :: post ( 'FORM_SUBMIT' ) == $ strFormId ) { $ objWidget -> validate ( ) ; $ varValue = $ objWidget -> value ; $ rgxp = $ arrData [ 'eval' ] [ 'rgxp' ] ; // Convert date formats into timestamps (check the eval setting first -> #3063) if ( $ varValue !== null && $ varValue !== '' && \ in_array ( $ rgxp , array ( 'date' , 'time' , 'datim' ) ) ) { try { $ objDate = new Date ( $ varValue , Date :: getFormatFromRgxp ( $ rgxp ) ) ; $ varValue = $ objDate -> tstamp ; } catch ( \ OutOfBoundsException $ e ) { $ objWidget -> addError ( sprintf ( $ GLOBALS [ 'TL_LANG' ] [ 'ERR' ] [ 'invalidDate' ] , $ varValue ) ) ; } } // Make sure that unique fields are unique (check the eval setting first -> #3063) if ( $ arrData [ 'eval' ] [ 'unique' ] && $ varValue != '' && ! $ this -> Database -> isUniqueValue ( 'tl_member' , $ field , $ varValue , $ this -> User -> id ) ) { $ objWidget -> addError ( sprintf ( $ GLOBALS [ 'TL_LANG' ] [ 'ERR' ] [ 'unique' ] , $ arrData [ 'label' ] [ 0 ] ? : $ field ) ) ; } // Trigger the save_callback (see #5247) if ( $ objWidget -> submitInput ( ) && ! $ objWidget -> hasErrors ( ) && \ is_array ( $ arrData [ 'save_callback' ] ) ) { foreach ( $ arrData [ 'save_callback' ] as $ callback ) { try { if ( \ is_array ( $ callback ) ) { $ this -> import ( $ callback [ 0 ] ) ; $ varValue = $ this -> { $ callback [ 0 ] } -> { $ callback [ 1 ] } ( $ varValue , $ this -> User , $ this ) ; } elseif ( \ is_callable ( $ callback ) ) { $ varValue = $ callback ( $ varValue , $ this -> User , $ this ) ; } } catch ( \ Exception $ e ) { $ objWidget -> class = 'error' ; $ objWidget -> addError ( $ e -> getMessage ( ) ) ; } } } // Do not submit the field if there are errors if ( $ objWidget -> hasErrors ( ) ) { $ doNotSubmit = true ; } elseif ( $ objWidget -> submitInput ( ) ) { // Store the form data $ _SESSION [ 'FORM_DATA' ] [ $ field ] = $ varValue ; // Set the correct empty value (see #6284, #6373) if ( $ varValue === '' ) { $ varValue = $ objWidget -> getEmptyValue ( ) ; } // Encrypt the value (see #7815) if ( $ arrData [ 'eval' ] [ 'encrypt' ] ) { $ varValue = Encryption :: encrypt ( $ varValue ) ; } // Set the new value if ( $ varValue !== $ this -> User -> $ field ) { $ this -> User -> $ field = $ varValue ; // Set the new field in the member model $ blnModified = true ; $ objMember -> $ field = $ varValue ; } } } if ( $ objWidget instanceof \ uploadable ) { $ hasUpload = true ; } $ temp = $ objWidget -> parse ( ) ; $ this -> Template -> fields .= $ temp ; $ arrFields [ $ strGroup ] [ $ field ] .= $ temp ; ++ $ row ; } // Save the model if ( $ blnModified ) { $ objMember -> tstamp = time ( ) ; $ objMember -> save ( ) ; // Create a new version if ( $ GLOBALS [ 'TL_DCA' ] [ $ strTable ] [ 'config' ] [ 'enableVersioning' ] ) { $ objVersions -> create ( ) ; } } $ this -> Template -> hasError = $ doNotSubmit ; // Redirect or reload if there was no error if ( Input :: post ( 'FORM_SUBMIT' ) == $ strFormId && ! $ doNotSubmit ) { // HOOK: updated personal data if ( isset ( $ GLOBALS [ 'TL_HOOKS' ] [ 'updatePersonalData' ] ) && \ is_array ( $ GLOBALS [ 'TL_HOOKS' ] [ 'updatePersonalData' ] ) ) { foreach ( $ GLOBALS [ 'TL_HOOKS' ] [ 'updatePersonalData' ] as $ callback ) { $ this -> import ( $ callback [ 0 ] ) ; $ this -> { $ callback [ 0 ] } -> { $ callback [ 1 ] } ( $ this -> User , $ _SESSION [ 'FORM_DATA' ] , $ this ) ; } } // Call the onsubmit_callback if ( \ is_array ( $ GLOBALS [ 'TL_DCA' ] [ 'tl_member' ] [ 'config' ] [ 'onsubmit_callback' ] ) ) { foreach ( $ GLOBALS [ 'TL_DCA' ] [ 'tl_member' ] [ 'config' ] [ 'onsubmit_callback' ] as $ callback ) { if ( \ is_array ( $ callback ) ) { $ this -> import ( $ callback [ 0 ] ) ; $ this -> { $ callback [ 0 ] } -> { $ callback [ 1 ] } ( $ this -> User , $ this ) ; } elseif ( \ is_callable ( $ callback ) ) { $ callback ( $ this -> User , $ this ) ; } } } // Check whether there is a jumpTo page if ( ( $ objJumpTo = $ this -> objModel -> getRelated ( 'jumpTo' ) ) instanceof PageModel ) { $ this -> jumpToOrReload ( $ objJumpTo -> row ( ) ) ; } $ flashBag -> set ( 'mod_personal_data_confirm' , $ GLOBALS [ 'TL_LANG' ] [ 'MSC' ] [ 'savedData' ] ) ; $ this -> reload ( ) ; } $ this -> Template -> loginDetails = $ GLOBALS [ 'TL_LANG' ] [ 'tl_member' ] [ 'loginDetails' ] ; $ this -> Template -> addressDetails = $ GLOBALS [ 'TL_LANG' ] [ 'tl_member' ] [ 'addressDetails' ] ; $ this -> Template -> contactDetails = $ GLOBALS [ 'TL_LANG' ] [ 'tl_member' ] [ 'contactDetails' ] ; $ this -> Template -> personalData = $ GLOBALS [ 'TL_LANG' ] [ 'tl_member' ] [ 'personalData' ] ; // Add the groups foreach ( $ arrFields as $ k => $ v ) { // Deprecated since Contao 4.0, to be removed in Contao 5.0 $ this -> Template -> $ k = $ v ; $ key = $ k . ( ( $ k == 'personal' ) ? 'Data' : 'Details' ) ; $ arrGroups [ $ GLOBALS [ 'TL_LANG' ] [ 'tl_member' ] [ $ key ] ] = $ v ; } // Confirmation message if ( $ session -> isStarted ( ) && $ flashBag -> has ( 'mod_personal_data_confirm' ) ) { $ arrMessages = $ flashBag -> get ( 'mod_personal_data_confirm' ) ; $ this -> Template -> message = $ arrMessages [ 0 ] ; } $ this -> Template -> categories = $ arrGroups ; $ this -> Template -> formId = $ strFormId ; $ this -> Template -> slabel = StringUtil :: specialchars ( $ GLOBALS [ 'TL_LANG' ] [ 'MSC' ] [ 'saveData' ] ) ; $ this -> Template -> action = Environment :: get ( 'indexFreeRequest' ) ; $ this -> Template -> enctype = $ hasUpload ? 'multipart/form-data' : 'application/x-www-form-urlencoded' ; $ this -> Template -> rowLast = 'row_' . $ row . ( ( ( $ row % 2 ) == 0 ) ? ' even' : ' odd' ) ; }
Generate the module
Generate the module