Документація → Програмування → Файл 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} має бути порожнім, якщо видалення дозволено, або містити повідомлення, яке буде виведено адміністратору при спробі видалення.
- Створили html-таблицю з css 'td_wide td_tall pretty wide_input' - широкі та високі осередки, широкі поля введення.
- Для простоти дозволяємо редагувати/переглядати тільки 2 поля: reason і comment у вигляді textarea (v::input_ta).
- Якщо адміністратор має привілей редагування - виводимо кнопку «Зберегти».
- o_update викликається після сабміту форми. Метод повинен повернути фрагмент SQL з тими полями, які будуть змінюватися, а також дані для плейсхолдерів цього SQL в масиві $d→ {param}.