【问题标题】:Moodle HTML Quickform select options not loading correctlyMoodle HTML Quickform 选择选项未正确加载
【发布时间】:2011-05-01 21:11:56
【问题描述】:

我有 2 个选择列表

  1. aurs - 列出所有可用用户
  2. susers - 显示选定的用户

我使用moodles global $SESSION 变量来存储用户选择项 然后我使用$SESSION->susers 将所选项目加载到 susers 列表中 多变的。 当用户点击“添加用户”按钮时会发生这种情况。

我正在使用会话变量来保存选择,因为我需要发布 表格不止一次。 (表单将有另一个课程选择列表)

我无法使用 javascript 来完成此操作,因为我的客户希望脚本在没有 js 支持的情况下运行。

注意:

我的代码正确加载选项 但显示当前的$SESSION 数据 和之前的$SESSION 数据在 选择列表。我认为问题可能是选择元素的刷新问题。 我使用以下语句在 susers 元素中加载选定的用户 $susers_el->load($susers);

为了更好地说明问题:

点击“添加用户”按钮

选定用户(用户) 1.乔 2.詹姆斯 选择列表(suser) 1.乔 2.詹姆斯

当我想将另一个用户添加到 susers 列表时,会发生以下情况: 点击“添加用户”按钮

选定用户(用户) 3.兰斯 选择列表(suser) 1.乔 2.詹姆斯 1.乔 2.詹姆斯 3.兰斯

以下是当前代码,非常感谢任何帮助或建议。

class learner_progress_form extends moodleform {
  function definition() {
    global $SESSION, $CFG;
    fb('Create form');
    $mform  = & $this->_form;
    //User Section
    $mform->addElement('header', 'site_users', 'Site Users');
    $objs[]    = array();
    $ausers[]  = array();
    //All users & courses sessions
    $SESSION->all_users   = $this->get_all_users(); 
    //Available users $ courses
    $ausers   = $SESSION->all_users; 
    //Form design
    $objs[0] =& $mform->createElement('select', 'ausers', 'Available users', $ausers, 'size="15"');
    $objs[0]->setMultiple(true);
    $objs[1] =& $mform->createElement('select', 'susers', 'Selected users', null, 'size="15"');
    $objs[1]->setMultiple(true);
    $grp =& $mform->addElement('group', 'usersgrp', 'Users', $objs, ' ', false);

    $objs = array();
    $objs[] =& $mform->createElement('submit', 'uaddsel','Add');
    $objs[] =& $mform->createElement('submit', 'uremovesel', 'Remove');
    $grp =& $mform->addElement('group', 'ubuttonsgrp', null, $objs, array(' ', '<br />'), false);
    $renderer =& $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[] =& $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      =& $this->_form; 
    //Get users group and elements
    $usersgrp   =& $mform->getElement('usersgrp')->getElements();
    //Selected Users
    $susers_el  =& $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 & 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        =& $this->_form->getElement('usersgrp')->getElements();
    $ausers_el      =& $usergrp[0];
    $susers_el      =& $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);
  }

【问题讨论】:

  • get_all_users 是做什么的?代码?
  • 您好,我在上面的代码示例中添加了 get_all_users 函数。
  • 抱歉,我看不出您的问题有任何原因。如果您可以在可以独立运行的脚本上重现该问题,那就太好了。那时我也可以运行它。

标签: php html pear moodle quickform


【解决方案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();
  }

【讨论】:

    猜你喜欢
    • 2021-09-10
    • 1970-01-01
    • 2017-04-24
    • 2021-10-24
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多