#php #html #pear #moodle #quickform
#php #HTML #pear #moodle #quickform
Вопрос:
У меня есть 2 списка выбора
- ausers — Список всех доступных пользователей
- пользователи — отображает выбранных пользователей
Я использую global $SESSION
переменную moodles для хранения элементов выбора пользователей, а затем загружаю выбранные элементы в список пользователей, используя $SESSION->susers
переменную. Это происходит, когда пользователь нажимает на кнопку «Добавить пользователя».
Я использую переменную сеанса для сохранения выбранных параметров, поскольку мне нужно опубликовать форму более одного раза. (В форме будет другой список выбора курса)
Я не могу использовать javascript для выполнения этого, поскольку мой клиент хочет, чтобы скрипт функционировал без поддержки js.
ПРИМЕЧАНИЕ :
Мой код загружает параметры правильно, но отображает текущие
$SESSION
данные и предыдущие$SESSION
данные в списке выбора.Я думаю, проблема может заключаться в обновлении элемента select. Я использую следующую инструкцию для загрузки выбранных пользователей в элемент susers$susers_el->load($susers);
Чтобы лучше проиллюстрировать проблему :
На кнопке «Добавить пользователя» нажмите
Выбранные пользователи (ausers) 1.Джо 2.Джеймс Список выбора (пользователи) 1.Джо 2.Джеймс
Когда я хочу добавить другого пользователя в список пользователей, происходит следующее: На кнопке «Добавить пользователя» нажмите
Выбранные пользователи (ausers) 3. Список выбора Lance (пользователи) 1.Джо 2.Джеймс 1.Джо 2.Джеймс 3.Лэнс
Ниже приведен текущий код, любая помощь или совет приветствуются.
class learner_progress_form extends moodleform {
function definition() {
global $SESSION, $CFG;
fb('Create form');
$mform = amp; $this->_form;
//User Section
$mform->addElement('header', 'site_users', 'Site Users');
$objs[] = array();
$ausers[] = array();
//All users amp; courses sessions
$SESSION->all_users = $this->get_all_users();
//Available users $ courses
$ausers = $SESSION->all_users;
//Form design
$objs[0] =amp; $mform->createElement('select', 'ausers', 'Available users', $ausers, 'size="15"');
$objs[0]->setMultiple(true);
$objs[1] =amp; $mform->createElement('select', 'susers', 'Selected users', null, 'size="15"');
$objs[1]->setMultiple(true);
$grp =amp; $mform->addElement('group', 'usersgrp', 'Users', $objs, ' ', false);
$objs = array();
$objs[] =amp; $mform->createElement('submit', 'uaddsel','Add');
$objs[] =amp; $mform->createElement('submit', 'uremovesel', 'Remove');
$grp =amp; $mform->addElement('group', 'ubuttonsgrp', null, $objs, array(' ', '<br />'), false);
$renderer =amp; $mform->defaultRenderer();
$template = '<label class="qflabel" style="vertical-align:top">{label}</label> {element}';
$renderer->setGroupElementTemplate($template, 'usersgrp');
//Button Section
$mform->addElement('header','actions','Generate report');
$objs = array();
$objs[] =amp; $mform->createElement('submit', 'submit', 'Go');
$mform->addElement('group', 'actionsgrp', 'Generate report with selected data', $objs, ' ', false);
}
function definition_after_data() {
global $SESSION;
fb('definition after data');
$mform =amp; $this->_form;
//Get users group and elements
$usersgrp =amp; $mform->getElement('usersgrp')->getElements();
//Selected Users
$susers_el =amp; $usersgrp[1]; //selected users
$susers = $SESSION->susers;
$susers_el->load($susers);
}
function get_all_users() {
global $SESSION, $CFG;
$ausers = array();
$userlist = get_records_sql(
"select id, firstname, lastname, email
from {$CFG->prefix}user
where id NOT IN (0,1,2)"); //exclude empty,admin amp; guest
foreach($userlist as $user){
if (!empty($user) ) {
$ausers[$user->id] = $user->firstname." ".$user->lastname;
}
}
//sort($ausers);
return $ausers;
}
/**
* Add user(s) selections to list
* $SESSION->s_users : Stores previous selections
* TBD : Seems to be a refresh bug
* TOFIX : Duplication - possible refresh bug
**/
function set_user_selections() {
global $SESSION, $CFG;
$usergrp =amp; $this->_form->getElement('usersgrp')->getElements();
$ausers_el =amp; $usergrp[0];
$susers_el =amp; $usergrp[1];
$susers = $ausers_el->getSelected();
$ausers = $SESSION->all_users;
$users = array();
//build selected users array
foreach ($susers as $user=>$id) {
$users[$id] = $ausers[$id];
}
//Check selected user sessions
if (isset($SESSION->susers) )
{
//Remove duplicate selections
foreach ($SESSION->susers as $id=>$val) {
if (in_array($id, $users) )
{
unset($SESSION->susers[$id]);
}
}
$users = $SESSION->susers $users;
}
$SESSION->susers = $users;
//asort($users);
fb('User being loaded in select list');
fb($users);
$susers_el->load($users);
}
Комментарии:
1. Что
get_all_users
делает? Код?2. Привет, я добавил функцию get_all_users в приведенный выше пример кода.
3. Извините, я не вижу никакой причины вашей проблемы. Было бы неплохо, если бы вы могли воспроизвести проблему в скрипте, который можно запускать автономно. Я мог бы запустить его и тогда.
Ответ №1:
РЕШЕНО!Мне в основном приходилось проверять переменные $ _POST, чтобы выполнить соответствующее действие в моих списках выбора. Это должно было выполняться в definition_after_data
функции каждый раз, когда форма загружается (обновляется, публикуется и т.д.). Переменные сеанса отлично работают, чтобы сохранить загрузку предыдущих вариантов выбора пользователя.
Эти простые строки кода решили мою проблему.
//Load users
if (!isset($_POST['uaddsel']) and !isset($_POST['uremovesel']) ) {
$this->load_session_users(); //load previous selected user in susers
}
//Load courses
if (!isset($_POST['caddsel']) and !isset($_POST['cremovesel']) ) {
$this->load_session_courses();
}
и в моем index.php я бы назвал :
//Add user
if (isset($_POST['uaddsel']) ) {
//add user
$form->set_user_selections();
}
//remove user
if (isset($_POST['uremovesel']) ) {
$form->remove_selected_users();
}