Решаем проблему кириллической почты в 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]) + '@';
Все это надо делать с помощью плагина для восстановления хаков, чтобы не слетела при обновлении.