Moodle HTML Quickform неправильно загружает параметры выбора

#php #html #pear #moodle #quickform

#php #HTML #pear #moodle #quickform

Вопрос:

У меня есть 2 списка выбора

  1. ausers — Список всех доступных пользователей
  2. пользователи — отображает выбранных пользователей

Я использую 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();
  }