СоНоты

Бажок HTML::FillInForm

Как оказалось, пакет HTML::FillInForm использует свою собственную реализацию функции escapeHTML, отличную от реализации в пакете CGI.

Поэтому если вы используете HTML::FillInForm или CGI::Application::Plugin::FillInForm (который по сути есть интерфейс к первому) для обработки форм со значениями, заэскейпленными через CGI::escapeHTML, вы может столкнуться с некорректной "подсветкой" выбранного значения одной из <option> внутри <select>, к примеру (непростановка атрибута selected там, где необходимо).

Проблема заключается в том, что HTML::FillInForm использует пакет HTML::Parser для разбора передаваемого кода, который в свою очередь при разборе разэскейпивает в текущую кодировку, из-за чего пакету HTML::FillInForm необходимо использовать функцию escapeHTML для значений атрибутов тэгов после парсера при сравнения со значением параметров пользователя, переданных для заполнения формы. Если используются разные реализации escapeHTML (пользователем и пакетом), то в некоторых случаях получаются "разные" одинаковые строки. 🙂

Для исправления ситуации достаточно добавить следующий код в начало вашего скрипта:


use HTML::FillInForm;

package HTML::FillInForm;
use CGI (qw/escapeHTML/);

sub escapeHTML {
  my ($self, $toencode) = @_;
  return undef unless defined($toencode);
  return CGI::escapeHTML($toencode);
}
1;