/jwc.php

https://github.com/hit-moodle/moodle-enrol_jwc · PHP · 182 lines · 120 code · 31 blank · 31 comment · 21 complexity · e8260dd2c78eb65bd12885885a6d62bc MD5 · raw file

  1. <?php
  2. class jwc_helper {
  3. /**
  4. * 返回semester学期中编号为coursenumber的课程中teachers下辖所有学生
  5. *
  6. * 返回数组,成员是用户id
  7. * 如无学生,返回空数组
  8. * 如远程学生没有可匹配的本地账号,存入nonexist_students数组
  9. * 如遇错误,返回false,return_msg里保存错误信息
  10. */
  11. public function get_students($coursenumber, array $teachers, $semester, &$return_msg, &$nonexist_students = null) {
  12. global $DB;
  13. $courses = $this->get_matched_courses($coursenumber, $teachers, $semester, $return_msg);
  14. if ($courses === false) {
  15. return false;
  16. } else if (empty($courses)) {
  17. $return_msg = '没有可同步的课程';
  18. return false;
  19. }
  20. $course = reset($courses);
  21. $return_msg = $course->kcname.'-对应'.count($courses).'个教务处选课';
  22. // 获取学生
  23. $students = array();
  24. foreach ($courses as $course) {
  25. $raw_students = $this->get_all_students($course->xkid, $return_msg);
  26. if (!$raw_students) {
  27. return false;
  28. }
  29. foreach ($raw_students as $item) {
  30. if ($userid = $DB->get_field('user', 'id', array('auth'=>'cas', 'username'=>$item->code, 'lastname'=>$item->name))) {
  31. $students[$userid] = $userid;
  32. } else {
  33. if (is_array($nonexist_students)) {
  34. $nonexist_students[] = $item;
  35. }
  36. }
  37. }
  38. }
  39. return $students;
  40. }
  41. /**
  42. * 得到编号为coursenumber的所有课程信息
  43. *
  44. * 返回数组,成员是课程对象
  45. * 如编号正确但无对应课程,返回空数组
  46. * 如遇错误,返回false
  47. */
  48. public function get_all_courses($coursenumber, $semester, &$error) {
  49. $params = array();
  50. $params['xq'] = $semester;
  51. $params['id'] = $coursenumber;
  52. $jwcstr = $this->access('http://xscj.hit.edu.cn/hitjwgl/lxw/getinfoD.asp', $params);
  53. if ($this->has_error($jwcstr, $error)) {
  54. return false;
  55. }
  56. $info = new SimpleXMLElement($jwcstr);
  57. $courses = array();
  58. foreach ($info->course->item as $item) {
  59. $courses[] = $item;
  60. }
  61. return $courses;
  62. }
  63. /**
  64. * 得到选课ID为xkid的课程中所有学生
  65. */
  66. public function get_all_students($xkid, &$return_msg) {
  67. $params = array();
  68. $params['id'] = $xkid;
  69. $jwcstr = $this->access('http://xscj.hit.edu.cn/hitjwgl/lxw/getinfoC.asp', $params);
  70. if ($this->has_error($jwcstr, $return_msg)) {
  71. return false;
  72. }
  73. $info = new SimpleXMLElement($jwcstr);
  74. return $info->stud->item;
  75. }
  76. /**
  77. * 返回semester学期中编号为coursenumber的课程中teachers对应的教务处课程
  78. *
  79. * 返回数组,成员是用户id
  80. * 如无对应选课,返回空数组
  81. * 如遇错误,返回false
  82. */
  83. public function get_matched_courses($coursenumber, array $teachers, $semester, &$return_msg) {
  84. global $DB;
  85. if (! $courses = $this->get_all_courses($coursenumber, $semester, $return_msg)) {
  86. return false;
  87. }
  88. // 匹配教师姓名,找出可同步的课程
  89. $matched = array();
  90. foreach ($courses as $course) {
  91. foreach ($teachers as $teacher) {
  92. if ($teacher->lastname == $course->jsname) {
  93. $matched[] = $course;
  94. break; // 有一个教师与当前课匹配,就够了
  95. }
  96. }
  97. }
  98. return $matched;
  99. }
  100. public function export($xkid, $key, &$return_msg) {
  101. $url = "http://xscj.hit.edu.cn/hitjwgl/lxw/uploadgrade.asp?xkid=$xkid&key=$key";
  102. // echo $url.'<br />';
  103. $ret = download_file_content($url);
  104. if ($ret) {
  105. // 是否出错
  106. if (!strstr(strip_tags($ret), 'success')) {
  107. $return_msg = trim(strip_tags($ret));
  108. $ret = false;
  109. }
  110. }
  111. return $ret;
  112. }
  113. protected function access($url_base, $params) {
  114. global $CFG;
  115. if (empty($params)) {
  116. return false;
  117. }
  118. $param = '';
  119. foreach ($params as $var => $value) {
  120. //$value = textlib_get_instance()->convert($value, 'UTF-8', 'GBK');
  121. $value = urlencode($value);
  122. if (empty($param)) {
  123. $param = "$var=$value";
  124. } else {
  125. $param .= "&$var=$value";
  126. }
  127. }
  128. // 添加数字签名
  129. $prefix = get_config('enrol_jwc', 'signprefix');
  130. $suffix = get_config('enrol_jwc', 'signsuffix');
  131. $sign = md5($prefix.$param.$suffix);
  132. $param .= "&sign=$sign";
  133. $url = $url_base.'?'.$param;
  134. require_once("$CFG->libdir/filelib.php");
  135. return download_file_content($url);
  136. }
  137. protected function has_error($jwcstr, &$error) {
  138. $result = false; // no error
  139. if ($jwcstr === false) {
  140. $error = '访问教务处网站出错';
  141. $result = true;
  142. } else {
  143. $info = new SimpleXMLElement($jwcstr);
  144. if ($info->retu->flag == 0) {
  145. $error = $info->retu->errorinfo;
  146. $result = true;
  147. }
  148. }
  149. return $result;
  150. }
  151. }