nodeny:docs:web.op.pl

ДокументаціяПрограмування → Файл 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}.
Цей сайт використовує кукі. Перебуваючи тут, ви погоджуєтеся з їх зберіганням на вашому комп'ютері. Також ви підтверджуєте, що прочитали і зрозуміли нашу Політику конфіденційності. Якщо ви не згодні - покиньте сайт.Більше інформації про куки
  • nodeny/docs/web.op.pl.txt
  • Востаннє змінено: 25/01/2023 22:08
  • повз Method