[[http://nodeny.com.ua|{{..:i:Logo.png}}]] [[..:index|Документація]] → [[0_Index|Програмування]] → Файл 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/UA_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;
Тут ми:
* Додали можливість редагування/видалення записів суперадміністратором
* Перевизначили метод o_list виведення таблиці з даними
* В останню колонку таблиці додали кнопку перегляду/редагування даних ($d->btn_edit). Якщо поточний адміністратор має право на редагування - текст кнопки буде «редагувати», інакше - «дивитися»
Оскільки ми не перевизначали метод виведення конкретного рядка даних, вони редагуються як текстові рядки. Тому після збереження даних у полі comment пропадуть переклади рядків. Спробуймо виправити цю проблему.
Ланцюжок виклику методів під час редагування такий: o_preedit → o_edit → o_show. o_preedit перевіряє привілеї, а також отримує дані вибраного запису $d->{d}. Зазвичай ніколи не потрібно перевизначати цей метод.
o_edit теж не обов'язково перевизначати. До його завдань входять такі операції:
* Блокування видалення поточного запису. Робота NoDeny+ може бути порушена, якщо видалити запис, на який посилаються інші сутності, наприклад, видалити групу клієнтів, коли існують клієнти.
* Блокування редагування, якщо раптом знадобиться.
* Формування повного імені редагованої сутності. Це для зручності, наприклад, при видаленні буде виведено фразу видалити запис № 115, категорії 100, сума 10 $ замість видалити запис № 115. Якщо адміністратор випадково вибере видалення не того запису, повне ім'я сутності вкаже йому на помилку.
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(@_);
}
* Методи отримують $d->{d}{поля_обраного_рядка}, наприклад, $d->{d}{cash} зберігає суму платежу.
* Заблокували видалення фінансових платежів, оскільки при їх видаленні необхідно змінювати баланс клієнтам. $d->{no_delete} має бути порожнім, якщо видалення дозволено, або містити повідомлення, яке буде виведено адміністратору при спробі видалення.
* Створили [[calls.pm#tbl|html-таблицю]] з css 'td_wide td_tall pretty wide_input' - широкі та високі осередки, широкі поля введення.
* Для простоти дозволяємо редагувати/переглядати тільки 2 поля: reason і comment у вигляді textarea (v::input_ta).
* Якщо адміністратор має привілей редагування - виводимо кнопку «Зберегти».
* o_update викликається після сабміту форми. Метод повинен повернути фрагмент SQL з тими полями, які будуть змінюватися, а також дані для плейсхолдерів цього SQL в масиві $d-> {param}.