Решаем проблему кириллической почты в joomla 1.6-2.5
На данный момент проверка почты происходит как на стороне клиента, так и на стороне сервера.
перед проверкой адрес переводится в punycode, но почему то, переводится только его доменная часть.
Для стороны сервера, сласс определен в файле \libraries\joomla\string\punycode.php
В методе emailToPunycode
public static function emailToPunycode($email)
{
$explodedAddress = explode('@', $email);
// Not addressing UTF-8 user names
$newEmail = $explodedAddress[0];
if (!empty($explodedAddress[1]))
{
$domainExploded = explode('.', $explodedAddress[1]);
$newdomain = '';
foreach ($domainExploded as $domainex)
{
$domainex = static::toPunycode($domainex);
$newdomain .= $domainex . '.';
}
$newdomain = substr($newdomain, 0, -1);
$newEmail = $newEmail . '@' . $newdomain;
}
return $newEmail;
}
Обратное преобразование происходит в методе emailToUTF8:
public static function emailToUTF8($email)
{
$explodedAddress = explode('@', $email);
// Not addressing UTF-8 user names
$newEmail = $explodedAddress[0];
if (!empty($explodedAddress[1]))
{
$domainExploded = explode('.', $explodedAddress[1]);
$newdomain = '';
foreach ($domainExploded as $domainex)
{
$domainex = static::fromPunycode($domainex);
$newdomain .= $domainex . '.';
}
$newdomain = substr($newdomain, 0, -1);
$newEmail = $newEmail . '@' . $newdomain;
}
return $newEmail;
}
Их надо отредактироват следующим образом:
В методе emailToPunycode
надо поменять строку
$newEmail = $explodedAddress[0];
на:
$newEmail = static::toPunycode($explodedAddress[0]);
В методе emailToUTF8 строку:
$newEmail = $explodedAddress[0];
На:
$newEmail = static::fromPunycode($explodedAddress[0]);
Для стороны клиента надо редактировать файл \media\system\js\punycode.js , но он сжат, поэтому предварительно в него надо перенести содержимое из файла \media\system\js\punycode-uncompressed.js и изменить метод mapDomain
function mapDomain(string, fn) {
var parts = string.split('@');
var result = '';
if (parts.length > 1) {
// In email addresses, only the domain name should be punycoded. Leave
// the local part (i.e. everything up to `@`) intact.
result = parts[0] + '@';
string = parts[1];
}
// Avoid `split(regex)` for IE8 compatibility. See #17.
string = string.replace(regexSeparators, '\x2E');
var labels = string.split('.');
var encoded = map(labels, fn).join('.');
return result + encoded;
}
Строку:
result = parts[0] + '@';
надо изменить на:
result = fn(parts[0]) + '@';
Все это надо делать с помощью плагина для восстановления хаков, чтобы не слетела при обновлении.