Показати сторінкуСтарі ревізіїПосилання сюдиЕкспорт до PDFПовернутися наверх Ця сторінка доступна тільки для перегляду. Ви можете продивитися вихідний текст, але не можете змінювати його. Якщо ви вважаєте, що це не вірно, зверніться до адміністратора. [[http://nodeny.com.ua|{{..:i:Logo.png}}]] [[..:index|Документація]] → [[0_Index|Програмування]] → Файл web/op. pl op.pl надає механізм перегляду чи зміни даних будь-яких таблиць БД, наприклад, ваших модулів. У найпростішому випадку, достатньо вказати лише деякі параметри таблиці та op.pl надасть інтерфейс редагування даних цієї таблиці без будь-якого програмування з вашого боку. Наприклад не створюватимемо таблицю в БД, а зробимо модуль перегляду таблиці pays - файл web/o_test.pl. perl код <code> 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; </code> Відкриємо у браузері <code> http://inet.l3.dp.ua/cgi-bin/stat.pl?a=op&act=test </code> Бачимо «сирі» дані таблиці pays. Модуль нічого не знає про структуру таблиці, тому вивів усі поля як текстові рядки. У такому вигляді не дуже зручно працювати, тому необхідно допиляти модуль, а ще додати можливість редагування. Але спершу прокоментуємо код вище. Метод o_start повертає хеш із параметрами таблиці: perl код <code> 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 : масив з пунктами меню </code> Обов'язкові поля: name, table, field_id, priv_show. У нашому прикладі menu_create та menu_list не вказані, тому в лівому меню не з'являться кнопки створення та перегляду списку платежів. Швидше за все, для зручного відображення інформації вам доведеться перевизначати стандартний метод виведення списку записів таблиці БД. У цьому випадку не потрібно вказувати параметр sql_all, оскільки ми самостійно його виконуватимемо. op.pl побудований таким чином, що в ньому є методи для типових ситуацій: створення/перегляду/редагування/видалення записів. Для кожної операції є свій метод, який може бути перевизначений у нашому модулі. perl код <code> 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; </code> Тут ми: * Додали можливість редагування/видалення записів суперадміністратором * Перевизначили метод 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 код <code> 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(@_); } </code> * Методи отримують $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}. nodeny/docs/web.op.pl.txt Востаннє змінено: 25/01/2023 22:08повз Method Увійти