public/plugin/customcertificate/src/CustomCertificatePlugin.php
<?php
/* For license terms, see /license.txt */
/**
* Plugin class for the CustomCertificate plugin.
*
* @author Jose Angel Ruiz <desarrollo@nosolored.com>
*/
class CustomCertificatePlugin extends Plugin
{
const TABLE_CUSTOMCERTIFICATE = 'plugin_customcertificate';
public $isCoursePlugin = true;
// When creating a new course this settings are added to the course
public $course_settings = [
[
'name' => 'customcertificate_course_enable',
'type' => 'checkbox',
],
[
'name' => 'use_certificate_default',
'type' => 'checkbox',
],
];
/**
* Constructor.
*/
protected function __construct()
{
parent::__construct(
'1.0',
'Jose Angel Ruiz - NoSoloRed (original author), Julio Montoya',
[
'enable_plugin_customcertificate' => 'boolean',
]
);
$this->isAdminPlugin = true;
}
/**
* Instance the plugin.
*
* @staticvar null $result
*
* @return CustomCertificatePlugin
*/
public static function create()
{
static $result = null;
return $result ? $result : $result = new self();
}
/**
* This method creates the tables required to this plugin.
*/
public function install()
{
//Installing course settings
$this->install_course_fields_in_all_courses();
$tablesToBeCompared = [self::TABLE_CUSTOMCERTIFICATE];
$em = Database::getManager();
$cn = $em->getConnection();
$sm = $cn->getSchemaManager();
$tables = $sm->tablesExist($tablesToBeCompared);
if ($tables) {
return false;
}
require_once api_get_path(SYS_PLUGIN_PATH).'customcertificate/database.php';
}
/**
* This method drops the plugin tables.
*/
public function uninstall()
{
// Deleting course settings.
$this->uninstall_course_fields_in_all_courses();
$tablesToBeDeleted = [self::TABLE_CUSTOMCERTIFICATE];
foreach ($tablesToBeDeleted as $tableToBeDeleted) {
$table = Database::get_main_table($tableToBeDeleted);
$sql = "DROP TABLE IF EXISTS $table";
Database::query($sql);
}
$this->manageTab(false);
}
/**
* This method update the previous plugin tables.
*/
public function update()
{
$oldCertificateTable = 'gradebook_certificate_alternative';
$base = api_get_path(WEB_UPLOAD_PATH);
if (1 == Database::num_rows(Database::query("SHOW TABLES LIKE '$oldCertificateTable'"))) {
$sql = "SELECT * FROM $oldCertificateTable";
$res = Database::query($sql);
while ($row = Database::fetch_assoc($res)) {
$pathOrigin = $base.'certificates/'.$row['id'].'/';
$params = [
'access_url_id' => api_get_current_access_url_id(),
'c_id' => $row['c_id'],
'session_id' => $row['session_id'],
'content_course' => $row['content_course'],
'contents_type' => intval($row['contents_type']),
'contents' => $row['contents'],
'date_change' => intval($row['date_change']),
'date_start' => $row['date_start'],
'date_end' => $row['date_end'],
'place' => $row['place'],
'type_date_expediction' => intval($row['type_date_expediction']),
'day' => $row['day'],
'month' => $row['month'],
'year' => $row['year'],
'logo_left' => $row['logo_left'],
'logo_center' => $row['logo_center'],
'logo_right' => $row['logo_right'],
'seal' => $row['seal'],
'signature1' => $row['signature1'],
'signature2' => $row['signature2'],
'signature3' => $row['signature3'],
'signature4' => $row['signature4'],
'signature_text1' => $row['signature_text1'],
'signature_text2' => $row['signature_text2'],
'signature_text3' => $row['signature_text3'],
'signature_text4' => $row['signature_text4'],
'background' => $row['background'],
'margin_left' => intval($row['margin']),
'margin_right' => 0,
'certificate_default' => 0,
];
$certificateId = Database::insert(self::TABLE_CUSTOMCERTIFICATE, $params);
// Image manager
$pathDestiny = $base.'certificates/'.$certificateId.'/';
if (!file_exists($pathDestiny)) {
mkdir($pathDestiny, api_get_permissions_for_new_directories(), true);
}
$imgList = [
'logo_left',
'logo_center',
'logo_right',
'seal',
'signature1',
'signature2',
'signature3',
'signature4',
'background',
];
foreach ($imgList as $value) {
if (!empty($row[$value])) {
copy(
$pathOrigin.$row[$value],
$pathDestiny.$row[$value]
);
}
}
if (1 == $row['certificate_default']) {
$params['c_id'] = 0;
$params['session_id'] = 0;
$params['certificate_default'] = 1;
$certificateId = Database::insert(self::TABLE_CUSTOMCERTIFICATE, $params);
$pathOrigin = $base.'certificates/default/';
$pathDestiny = $base.'certificates/'.$certificateId.'/';
foreach ($imgList as $value) {
if (!empty($row[$value])) {
copy(
$pathOrigin.$row[$value],
$pathDestiny.$row[$value]
);
}
}
}
}
$sql = "DROP TABLE IF EXISTS $oldCertificateTable";
Database::query($sql);
echo get_lang('MessageUpdate');
}
}
/**
* By default new icon is invisible.
*
* @return bool
*/
public function isIconVisibleByDefault()
{
return false;
}
/**
* Get certificate data.
*
* @param int $id The certificate
* @param int $userId
*
* @return array
*/
public static function getCertificateData($id, $userId)
{
$id = (int) $id;
$userId = (int) $userId;
if (empty($id) || empty($userId)) {
return [];
}
$certificateTable = Database::get_main_table(TABLE_MAIN_GRADEBOOK_CERTIFICATE);
$categoryTable = Database::get_main_table(TABLE_MAIN_GRADEBOOK_CATEGORY);
$sql = "SELECT cer.user_id AS user_id, cat.session_id AS session_id, cat.course_code AS course_code
FROM $certificateTable cer
INNER JOIN $categoryTable cat
ON (cer.cat_id = cat.id AND cer.user_id = $userId)
WHERE cer.id = $id";
$rs = Database::query($sql);
if (Database::num_rows($rs) > 0) {
$row = Database::fetch_assoc($rs);
$courseCode = $row['course_code'];
$sessionId = $row['session_id'];
$userId = $row['user_id'];
if (1 == api_get_course_setting('customcertificate_course_enable', api_get_course_info($courseCode))) {
return [
'course_code' => $courseCode,
'session_id' => $sessionId,
'user_id' => $userId,
];
}
}
return [];
}
/**
* Check if it redirects.
*
* @param certificate $certificate
* @param int $certId
* @param int $userId
*/
public static function redirectCheck($certificate, $certId, $userId)
{
$certId = (int) $certId;
$userId = !empty($userId) ? $userId : api_get_user_id();
if ('true' === api_get_plugin_setting('customcertificate', 'enable_plugin_customcertificate')) {
$infoCertificate = self::getCertificateData($certId, $userId);
if (!empty($infoCertificate)) {
if ($certificate->user_id == api_get_user_id() && !empty($certificate->certificate_data)) {
$certificateId = $certificate->certificate_data['id'];
$extraFieldValue = new ExtraFieldValue('user_certificate');
$value = $extraFieldValue->get_values_by_handler_and_field_variable(
$certificateId,
'downloaded_at'
);
if (empty($value)) {
$params = [
'item_id' => $certificate->certificate_data['id'],
'extra_downloaded_at' => api_get_utc_datetime(),
];
$extraFieldValue->saveFieldValues($params);
}
}
$url = api_get_path(WEB_PLUGIN_PATH).'customcertificate/src/print_certificate.php'.
'?student_id='.$infoCertificate['user_id'].
'&course_code='.$infoCertificate['course_code'].
'&session_id='.$infoCertificate['session_id'];
header('Location: '.$url);
exit;
}
}
}
/**
* Get certificate info.
*
* @param int $courseId
* @param int $sessionId
* @param int $accessUrlId
*
* @return array
*/
public static function getInfoCertificate($courseId, $sessionId, $accessUrlId)
{
$courseId = (int) $courseId;
$sessionId = (int) $sessionId;
$accessUrlId = !empty($accessUrlId) ? (int) $accessUrlId : 1;
$table = Database::get_main_table(self::TABLE_CUSTOMCERTIFICATE);
$sql = "SELECT * FROM $table
WHERE
c_id = $courseId AND
session_id = $sessionId AND
access_url_id = $accessUrlId";
$result = Database::query($sql);
$resultArray = [];
if (Database::num_rows($result) > 0) {
$resultArray = Database::fetch_array($result);
}
return $resultArray;
}
/**
* Get default certificate info.
*
* @param int $accessUrlId
*
* @return array
*/
public static function getInfoCertificateDefault($accessUrlId)
{
$accessUrlId = !empty($accessUrlId) ? (int) $accessUrlId : 1;
$table = Database::get_main_table(self::TABLE_CUSTOMCERTIFICATE);
$sql = "SELECT * FROM $table
WHERE certificate_default = 1 AND access_url_id = $accessUrlId";
$result = Database::query($sql);
$resultArray = [];
if (Database::num_rows($result) > 0) {
$resultArray = Database::fetch_array($result);
}
return $resultArray;
}
}