edusoho二次开发增加手动发放证书功能 实现后期补发证书 php twig代码披露
1、增加了数据库
ALTER TABLE `course_member` ADD `zhengshuimgData` DATE NULL COMMENT '发证日期' AFTER `codesn`;
修改了的文件:
/src/AppBundle/Controller/Course/StudentManageController.php
/app/Resources/views/course-manage/student/tr-v2.html.twig
/src/AppBundle/Resources/config/routing.yml
/app/Resources/views/course-manage/student/send-zhengshuimg-modal.html.twig
/web/static-dist/app/js/course-manage/student-send-zhengshuimg/index.js
/src/AppBundle/Controller/My/CourseController.php
/src/Biz/Course/Service/Impl/MemberServiceImpl.php
/src/Biz/Course/Dao/Impl/CourseMemberDaoImpl.php
/src/AppBundle/Controller/TaskController.php
2、在对应的课程中 找到对应的学员进行手动给他们发放证书,以及调整发放证书的时间日期
3、在用户的个人中心里面可以看到生成好的证书界面:
4、生成证书的函数代码:
public function myzhengshuAction(Request $request)
{
$currentUser = $this->getUser();
// $profile2 = $this->getUserService()->getUserProfile($currentUser['id']);
$members = $this->getCourseMemberService()->searchMembers(array('userId' => $currentUser['id'], 'role' => 'student'), array('createdTime' => 'desc'), 0, PHP_INT_MAX);
$members = ArrayToolkit::index($members, 'courseId');
// 获取已完成未生成证书列表
$list = $this->getCourseMemberService()->getFinishedNotZhengshuimg($limit=50, $currentUser['id']);
if($list){
$url = 'http://'.$_SERVER['HTTP_HOST'];
require dirname(__DIR__) . '/phpqrcode.php';
foreach ($list as $key => $item){
try{
$nowTime = $item['finishedtime']; //isset($item['finishedTime']) && $item['finishedTime'] ? strtotime($item['finishedTime']) : time();
$y = date("Y", $nowTime);
$m = date("m", $nowTime);
$d = date("d", $nowTime);
$im = @imagecreatefrompng($_SERVER['DOCUMENT_ROOT'].$item['zhengshu']);
$font = $_SERVER['DOCUMENT_ROOT']."/assets/fonts/font.ttf";
$aaab = "/files/zhengshu/".$item['user_id']."/";
$aaab .= $item['user_id'].'-'.$item['defaultCourseId'].$y.$m.$d.'.png';
$datas = 'http://'.$_SERVER["HTTP_HOST"].$aaab;
$errorCorrectionLevel = 'L';
$matrixPointSize = 4;
$QR = 'qrcode.png';//已经生成的原始二维码图
\QRcode::png($datas,$QR,$errorCorrectionLevel, $matrixPointSize, 2);
$QR2 = imagecreatefromstring(file_get_contents($QR));
$black = imagecolorallocate($im, 0, 0, 0);
$username = $item['nickname']; //要写到图上的文字
$truename = $item['truename']; //要写到图上的中文名
$idcard = $item['idcard']; //要写到图上的身份证
$classname = $item['title'];
$type = "网络培训";
$bullshit = "合格";
$code = "ZJH330401".$y.$m.$d.($item['id']<1000?sprintf('%04s', $item['id']):$item['id']);
imagettftext($im, 16, 0, 175, 162, $black, $font, $code);
imagettftext($im, 16, 0, 210, 290, $black, $font, $truename);
imagettftext($im, 16, 0, 435, 290, $black, $font, $idcard);
imagettftext($im, 16, 0, 800, 290, $black, $font, $y);
imagettftext($im, 16, 0, 150, 350, $black, $font, $m);
imagettftext($im, 16, 0, 650, 350, $black, $font, $classname);
imagettftext($im, 16, 0, 380, 400, $black, $font, $type);
imagettftext($im, 16, 0, 565, 400, $black, $font, $bullshit);
imagettftext($im, 16, 0, 815, 400, $black, $font, "");
imagettftext($im, 16, 0, 607, 570, $black, $font, $y);
imagettftext($im, 16, 0, 690, 570, $black, $font, $m);
imagettftext($im, 16, 0, 737, 570, $black, $font, $d);
$path=$_SERVER['DOCUMENT_ROOT']."/files/zhengshu/".$item['user_id']."/";
if (!is_dir($path)){
$res=mkdir($path,0777,true);
}
$saveurl = "/files/zhengshu/".$item['user_id']."/";
$zsimg = $path.$item['user_id'].'-'.$item['defaultCourseId'].$y.$m.$d.'.png';
$sd22 = imagepng($QR2,$zsimg);
$sdddddd = imagepng($im,$path.$item['user_id'].'-'.$item['defaultCourseId'].$y.$m.$d.'.png');
imagecopymerge($im, $QR2,130,500,0,0, imagesx($QR2), imagesy($QR2), 100);
imagepng($im,$path.$item['user_id'].'-'.$item['defaultCourseId'].$y.$m.$d.'.png');
$saveurl .= $item['user_id'].'-'.$item['defaultCourseId'].$y.$m.$d.'.png';
$this->getCourseMemberService()->updateMembers(array('id'=>$item['id']),array('zhengshuimg'=>$saveurl, 'zhengshuimgData'=>date('Y-m-d', $nowTime),'autoname'=>$classname,'codesn'=>$code));
}catch(\Exception $e){
var_dump($e->getMessage());
}
}
}
$imgs = $this->getCourseMemberService()->selectZhengshuById2($currentUser['id'],false);
return $this->render(
'my/learning/course/zhengshu.html.twig',
array(
'imgs' => $imgs,
'members' => $members,
)
);
}
5、前端页面代码twig
{% extends 'bootstrap-modal-layout.html.twig' %}
{% block title %}
发证书
{% endblock %}
{% do script(['libs/jquery-validation.js','app/js/course-manage/student-send-zhengshuimg/index.js?v=0.1.15'])%}
{% do script(['libs/bootstrap-datetimepicker.js', 'libs/perfect-scrollbar.js', 'app/js/course-manage/student-send-zhengshuimg/index2.js?v=0.1.15']) %}
{% set modalSize = 'large' %}
{% block body %}
<form id="student-send-zhengshuimg-form" method="post" action="{{ path('course_set_manage_course_students_send_zhengshuimg', {courseSetId: course.courseSetId, courseId:course.id, userId:user.id}) }}" data-user="{{ default.user_name|default('site.default.student'|trans) }}">
<div class="form-group">
<div class="controls">
请选择发证日期
<input type="text" class="form-control course-mangae-info__input mlm" id="buyExpiryTime" name="buyExpiryTime" value="">
</div>
</div>
<input type="hidden" name="_csrf_token" value="{{ csrf_token('site') }}">
</form>
{% endblock %}
{% block footer %}
<button type="button" class="btn btn-primary pull-right js-student-send-zhengshuimg-save-btn">{{'form.btn.save'|trans}}</button>
<button type="button" class="btn btn-link pull-right" data-dismiss="modal">{{'form.btn.cancel'|trans}}</button>
{% endblock %}
6、路由routing.yml
course_set_manage_course_students_send_zhengshuimg:
path: /course_set/{courseSetId}/manage/course/{courseId}/student/{userId}/send_zhengshuimg
defaults: { _controller: AppBundle:Course/StudentManage:sendZhengshuimg }
course_task_create_zhengshuimg:
path: /course/task/create_zhengshuimg
defaults: { _controller: AppBundle:Task:createZhengshuimg }
my_zhengshu_member_center:
path: /my/courses/myzhengshu
defaults: { _controller: AppBundle:My/Course:myzhengshu }
7、部分js代码
webpackJsonp(
["app/js/course-manage/student-send-zhengshuimg/index"],
{
"4e7105ae891c998fcdfl":function(e,a,r){
"use strict";
var s=$("#student-send-zhengshuimg-form").parents(".modal"),
t=$("#student-send-zhengshuimg-form"),
n=t.validate({
rules:{
remark:{
required:!1,
maxlength:80
}
},
messages:{
remark:{
maxlength:Translator.trans("course_manage.student_remark_validate_error_hint")
}
}
});
$(".js-student-send-zhengshuimg-save-btn").click(function(e){
n.form()&&(
$(e.currentTarget).button("loadding"),
$.post(t.attr("action"),t.serialize(),function(e){
s.modal("hide");
var a=t.data("user");
console.log(11111,e)
if(e.success){
cd.message({
type:"success",
message:e.message||'发证成功',
delay:1e3
}).on("close",function(){
window.location.reload()
})
}else{
cd.message({
type:"danger",
message:e.message||'发证失败'
})
}
}, 'json').error(function(){
var e=t.data("user");
cd.message({
type:"danger",
message:Translator.trans("course_manage.student_remark_failed_hint",{username:e})
})
})
)
})
}
},["4e7105ae891c998fcdfl"]);