2011-05-01 97 views
0

加載我有2名選擇列表Moodle的HTML Quickform選擇選項不正確

  1. ausers - 列出所有可用的用戶
  2. susers - 顯示選定的用戶

我用moodles global $SESSION變量來存儲用戶選擇項目 ,然後使用將所選項目加載到用戶列表中 變量。 當用戶點擊「Add user」按鈕時會發生這種情況。

我正在使用會話變量來保存選擇,因爲我需要多次發佈 表單。 (表單將有另一個當然選擇列表)

我不能使用JavaScript來實現這一點,因爲我的客戶希望腳本在沒有js支持的情況下運行。

注:

我的代碼加載正確的選項 但顯示當前$SESSION數據 並在 選擇list.I以前$SESSION數據認爲問題可能是的刷新問題選擇元素。 我用下面的語句來加載所選用戶在susers元素 $susers_el->load($susers);

爲了更好地說明問題:

「添加用戶」按鈕,單擊

選擇用戶(ausers) 1.Joe 2.James 選擇列表(susers) 1.Joe 2.James

當我想添加其他用戶到susers列出以下情況: 「添加用戶」 按鈕,單擊

選定的用戶(ausers) 3.Lance 選擇列表(susers) 1.Joe 2.James 1.Joe 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); 
    } 
+0

什麼'get_all_users'嗎?碼? – cweiske 2011-05-02 14:18:24

+0

嗨,我已經將get_all_users函數添加到上面的代碼示例。 – QCar 2011-05-02 16:42:46

+0

對不起,我沒有看到你的問題的任何理由。如果您可以在可以單獨運行的腳本上重現問題,那將會很不錯。我也可以運行它。 – cweiske 2011-05-04 08:58:19

回答

0

已解決! 我基本上必須檢查$ _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(); 
    }