Sql store ids

Материал из Eludia
Версия от 15:58, 22 апреля 2009; Do (обсуждение | вклад) (Синопсис (Perl 5))

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Описание

Функция-обёртка над wish table_data, позволяющая обрабатывать данные полей ввода типа checkboxes и tree лаконичными однострочными вызовами.

Если данные для полей checkboxes / tree подготавливаются процедурой add_vocabularies с опцией ids, то sql_store_ids с необходимыми параметрами вызывается из-под do_update_DEFAULT, что позволяет записывать данные о связях многие-ко-многим, не прибегая к явному программированию.

При этом информация, необходимая для обработки поля с именем $name (на данный момент это только имя связной таблицы), передаётся через параметр $_REQUEST {__checkboxes_$name}, который устанавливается в add_vocabularies. Если вы используете add_vocabularies с ids и do_update_DEFAULT, но по каким-либо причинам не хотите, чтобы sql_store_ids вызывалась автоматически, удалите значение $_REQUEST {__checkboxes_$name}.

Синопсис (Perl 5)

Допустим, в системе имеется (как всегда) таблица пользователей users и таблица рабочих групп workgroups. Отношение многие-ко-многим между ними устанавливается посредством таблицы users_workgroups, имеющей ссылки id_user и id_workgroup.

На карточке пользователя можно извлечь справочник групп одновременно со списком связанных id (опция ids):

sub get_item_of_users {

  my $data = sql ("users");

  ...
	
  add_vocabularies ($data,
    workgroups => {ids => 'users_workgroups'},
    ...
  );

}

далее отобразить на форме группу checkboxes:

sub draw_item_of_users {

  ...
	
 {
   name   => 'id_workgroup',
   label  => 'Рабочие группы',
   type   => 'checkboxes',
   values => $data -> {workgroups},
 },

  ...
	
}

Остаётся обработать значения параметров $_REQUEST {id_workgroup_...}:

sub do_update_users {

 ...
	
 sql_store_ids (users_workgroups => 'id_workgroup');

 ...

}

Если требуется разместить на карточке рабочей группы список её участников, то можно сделать всё симметрично (разумеется, это можно позволить себе, если число пользователей измеряется десятками, но не сотнями):

sub get_item_of_workgroups {

  my $data = sql ("users");

  ...
	
  add_vocabularies ($data,
    users => {ids => 'users_workgroups'},
    ...
  );

}

sub draw_item_of_workgroups {

  ...
	
 {
   name   => 'id_user',
   label  => 'Участники',
   type   => 'checkboxes',
   values => $data -> {users},
 },

  ...
	
}

sub do_update_workgroups {

 ...
	
 sql_store_ids (users_workgroups => 'id_user');

 ...

}