We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 24844
    • 25 Posts
    http://modxcms.com/forums/index.php/topic,25345.0.html — в этой теме мне не разрешили постить ответы. Продолжу здесь.
    Akots, получается что-нибудь? Я совсем замучался с этим сниппетом, к тому же в PHP почти совсем не шарю, поэтому сам ничего изменить в лучшую сторону толком не могу. У меня чтобы создать новый аккаунт достаточно ввести два поля — логин и пароль (пароль даже подтверждать не надо!) shocked . И это вместо задуманных 6 полей, включая капчу. Ссылку могу дать, но только в личку smiley. Как решается эта проблема? Наверняка какая-то мелочь в коде. Или нет? Ещё хотелось бы ограничение на логины — чтобы вылезала ошибка если используются символы — не буквы русского/латинского алфавитов и цифры.

    К посту прилагается webloginpe.class.php в архиве, на всякий случай.

    Сам я, хоть и по мелочи, да могу помочь — представить широкой публике усовершенствованную капчу и файл русского языка для WebLogin PE smiley
      • 785
      • 2,113 Posts
      Quote from: Renset at Nov 27, 2008, 12:58 PM

      К посту прилагается webloginpe.class.php в архиве, на всякий случай.
      Непонятно, на какой случай приложен один файл, когда давно выложена исправленная версия сниппета:
      http://modxcms.com/forums/index.php?topic=28906.0
      Правда особого энтузиазма идея совместной доработки не вызвала, так что я пока прекратил работу с этим сниппетом (лично мне он сейчас и не нужен).
        Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
        Статьи о MODx, регулярно новые публикации
        • 24844
        • 25 Posts
        О, спасибо большое! Я просто не нашёл эту тему rolleyes
          • 24844
          • 25 Posts
          А как всё же разрешить к регистрации только логины с латинскими символами и цифрами (русские уже не катят, так как возникают проблемы с url-адресами аватаров)? Пытался применить конструкцию preg_match — не сработало. Может, что-то делаю не так?

          		// Check username for bullshit.
          		if(preg_match('/^[a-z0-9_\\d]+$/', $username) !==false)
          		{
          			// Check username length 
          			if (strlen($username) > 100)
          		{
          			return $this->FormatMessage($this->LanguageArray[1]);
          		} 
          		
          		}
          		else
          		{
          			return $this->FormatMessage($this->LanguageArray[32]);
          		}
          

          В этом случае исключения игнорируются. Господа, подскажите плиз  smiley

          UPD. Исправил, методом тыка и гуглирования:
          		if($username == !preg_match('/^[A-z0-9_\\d]+$/', $username))
          		{
          			return $this->FormatMessage($this->LanguageArray[32]);
          		}
          

          Разрешает к регистрации логины, содержащие только английские и некоторые другие символы.
            • 24844
            • 25 Posts
            Вопрос вдогонку — может и ещё кому-то пригодится в дальнейшем.
            Добавил я такой код в webloginpe.class.php, функция SaveUserProfile() (для того чтобы в панели управления профилем поставить новый пароль, было необходимо ввести старый):

            				if(md5($_POST['oldpassword']) !== $modx->db->query("SELECT `password` FROM ".$web_users." WHERE `id` = '".$internalKey."'"))
            					{ 
            						$this->FormatMessage($this->LanguageArray[18]");
            						return;
            					}


            Где oldpassword — имя поля формы с текущим паролем. Пароли не сверяются, а опытным путём удалось установить, что $modx->db->query("SELECT `password` FROM ".$web_users." WHERE `id` = ’".$internalKey."’") возвращает непонятное сообщение „Resource id #32”, вместо пароля в md5. Кто-нибудь сталкивался с этим? Я в тупике, использовал уже много разных методов для получения пароля из БД, но результат один.
              • 785
              • 2,113 Posts
              Читайте документацию на DBAPI – надо примерно так:
              $result = $modx->db->query(’какой-то запрос’);
              while ( $row = $modx->db->getRow( $result ) ) {
              обработка $row[’имя поля’]
              }
              Кстати, вместо $modx->db->query удобнее $modx->db->select.
                Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
                Статьи о MODx, регулярно новые публикации
                • 24844
                • 25 Posts
                Quote from: AKots at Dec 15, 2008, 06:08 AM

                Читайте документацию на DBAPI – надо примерно так:
                $result = $modx->db->query(’какой-то запрос’);
                while ( $row = $modx->db->getRow( $result ) ) {
                обработка $row[’имя поля’]
                }
                Кстати, вместо $modx->db->query удобнее $modx->db->select.

                Спасибо большое  wink

                UPD. Рабочая версия функции SaveUserProfile(), где в данном случае для задания нового пароля необходимо ввести старый (защита от всяких жуликов):
                /**
                	 * SaveUserProfile
                	 * Updates the web_user_attributes table for a given internalKey.
                	 *
                	 * @return void
                	 * @author Scotty Delicious
                	 */
                	function SaveUserProfile($internalKey = '')
                	{
                		global $modx;
                		if ($internalKey == '' || empty($internalKey))
                		{
                			$currentWebUser = $modx->getWebUserInfo($modx->getLoginUserID());
                			$internalKey = $currentWebUser['internalKey'];
                			$refreshSession = true;
                		}
                		else
                		{
                			$currentWebUser = $modx->getWebUserInfo($internalKey);
                			$refreshSession = false;
                		}
                		
                		$web_users = $modx->getFullTableName('web_users');
                		$web_user_attributes = $modx->getFullTableName('web_user_attributes');
                		
                		$checkpwd = "SELECT `password` FROM ".$web_users." WHERE `id` = '".$internalKey."'";
                		$getpwd = $modx->db->query($checkpwd);
                		
                
                		
                		
                
                		// EVENT: OnBeforeWebSaveUser
                		$this->OnBeforeWebSaveUser(array(), array()); // pixelchutes
                		if (!empty($this->Report) ) return; // pixelchutes
                		
                		while ($row = $modx->db->getRow($getpwd)) {
                		$password = $row[password];
                		}
                		
                		if (!empty($_POST['newpassword']) && isset($_POST['newpassword']) && isset($_POST['newpassword_confirm'])) // pixelchutes
                		{
                			if ($_POST['newpassword'] === $_POST['newpassword_confirm']) // pixelchutes
                			{
                				if (md5($_POST['oldpassword']) !== $password)
                					{ 
                						$this->FormatMessage($this->LanguageArray[18]);
                						return;
                					}
                				if (md5($_POST['newpassword']) === md5($modx->db->escape(strip_tags($_POST['newpassword']))))
                				{
                					if (strlen($_POST['newpassword']) > 5)
                					{
                						$passwordElement = "UPDATE ".$web_users." SET `password`='".md5($modx->db->escape($_POST['newpassword']))."' WHERE `id`='".$internalKey."'";
                						$saveMyPassword = $modx->db->query($passwordElement);
                					}
                					else
                					{
                						$this->FormatMessage($this->LanguageArray[3]);
                						return;
                					}
                				}
                				else
                				{
                					$this->FormatMessage($this->LanguageArray[4]);
                					return;
                				}
                			}
                			else
                			{
                				$this->FormatMessage($this->LanguageArray[2]);
                				return;
                			}
                		}
                		
                		// Check for arrays and that "confirm" fields match.
                		foreach ($_POST as $field => $value)
                		{
                			if (is_array($_POST[$field]))
                			{
                				$_POST[$field] = implode('||', $_POST[$field]);
                			}
                			
                			$confirm = $field.'_confirm';
                			if (isset($_POST[$confirm]))
                			{
                				if ($_POST[$field] !== $_POST[$confirm])
                				{
                					$error = $this->LanguageArray[2].' <br />';
                					$fieldMessage .= str_replace('[+000+]', '"'.$field.'"', $error);
                				}
                			}
                		}
                		
                		// If confirm fields were mismatched, throw this error:
                		if (!empty($fieldMessage))
                		{
                			$err = $fieldMessage;
                			unset($fieldMessage);
                			return $this->FormatMessage($err);
                		}
                		
                		$generalElementsArray = array('fullname','email','phone','mobilephone','dob','gender','country','state','zip','fax','photo','comment');
                		$generalElementsUpdate = array();
                		
                		// CREDIT: Guillaume to delete data and for code optimisation
                		foreach ($generalElementsArray as $field)
                		{
                			if ($field == 'photo')
                			{
                				if ($_FILES['photo']['name'] !== '' && !empty($_FILES['photo']['name']))
                				{
                					$_POST['photo'] = $this->CreateUserImage();
                					if (!empty($this->Report))
                					{
                						return;
                					}
                				}
                			}
                			if ($field == 'dob' && trim($_POST['dob'])!='') // for not format an empty date else date is 0 (01-01-1970)
                			{
                				$_POST['dob'] = $this->MakeDateForDb($_POST['dob']);
                			}
                			if ($field!='photo' || ($_FILES['photo']['name'] !== '' && !empty($_FILES['photo']['name']))) // for update db with value and blank value (except if the field is 'photo')
                {
                	// CREDIT: Mike Reid (aka Pixelchutes) for the string escape code.
                	$charset='"'.$modx->config['modx_charset'].'"';
                	$generalElementsUpdate[] = " `".$field."` = '".$modx->db->escape(stripslashes(htmlspecialchars(trim($_POST[$field]), ENT_QUOTES, $modx->config['modx_charset'])))."'";
                }
                //			{
                				// CREDIT: Mike Reid (aka Pixelchutes) for the string escape code.
                //				$charset=$modx->config['modx_charset'];
                //				$generalElementsUpdate[] = " `".$field."` = '".$modx->db->escape(stripslashes(htmlentities(trim($_POST[$field]), ENT_QUOTES, $modx->config['modx_charset']))).	"'";
                //			}
                		}
                
                		if (!empty($this->CustomFields) && $this->CustomFields !== '')
                		{
                			$checkForExtended = "SELECT * FROM ".$this->CustomTable." WHERE `internalKey` = '".$internalKey."'";
                			$isExtended = $modx->db->query($checkForExtended);
                			$extendedRows = $modx->db->getRow($isExtended);
                			
                			if (!empty($extendedRows))
                			{
                				$extendedFieldValues = array();
                				foreach ($this->CustomFields as $field)
                				{
                					// CREDIT: Mike Reid (aka Pixelchutes) for the string escape code.
                					$extendedFieldValues[] = " `".$field."` = '".$modx->db->escape(stripslashes(trim($_POST[$field])))."'";
                				}
                				$this->OnBeforeWebSaveUser($generalElementsUpdate, $extendedFieldValues);
                				
                				$extendedUserAttr = "UPDATE ".$this->CustomTable." SET".implode(', ', $extendedFieldValues)." WHERE `internalkey` = '".$internalKey."'";
                			}
                			else
                			{
                				$extendedFieldValues = array();
                				foreach ($this->CustomFields as $field)
                				{
                					// CREDIT: Mike Reid (aka Pixelchutes) for the string escape code.
                					$charset=$modx->config['modx_charset'];
                					$extendedFieldValues[$field] = $modx->db->escape(stripslashes(htmlentities(trim($_POST[$field]), ENT_QUOTES,$charset)));
                				}
                				$this->OnBeforeWebSaveUser($generalElementsUpdate, $extendedFieldValues);
                				
                				$extendedFieldValues = implode("', '", $extendedFieldValues);
                				$extendedFields = implode('`, `', $this->CustomFields);
                				$extendedUserAttr = "INSERT INTO ".$this->CustomTable." (`internalKey`, `".$extendedFields."`) VALUES ('".$internalKey."', '".$extendedFieldValues."')";
                			}
                		}
                		// Prepare the query for General Elements
                		$generalElementsSQL = "UPDATE ".$web_user_attributes." SET ".implode(', ', $generalElementsUpdate)." WHERE `internalkey` = '".$internalKey."'";
                		
                		// Execute the database queries.
                		if( count($generalElementsUpdate) > 0 ) $saveMyProfile = $modx->db->query($generalElementsSQL);
                		if (!empty($this->CustomFields) && $this->CustomFields !== '')
                		{
                			$insertExtendedAttr = $modx->db->query($extendedUserAttr);			
                		}
                		
                		$this->User = $this->QueryDbForUser($currentWebUser['username']);
                		$this->OnWebSaveUser('update', $this->User);
                		
                		if ($refreshSession === true)
                		{
                			$this->SessionHandler('start');
                		}
                		
                		$this->FormatMessage($this->LanguageArray[101]);
                	}
                	
                


                Кроме того, не забудьте добавить поле формы для ввода старого пароля в HTML-код формы изменения профиля:
                Текущий пароль: <input id="wlpeUserProfilePassword" type="password" name="oldpassword" value="" />