op.pl предоставляет механизм просмотра или изменения данных любых таблиц БД, например, ваших модулей.
В простейшем случае, достаточно указать только некоторые параметры таблицы и op.pl предоставит интерфейс по редактированию данных этой таблицы без какого-либо программирования с вашей стороны. Для примера не будем создавать таблицу в БД, а сделаем модуль просмотра таблицы pays - файл web/o_test.pl.
package op;
use strict;
my $new = {
name => 'платежа',
table => 'pays',
field_id => 'id',
priv_show => 'Admin',
priv_edit => '-',
sql_all => 'SELECT * FROM pays ORDER BY time DESC',
sql_get => 'SELECT * FROM pays WHERE id=?',
};
sub o_start
{
return $new;
}
1;
http://inet.l3.dp.ua/cgi-bin/stat.pl?a=op&act=test
Видим «сырые» данные таблицы pays. Модуль ничего не знает о структуре таблицы, поэтому вывел все поля как текстовые строки. В таком виде не очень удобно работать, поэтому необходимо «допилить» модуль, а еще добавить возможность редактирования. Но сначала прокомментируем код выше.
Метод o_start возвращает хеш с параметрами таблицы:
name : имя сущности в родительном падеже, например,
«записи в таблице pays» / «услуги» / «ip адреса»
table : имя таблицы БД
field_id : имя ключевого поля в таблице. В большинстве случаев это id.
Если быть более точным, то это имя поля с primary key, т.е.
по этому полю можно однозначно выбрать одну конкретную запись
priv_show : имя привилегии для доступа на просмотр данных таблицы,
см. web/lang/RU_admin.pl
priv_edit : имя привилегии для редактирования или удаления записей.
В данном примере мы заблокировали изменения
allow_copy : разрешено ли копирование любой строки в таблице
sql_all : sql выборки всех значений
sql_get : sql выборки конкретного значения по полю field_id
menu_create : название кнопки для создания записи в бд
menu_list : название кнопки для просмотра всех записей
menu : массив с пунктами меню
Обязательные поля: name, table, field_id, priv_show.
В нашем примере menu_create и menu_list не указаны, поэтому в левом меню не появятся кнопки создания и просмотра списка платежей.
Скорее всего, для удобного отображения информации вам придется переопределять стандартный метод вывода списка записей таблицы БД. В этом случае не нужно указывать параметр sql_all, поскольку мы будем самостоятельно его выполнять.
op.pl построен таким образом, что в нем есть методы для типичных ситуаций: создания/просмотра/редактирования/удаления записей. Для каждой операции свой метод, который может быть переопределен в нашем модуле.
package op;
use strict;
my $new = {
name => 'записи в таблице платежей',
table => 'pays',
field_id => 'id',
priv_show => 'Admin',
priv_edit => 'SuperAdmin',
sql_get => 'SELECT * FROM pays WHERE id=?',
menu_list => 'Все записи',
};
sub o_start
{
return $new;
}
sub o_list
{
my($d) = @_;
my $url = $d->{url};
my $sql = 'SELECT *, INET_NTOA(creator_ip) AS ip FROM pays ORDER BY time DESC';
my $start = ses::input_int('start');
my($sql, $page_buttons, $rows, $db) =
main::Show_navigate_list($sql, $start, 22, $url);
my $tbl = tbl->new( -class=>'td_wide td_tall pretty' );
while( my %p = $db->line )
{
$tbl->add('*', [
['', 'id', $p{id} ],
['', 'uid', $p{mid} ],
['', 'Сумма', $p{cash} ],
['', 'Категория', $p{category} ],
['', 'Создатель', $p{creator} ],
['', 'id создателя', $p{creator_id} ],
['', 'ip создателя', $p{ip} ],
['', 'reason', $p{reason} ],
['', '', $d->btn_edit($p{id}) ],
]);
}
Show $page_buttons.$tbl->show.$page_buttons;
}
1;
Поскольку мы не переопределяли метод вывода конкретной строки данных, при редактировании они отображаются как текстовые строки. Поэтому после сохранения данных, в поле comment пропадут переводы строк. Попробуем исправить эту проблему.
Цепочка вызова методов при редактировании такова: o_preedit → o_edit → o_show. o_preedit проверяет привилегии, а также получает данные выбранной записи в $d->{d}. Обычно никогда не требуется переопределять этот метод.
o_edit тоже не обязательно переопределять. В его задачи входят такие операции:
o_show непосредственно выводит данные для просмотра/редактирования
sub o_edit
{
my($d) = @_;
$d->{name_full} = _('платежа № [filtr]', $d->{d}{id});
$d->{no_delete} = 'Удаление финансовых платежей заблокировано' if $d->{d}{cash} != 0;
}
sub o_show
{
my($d) = @_;
my $tbl = tbl->new( -class=>'td_wide td_tall pretty wide_input' );
$tbl->add('*','ll',
[ v::input_ta('comment', $d->{d}{comment}, 36, 6) ],
'Комментарий',
);
$tbl->add('*','ll',
[ v::input_ta('reason', $d->{d}{reason}, 36, 6) ],
'Поле reason',
);
if( $d->chk_priv('priv_edit') )
{
$tbl->add('','C', [ v::submit($lang::btn_save) ]);
}
Show Center $d->{url}->form( id=>$d->{id}, $tbl->show );
}
sub o_update
{
my($d) = @_;
$d->{sql} .= 'SET comment=?, reason=?';
push @{$d->{param}}, ses::input('comment');
push @{$d->{param}}, ses::input('reason');
}
sub o_insert
{
return o_update(@_);
}