Понадобилось, при подключении сайта на Drupal к платежной системе ASSIST передавать данные в кодировке cp1251. Передавал фамилию и имя.
Первым делом нужно было сделать передачу данных на внешний URL:
$form['#action'] = "https://test.assist.ru/shops/cardpayment.cfm";
Логично было предположить, что написав:
$form['#accept-charset'] = "Windows-1251";
я получу форму с виндовой кодировкой. Но не тут то было. Оказывается в Drupal-е UTF8 в формах зашито напрочь:
function theme_form($element) { // Anonymous div to satisfy XHTML compliance. $action = $element['#action'] ? 'action="'. check_url($element['#action']) .'" ' : ''; return '<form '. $action .' accept-charset="UTF-8" method="'. $element['#method'] .'" id="'. $element['#id'] .'"'. drupal_attributes($element['#attributes']) .">\n<div>". $element['#children'] ."\n</div></form>\n"; }
Можно было бы прямо здесь, в ядре подправить и добавить по аналогии доп. параметр для возможности изменения кодировки. Но т.к. это функцию можно переопределить в своей теме, то лучше будет не трогать ядро, а написать в файле template.php:
function phptemplate_form($element){ if($element['#id']== 'alexshop-gate-checkout-form' ){ $charset='cp1251'; }else{ $charset='UTF-8'; } $action = $element['#action'] ? 'action="' . check_url($element['#action']) . '" ' : ''; return '<form '. $action .' accept-charset="'.$charset.'" method="'. $element['#method'] .'" '. 'id="'. $element['#id'] .'"'. drupal_attributes($element['#attributes']) .">\n<div>". $element['#children'] ."\n</div></form>\n"; }
И все бы вроде хорошо, работает. Но проверял я это в FF. Потом выложил на хостинг и стал проверять в IE. А IE видимо плевать хотел на accept-charset. Точнее почему то такого параметра я вообще не увидел в форме.
Был вариант делать скрытые поля и в них писать value в виндовой кодировке с помощью функции iconv, но Друпал видимо фильтрует такого рода подстановки и в форме мы имеем value="". Так что я не смог побороть IE с кодировкой. Это так то не влияет на саму процедуру перевода денег, просто в конце, при выводе на экран бланка, видны иероглифы.
Пока оставил. Точнее предложил покупателям вбивать дополнительно имя и фамилию на английском языке.
Отправить комментарий