ДокументацияПрограммирование → Файл web/op.pl

op.pl предоставляет механизм просмотра или изменения данных любых таблиц БД, например, ваших модулей.

В простейшем случае, достаточно указать только некоторые параметры таблицы и op.pl предоставит интерфейс по редактированию данных этой таблицы без какого-либо программирования с вашей стороны. Для примера не будем создавать таблицу в БД, а сделаем модуль просмотра таблицы pays - файл web/o_test.pl.

perl код
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 возвращает хеш с параметрами таблицы:

perl код
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 построен таким образом, что в нем есть методы для типичных ситуаций: создания/просмотра/редактирования/удаления записей. Для каждой операции свой метод, который может быть переопределен в нашем модуле.

perl код
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 непосредственно выводит данные для просмотра/редактирования

добавим в o_test.pl perl код
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(@_);
}