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(@_); }