Довел до ума плагин квитанций. Теперь аналогично скрипту nomake дополнительные данные задаются в тегах <dopdata-алиас>, например:
ул. <dopdata-_adr_street> дом <dopdata-_adr_house> кв. <dopdata-_adr_room>
Кстати, модуль получился небольшим, на его примере покажу некоторые возможности плагинов NoDeny
#!/usr/bin/perl
# ------------------- NoDeny ------------------
# Copyright (с) Volik Stanislav, 2008, 2009
# Read license http://nodeny.com.ua/license.txt
# ---------------------------------------------
$VER=50.25;
sub KV_main
{
&LoadDopdataMod;
$f="$Nodeny_dir_web/kvit.html";
open(FL,"<$f") or &Error($V? "$V Не найден шаблон для квитанций ".&Filtr_out($f) : $Er_Mess_for_Client, $EOUT);
$out='';
$out.=$_ while(<FL>);
close(FL);
# Персональный платежный код
$csum=0;
$csum+=$_ foreach split //,$Mid;
$csum%=10;
$account="$Mid$csum";
%f=(
1 => $U{$Mid}{o_fio},
2 => $account,
4 => $pm->{contract},
);
$out=~s/<(\d+)>/$f{$1}/g;
$sth=&sql($dbh,"SELECT * FROM dopdata WHERE revision IN (SELECT rev FROM rev_users WHERE id=$Mid)");
while ($h=$sth->fetchrow_hashref)
{
$field_alias=$h->{field_alias};
$field_value=&Filtr_out(
&nDopdata_print_value
({
type => $h->{field_type},
alias => $field_alias,
value => $h->{field_value}
})
);
$field_alias='_adr_street' if $field_alias eq 'p_street:street:name_street';
$out=~s/<dopdata-$field_alias>/$field_value/g;
}
print "Content-type: text/html\n\n".$out;
exit;
}
1;
KV_main задается в реестре плагинов plugin_reestr.cfg.
&LoadDopdataMod; - загрузка модуля для работы с дополнительными данными. Дело в том, что недостаточно получить значение поля, бывают закодированные типы полей, которые необходимо преобразовывать в значения. Например тип поля "да/нет" хранится в базе не как строка, а как 1/0. Поле "улица" - это не название, а номер улицы в таблице p_street. Значение, хранящееся в таблице dopdata преобразуется в конечное с помощью подпрограммы nDopdata_print_value (встретите далее в коде).
$f="$Nodeny_dir_web/kvit.html";
open(FL,"<$f") or &Error($V? "$V Не найден шаблон для квитанций ".&Filtr_out($f) : $Er_Mess_for_Client, $EOUT);
$out='';
$out.=$_ while(<FL>);
close(FL);
считывание шаблона квитанций, если ошибка - выводим в браузер соответствующее сообщение. Обращаю внимание, что крайне рекомендуется понимать кто видит ошибку - админ или клиент. Админу выводится информация об ошибке, клиенту - заглушка типа "извините, технические работы" (указывается в языковом файле). $V установлена, когда статистику просматривает админ, более того $V хранит сообщение "вы админ, поэтому вам видны сообщения об ошибках".
шаблон квитанции получаем в переменной $out. Все, что попадает под выражение <цифра> заменяем на соответствующее значение:
$out=~s/<(\d+)>/$f{$1}/g;
значений всего 3 (ФИО, ППК и контракт). Получаем все дополнительные данные клиента:
$sth=&sql($dbh,"SELECT * FROM dopdata WHERE revision IN (SELECT rev FROM rev_users WHERE id=$Mid)");
здесь
SELECT rev FROM rev_users WHERE id=$Mid
- это получение актуальной ревизии данных для клиента с id=$Mid. $Mid - это id основной записи клиента, а он может просматривать статистику с алиасной, поэтому $id не следует использовать. Насчет ревизий напомню - у клиента может быть множество копий его данных, но актуальны именно те, которые имеют самый большой номер ревизии. Другими словами, которые были изменены самыми последними.
Кстати, ревизии уникальны для клиентов, т.е. один и тот же номер ревизии не может встречаться у разных клиентов, т.е. не требуется писать типа:
$sth=&sql($dbh,"SELECT * FROM dopdata WHERE revision IN (SELECT rev FROM rev_users WHERE id=$Mid) AND parent_id=$Mid");
while ($h=$sth->fetchrow_hashref)
получение очередной строки-результата выполнения sql запроса.
$field_alias=$h->{field_alias};
$field_value=&Filtr_out(
&nDopdata_print_value
({
type => $h->{field_type},
alias => $field_alias,
value => $h->{field_value}
})
);
получим значение дополнительного поля, преобразованное в читаемый вид (с помощью подпрограммы nDopdata_print_value).
обязательно отфильтровываем спецсимволы (Filtr_out), которые могут исказить вывод в браузере, т.е. символы тегов <,>,&.
Чисто для удобства преобразуем алиас улицы ('p_street:street:name_street') в читаемый вид ('_adr_street'), чтобы в шаблоне квитанции было проще задавать (<dopdata-_adr_street>)
$field_alias='_adr_street' if $field_alias eq 'p_street:street:name_street';
Не забываем в конце
- perl требует, чтобы загружаемые модули возвращали ненулевое значение