Admin Admin
Сообщения : 74 Очки : 71 Дата регистрации : 2010-08-23
| Тема: Установление ограничения на доступ к полям формы, часть II Ср Сен 08, 2010 6:57 pm | |
| Все действия будут приведены на примере созданного мною модуля, но они так же и справедливы для уже существующих. Модуль называется new_Lt, Вы в своих действиях просто заменяйте это название на нужное Вам. Когда нам необходимо задать ограничение на редактирование поля типа dropdown, возможны 2 ситуации: 1. В теге select отображаемое занчение и значение option совпадают; 2. В теге select отображаемое занчение и значение option различны (Н-р: реальное значение - это id, а тоборажаемое - имя). Отображаемое и реальные значения списка равны 1. В файле vardefs.php вставляем следующий код: - Код:
-
'status' => array ( 'required' => false, 'name' => 'status', 'vname' => 'LBL_STATUS', 'type' => 'varchar', 'len' => 5, 'studio' => 'visible', 'function' => array('name'=>'GetHtmlstatus', 'returns'=>'html', 'include'=>'modules/new_Lt/new_LtRole.php'), ),
Тип поля, именно varchar, иначе шуга будет выводить пустой dropdown. Список сформируем позже. 2. Т.к. в предыдущем файле идет ссылка на функцию файла 'modules/new_Lt/new_LtRole.php', то создаем такой файл со следующим содержимым: - Код:
-
global $role_to_check; $role_to_check = "top"; // Здесь роль, на которую будет проводится проверка function GetHtmlstatus($focus, $field, $value, $view) { global $role_to_check; if (isset($_REQUEST['status'])) { $focus->status = $_REQUEST['status']; } global $current_user; // grab the $current_user object require_once("modules/ACLRoles/ACLRole.php"); $acl_role_obj = new ACLRole(); $user_roles = $acl_role_obj->getUserRoles($current_user->id); $user_in_role = FALSE; foreach ($user_roles as $role) { if ($role == $role_to_check) { $user_in_role = TRUE; break; } } if($view == 'EditView' || $view == 'MassUpdate') { if ($user_in_role) { global $app_list_strings; // нужно, чтобы drop down отобразился $html = '<select '; $html .= 'name="status">'; // получаем dropdown поля status. Если форма редактирования, то выбраным по умолчанию будет значение, занесенное в базу $html .= get_select_options_with_id_separate_key($app_list_strings['status_letter'], $app_list_strings['status_letter'], $focus->status); $html .= '</select>'; } // показываем стандартное поле else{ //Здесь Ваш html $html = "Доступ закрыт";} return $html; } return $focus->status; }
Обязательно global $app_list_strings. Чтобы функция видела список. Сам список создан через редактор комбобоксов. 3. Так как здесь показан пример над полем status, а оно является "родным" модулю, то вытаскивать его на формы не надо, оно и так там есть. Остается только произвести в админке repair модуля. Все, список готов. Отображаемое и реальные значения списка не совпадают В ситуации, когда у нас есть список пользователей, и юзеру надо показать имя (логин), а в базе хранить его id, первый случай ограничения прав на dropdown не подходит. Например: есть запись. Мы подробно просматриваем её (DetailView). И в поле user_name видим id, а нам нужен логин. Для этого в файле модуля мы создадим функцию fill_in_additional_detail_fields. Теперь, если мы хотим отредактировать просматриваемую запись, то в открышейся форме поля должны быть заполнены значениями. Так как нам выводился логин, то на форму он и будет пердан. Следовательно, выпадающий список с логинами пользователей, значением, хранимым в базе заполнен не будет (так как в нем находятся id, а не лоигны). Чтобы при редактировании мы увидели в dropdown значение, принадлежащее записи, то создадим еще одно скрытое поле, и через него на форму редактирования будем передавать id. И в свойствах тега select, атрибуту selected укажем id. 1. Создаем скрытое поле и поле, в котрое будет выводится выпадающий список. Для этого в файле vardefs.php добавляем следующий код: - Код:
-
//Скрытое поле с id юзера 'hide_user' => array ( 'name' => 'hide_user', 'vname' => , 'type' => 'varchar', 'massupdate'=>false, //'comment' => 'Date meeting ends' 'len' =>'200', ), //Поле, в которое будет выводится dropdown 'custom_user_list' => array ( 'name' => 'custom_user_list', 'vname' => 'LBL_MODIFIED_NAME', 'type' => 'varchar', 'massupdate'=>false, //'comment' => 'Date meeting ends' 'len' =>'100', 'function' => array('name'=>'GetHtmlNameModified', 'returns'=>'html', 'include'=>'modules/new_Lt/new_LtRole.php'), ),
2. В файле name_module.php добавляем функцию fill_in_additional_detail_fields - Код:
-
function fill_in_additional_detail_fields() { $this->custom_user_list = get_assigned_user_name($this->custom_user_list); }
С помощью этой функции на форме просмотра записи (DetailView) мы будем видеть не id пользователя, а логин. 3. В файл new_LtRole.php добавляем следующую функцию: - Код:
-
global $role_to_check; $role_to_check = "top"; // Здесь роль, на которую будет проводится проверка // Ограничения на поле 'custom_user_list' function GetHtmlNameModified($focus, $field, $value, $view) { global $role_to_check; if (isset($_REQUEST['custom_user_list'])) { $focus->custom_user_list = $_REQUEST['custom_user_list']; } //получаем скрытое поле, в котором содержится id юзера if (isset($_REQUEST['hide_user'])) { $focus->hide_user = $_REQUEST['hide_user']; } global $current_user; // grab the $current_user object require_once("modules/ACLRoles/ACLRole.php"); $acl_role_obj = new ACLRole(); $user_roles = $acl_role_obj->getUserRoles($current_user->id); // grab a list of the current user's roles $user_in_role = FALSE; foreach ($user_roles as $role) { if ($role == $role_to_check) { // is the user in the role we're trying to restrict? $user_in_role = TRUE; break; } } if($view == 'EditView' || $view == 'MassUpdate') { if ($user_in_role) { global $app_list_strings; // нужно, чтобы drop down отобразился $html = '<select '; $html .= 'name="custom_user_list" id="custom_user_list">'; // получаем список пользователей. В качестве выбранного берем знаечение скрытого поля $html .= get_select_options_with_id_separate_key(get_user_array(), get_user_array(), $focus->hide_user); $html .= '</select>'; } // показываем стандартное поле else{ //Здесь Ваш html $html = "Доступ закрыт";} return $html; } return $focus->custom_user_list; } 4. В файл detailviewdefs.php и editviewdefs.php необходимо добавить созданное поле, чтоб оно появилось на форме детального просмотра - Код:
-
0 => array ( 'name' => 'custom_user_list', 'label' => 'LBL_MODIFIED_NAME', ),
5. Repair модуля | |
|