Jump to content
  • 0

Logowanie urzytkownika po mailu lub nazwie.


4axis

Question

Witam.

Chciałbym aby urzytkownik logował się po nazwie a nie po mailu. Jak czytałem na forum taka zmiana wiązałaby się z mocną przebudową presty. Jednak czy jest możliwe zastosowanie funkcji w kodzie tak aby urzytkownik wpisywał nazwę i hasło a funkcja by sprawdzała czy te dane pasuję do jakiegoś maila i dopiero logowała klienta do sklepu podmieniając nazwę na maila?

Link to comment
Share on other sites

13 answers to this question

Recommended Posts

  • 0

można to zrobić.

do tabeli ps_customer dodaj nową kolumnę VARCHAR(20) o nazwie "username".

następnie trzeba wyedytować funkcję kontrolera AuthController.php

protected function processSubmitLogin()
	{
		Hook::exec('actionBeforeAuthentication');
		$passwd = trim(Tools::getValue('passwd'));
		$email = trim(Tools::getValue('email'));
		if (empty($email))
			$this->errors[] = Tools::displayError('An email address required.');
		elseif (!Validate::isEmail($email))
			$this->errors[] = Tools::displayError('Invalid email address.');
		elseif (empty($passwd))
			$this->errors[] = Tools::displayError('Password is required.');
		elseif (!Validate::isPasswd($passwd))
			$this->errors[] = Tools::displayError('Invalid password.');

trzeba usunąć validację, skoro użytkownik ma logować się przez username nie przez email, chodzi o ten kod

elseif (!Validate::isEmail($email))
			$this->errors[] = Tools::displayError('Invalid email address.');

nieco niżej jest kod:

$authentication = $customer->getByEmail(trim($email), trim($passwd));

odosi się on do klasy Customer (classes/Customer.php) i poniższej funkcji

	public function getByEmail($email, $passwd = null, $ignore_guest = true)
	{
		if (!Validate::isEmail($email) || ($passwd && !Validate::isPasswd($passwd)))
			die (Tools::displayError());

		$sql = 'SELECT *
				FROM `'._DB_PREFIX_.'customer`
				WHERE `email` = \''.pSQL($email).'\'
					'.Shop::addSqlRestriction(Shop::SHARE_CUSTOMER).'
					'.(isset($passwd) ? 'AND `passwd` = \''.Tools::encrypt($passwd).'\'' : '').'
					AND `deleted` = 0'.
					($ignore_guest ? ' AND `is_guest` = 0' : '');

		$result = Db::getInstance()->getRow($sql);

		if (!$result)
			return false;
		$this->id = $result['id_customer'];
		foreach ($result as $key => $value)
			if (array_key_exists($key, $this))
				$this->{$key} = $value;

		return $this;
	}

kolejny raz usuwamy validację emaila

if (!Validate::isEmail($email) || ($passwd && !Validate::isPasswd($passwd)))
			die (Tools::displayError());

i zmieniamy  poniższy kod tak, aby wykorzystywał pole username zamiast email

$sql = 'SELECT *
				FROM `'._DB_PREFIX_.'customer`
				WHERE `email` = \''.pSQL($email).'\'
					'.Shop::addSqlRestriction(Shop::SHARE_CUSTOMER).'
					'.(isset($passwd) ? 'AND `passwd` = \''.Tools::encrypt($passwd).'\'' : '').'
					AND `deleted` = 0'.
					($ignore_guest ? ' AND `is_guest` = 0' : '');

to tyle apropo logowania.

jeszcze trzeba zmienić funkcję rejestracji. W tym przypadku zmian będzie więcej. wszystko można zrobić w authcontroller.

Link to comment
Share on other sites

  • 0

 

/* Debug only */

define('_PS_MODE_DEV_', false);

if (_PS_MODE_DEV_)

{

    @ini_set('display_errors', 'on');

    @error_reporting(E_ALL | E_STRICT);

    define('_PS_DEBUG_SQL_', true);

    /* Compatibility warning */

    define('_PS_DISPLAY_COMPATIBILITY_WARNING_', true);

}

else

{

    @ini_set('display_errors', 'on');

    define('_PS_DEBUG_SQL_', false);

    /* Compatibility warning */

    define('_PS_DISPLAY_COMPATIBILITY_WARNING_', false);

}

zmieniłęm na on w pliku defines.inc.php (nie wiem czy to wystarczy). Włączyłem również Smarty Debug Console ale widzę tylko Fatal error

Link to comment
Share on other sites

  • 0

Tak, sklep dla wybranych partnerów hurtowni.

Z innej beczki: Czy można wymusić zmianę maila przy pierwszym logowaniu? Chciałem usuwać ręcznie i przekierowywać klienta po zalogowaniu do zakładki "identity" wtedy by musieli to wypełnić ale jest może lepszy sposób?

Link to comment
Share on other sites

  • 0

WItam ponownie.

Po zmianie kodu

$sql = 'SELECT *
				FROM `'._DB_PREFIX_.'customer`
				WHERE `email` = \''.pSQL($email).'\'
					'.Shop::addSqlRestriction(Shop::SHARE_CUSTOMER).'
					'.(isset($passwd) ? 'AND `passwd` = \''.Tools::encrypt($passwd).'\'' : '').'
					AND `deleted` = 0'.
					($ignore_guest ? ' AND `is_guest` = 0' : '');

gdzie zmieniłem tabelę "email" na "firstname" przy próbie odzyskania hasła pojawia się błąd "Nie ma żadnego konta zarejetrowanego dla tego adresu e-mail." Ktoś może wie jak to obejść?

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...