Compare commits
24 commits
MOODLE_311
...
MOODLE_38_
Author | SHA1 | Date | |
---|---|---|---|
|
1f63287e5f | ||
|
bcba998a97 | ||
|
768fb4f84e | ||
|
0955f09c65 | ||
|
b4c54be04c | ||
|
c946a6adf1 | ||
|
1ca6063d4b | ||
|
c355d7799c | ||
|
bef0be1b67 | ||
|
d940ca6508 | ||
|
c3602b11b3 | ||
|
f6d875d147 | ||
|
2a923bd8de | ||
|
e14e923fec | ||
|
e202e8ff43 | ||
|
42b0a43d0a | ||
|
3efd75e00a | ||
|
ed565c0a11 | ||
|
aac32e1c19 | ||
|
e88682769c | ||
|
02fa6819de | ||
|
2a5c9f6a3d | ||
|
be637b11ce | ||
|
11659e39a0 |
67 changed files with 199 additions and 1099 deletions
25
.github/workflows/moodle-ci.yml
vendored
25
.github/workflows/moodle-ci.yml
vendored
|
@ -16,7 +16,7 @@ jobs:
|
|||
- 5432:5432
|
||||
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 3
|
||||
mariadb:
|
||||
image: mariadb:10.5
|
||||
image: mariadb:10
|
||||
env:
|
||||
MYSQL_USER: 'root'
|
||||
MYSQL_ALLOW_EMPTY_PASSWORD: "true"
|
||||
|
@ -28,17 +28,17 @@ jobs:
|
|||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- php: '7.4'
|
||||
moodle-branch: 'MOODLE_311_STABLE'
|
||||
- php: '7.2'
|
||||
moodle-branch: 'MOODLE_38_STABLE'
|
||||
database: pgsql
|
||||
- php: '7.4'
|
||||
moodle-branch: 'MOODLE_311_STABLE'
|
||||
- php: '7.2'
|
||||
moodle-branch: 'MOODLE_38_STABLE'
|
||||
database: mariadb
|
||||
- php: '7.3'
|
||||
moodle-branch: 'MOODLE_311_STABLE'
|
||||
- php: '7.1'
|
||||
moodle-branch: 'MOODLE_38_STABLE'
|
||||
database: pgsql
|
||||
- php: '7.3'
|
||||
moodle-branch: 'MOODLE_311_STABLE'
|
||||
- php: '7.1'
|
||||
moodle-branch: 'MOODLE_38_STABLE'
|
||||
database: mariadb
|
||||
|
||||
steps:
|
||||
|
@ -103,6 +103,7 @@ jobs:
|
|||
run: moodle-plugin-ci mustache
|
||||
|
||||
- name: Grunt
|
||||
continue-on-error: true # This step will show errors but will not fail
|
||||
if: ${{ always() }}
|
||||
run: moodle-plugin-ci grunt --max-lint-warnings 0
|
||||
|
||||
|
@ -111,9 +112,9 @@ jobs:
|
|||
run: |
|
||||
moodle-plugin-ci phpunit
|
||||
cd moodle
|
||||
vendor/bin/phpunit --fail-on-risky --disallow-test-output --filter tool_dataprivacy_metadata_registry_testcase
|
||||
vendor/bin/phpunit --fail-on-risky --disallow-test-output --filter core_externallib_testcase
|
||||
vendor/bin/phpunit --fail-on-risky --disallow-test-output --testsuite core_privacy_testsuite --filter provider_testcase
|
||||
vendor/bin/phpunit --fail-on-risky --disallow-test-output -v admin/tool/dataprivacy/tests/metadata_registry_test.php
|
||||
vendor/bin/phpunit --fail-on-risky --disallow-test-output -v lib/tests/externallib_test.php
|
||||
vendor/bin/phpunit --fail-on-risky --disallow-test-output -v privacy/tests/provider_test.php
|
||||
|
||||
- name: Behat features
|
||||
if: ${{ always() }}
|
||||
|
|
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -1,2 +0,0 @@
|
|||
vendor/
|
||||
*.swp
|
21
CHANGES.md
21
CHANGES.md
|
@ -4,28 +4,9 @@ All notable changes to this project will be documented in this file.
|
|||
|
||||
Note - All hash comments refer to the issue number. Eg. #169 refers to https://github.com/mdjnelson/moodle-mod_customcert/issues/169.
|
||||
|
||||
## [3.11.2] - 2021-??-??
|
||||
|
||||
### Fixed
|
||||
- Fix places not using the multi-language filter (#433).
|
||||
- Fix user IDs in the issue table not being mapped during restore (#449).
|
||||
- Fix emails displaying HTML entities encoded (#457).
|
||||
- Fix error message when we have custom profile fields (#465).
|
||||
- Respect multiple languages in manage template page title (#467).
|
||||
## [3.8.6] - 2021-06-13
|
||||
|
||||
### Added
|
||||
- You can now choose the course short or full name to display (#415).
|
||||
- You can now select the alignment for all text elements (#121).
|
||||
|
||||
## [3.11.1] - 2021-06-13
|
||||
|
||||
### Fixed
|
||||
- Usage of deprecated functions (#423)
|
||||
|
||||
## [3.10.1] - 2021-06-13
|
||||
|
||||
### Added
|
||||
- Usage of github actions (#407).
|
||||
- The ability to show the description on the course page (#406).
|
||||
- The ability to choose how to deliver the certificate (#401).
|
||||
|
||||
|
|
|
@ -6,8 +6,6 @@ This activity allows the dynamic generation of PDF certificates with complete cu
|
|||
|
||||
There are two installation methods that are available.
|
||||
|
||||
First, make sure that wkhtmltopdf is installed on your server and available on $PATH.
|
||||
|
||||
Follow one of these, then log into your Moodle site as an administrator and visit the notifications page to complete the install.
|
||||
|
||||
### Git
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -18,6 +18,7 @@
|
|||
* use the YUI version in AMD code until it is replaced.
|
||||
*
|
||||
* @module mod_customcert/dialogue
|
||||
* @package mod_customcert
|
||||
* @copyright 2016 Mark Nelson <markn@moodle.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
* AMD module used when rearranging a custom certificate.
|
||||
*
|
||||
* @module mod_customcert/rearrange-area
|
||||
* @package mod_customcert
|
||||
* @copyright 2016 Mark Nelson <markn@moodle.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
|
|
@ -59,7 +59,7 @@ class backup_customcert_activity_structure_step extends backup_activity_structur
|
|||
$element = new backup_nested_element('element', array('id'), array(
|
||||
'pageid', 'name', 'element', 'data', 'font', 'fontsize',
|
||||
'colour', 'posx', 'posy', 'width', 'refpoint', 'sequence',
|
||||
'alignment', 'timecreated', 'timemodified'));
|
||||
'timecreated', 'timemodified'));
|
||||
|
||||
// The issues.
|
||||
$issues = new backup_nested_element('issues');
|
||||
|
|
|
@ -159,7 +159,6 @@ class restore_customcert_activity_structure_step extends restore_activity_struct
|
|||
|
||||
$data->customcertid = $this->get_new_parentid('customcert');
|
||||
$data->timecreated = $this->apply_date_offset($data->timecreated);
|
||||
$data->userid = $this->get_mappingid('user', $data->userid);
|
||||
|
||||
$newitemid = $DB->insert_record('customcert_issues', $data);
|
||||
$this->set_mapping('customcert_issue', $oldid, $newitemid);
|
||||
|
|
|
@ -270,20 +270,12 @@ class certificate {
|
|||
$allparams = $conditionsparams + array('customcertid' => $customcertid);
|
||||
|
||||
// Return the issues.
|
||||
$context = \context_module::instance($cm->id);
|
||||
$extrafields = \core_user\fields::for_identity($context)->get_required_fields();
|
||||
|
||||
$ufields = \core_user\fields::for_userpic()->including(...$extrafields);
|
||||
[
|
||||
'selects' => $userfieldsselects,
|
||||
'joins' => $userfieldsjoin,
|
||||
'params' => $userfieldsparams
|
||||
] = (array) $ufields->get_sql('u', true);
|
||||
$allparams = array_merge($allparams, $userfieldsparams);
|
||||
$sql = "SELECT ci.id as issueid, ci.code, ci.timecreated $userfieldsselects
|
||||
$extrafields = get_extra_user_fields(\context_module::instance($cm->id));
|
||||
$ufields = \user_picture::fields('u', $extrafields);
|
||||
$sql = "SELECT $ufields, ci.id as issueid, ci.code, ci.timecreated
|
||||
FROM {user} u
|
||||
INNER JOIN {customcert_issues} ci ON u.id = ci.userid
|
||||
$userfieldsjoin
|
||||
INNER JOIN {customcert_issues} ci
|
||||
ON u.id = ci.userid
|
||||
WHERE u.deleted = 0
|
||||
AND ci.customcertid = :customcertid
|
||||
$conditionssql";
|
||||
|
|
|
@ -37,21 +37,6 @@ defined('MOODLE_INTERNAL') || die();
|
|||
*/
|
||||
abstract class element {
|
||||
|
||||
/**
|
||||
* @var string The left alignment constant.
|
||||
*/
|
||||
const ALIGN_LEFT = 'L';
|
||||
|
||||
/**
|
||||
* @var string The centered alignment constant.
|
||||
*/
|
||||
const ALIGN_CENTER = 'C';
|
||||
|
||||
/**
|
||||
* @var string The right alignment constant.
|
||||
*/
|
||||
const ALIGN_RIGHT = 'R';
|
||||
|
||||
/**
|
||||
* @var \stdClass $element The data for the element we are adding - do not use, kept for legacy reasons.
|
||||
*/
|
||||
|
@ -112,11 +97,6 @@ abstract class element {
|
|||
*/
|
||||
protected $refpoint;
|
||||
|
||||
/**
|
||||
* @var string The alignment.
|
||||
*/
|
||||
protected $alignment;
|
||||
|
||||
/**
|
||||
* @var bool $showposxy Show position XY form elements?
|
||||
*/
|
||||
|
@ -150,7 +130,6 @@ abstract class element {
|
|||
$this->width = $element->width;
|
||||
$this->refpoint = $element->refpoint;
|
||||
$this->showposxy = isset($showposxy) && $showposxy;
|
||||
$this->set_alignment($element->alignment ?? self::ALIGN_LEFT);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -252,31 +231,6 @@ abstract class element {
|
|||
return $this->refpoint;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the alignment.
|
||||
*
|
||||
* @return string The current alignment value.
|
||||
*/
|
||||
public function get_alignment() {
|
||||
return $this->alignment ?? self::ALIGN_LEFT;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the alignment.
|
||||
*
|
||||
* @param string $alignment The new alignment.
|
||||
*
|
||||
* @throws \InvalidArgumentException if the provided new alignment is not valid.
|
||||
*/
|
||||
protected function set_alignment(string $alignment) {
|
||||
$validvalues = array(self::ALIGN_LEFT, self::ALIGN_CENTER, self::ALIGN_RIGHT);
|
||||
if (!in_array($alignment, $validvalues)) {
|
||||
throw new \InvalidArgumentException("'$alignment' is not a valid alignment value. It has to be one of " .
|
||||
implode(', ', $validvalues));
|
||||
}
|
||||
$this->alignment = $alignment;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function renders the form elements when adding a customcert element.
|
||||
* Can be overridden if more functionality is needed.
|
||||
|
@ -292,7 +246,6 @@ abstract class element {
|
|||
}
|
||||
element_helper::render_form_element_width($mform);
|
||||
element_helper::render_form_element_refpoint($mform);
|
||||
element_helper::render_form_element_alignment($mform);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -312,8 +265,7 @@ abstract class element {
|
|||
'posx' => $this->posx,
|
||||
'posy' => $this->posy,
|
||||
'width' => $this->width,
|
||||
'refpoint' => $this->refpoint,
|
||||
'alignment' => $this->get_alignment()
|
||||
'refpoint' => $this->refpoint
|
||||
];
|
||||
foreach ($properties as $property => $value) {
|
||||
if (!is_null($value) && $mform->elementExists($property)) {
|
||||
|
@ -359,16 +311,15 @@ abstract class element {
|
|||
$element = new \stdClass();
|
||||
$element->name = $data->name;
|
||||
$element->data = $this->save_unique_data($data);
|
||||
$element->font = $data->font ?? null;
|
||||
$element->fontsize = $data->fontsize ?? null;
|
||||
$element->colour = $data->colour ?? null;
|
||||
$element->font = (isset($data->font)) ? $data->font : null;
|
||||
$element->fontsize = (isset($data->fontsize)) ? $data->fontsize : null;
|
||||
$element->colour = (isset($data->colour)) ? $data->colour : null;
|
||||
if ($this->showposxy) {
|
||||
$element->posx = $data->posx ?? null;
|
||||
$element->posy = $data->posy ?? null;
|
||||
$element->posx = (isset($data->posx)) ? $data->posx : null;
|
||||
$element->posy = (isset($data->posy)) ? $data->posy : null;
|
||||
}
|
||||
$element->width = $data->width ?? null;
|
||||
$element->refpoint = $data->refpoint ?? null;
|
||||
$element->alignment = $data->alignment ?? self::ALIGN_LEFT;
|
||||
$element->width = (isset($data->width)) ? $data->width : null;
|
||||
$element->refpoint = (isset($data->refpoint)) ? $data->refpoint : null;
|
||||
$element->timemodified = time();
|
||||
|
||||
// Check if we are updating, or inserting a new element.
|
||||
|
|
|
@ -59,7 +59,6 @@ class element_factory {
|
|||
$data->posy = $element->posy ?? null;
|
||||
$data->width = $element->width ?? null;
|
||||
$data->refpoint = $element->refpoint ?? null;
|
||||
$data->alignment = $element->alignment ?? null;
|
||||
|
||||
// Ensure the necessary class exists.
|
||||
if (class_exists($classname)) {
|
||||
|
|
|
@ -74,7 +74,6 @@ class element_helper {
|
|||
$w = $element->get_width();
|
||||
$refpoint = $element->get_refpoint();
|
||||
$actualwidth = $pdf->GetStringWidth($content);
|
||||
$alignment = $element->get_alignment();
|
||||
|
||||
if ($w and $w < $actualwidth) {
|
||||
$actualwidth = $w;
|
||||
|
@ -105,7 +104,7 @@ class element_helper {
|
|||
$w += 0.0001;
|
||||
}
|
||||
$pdf->setCellPaddings(0, 0, 0, 0);
|
||||
$pdf->writeHTMLCell($w, 0, $x, $y, $content, 0, 0, false, true, $alignment);
|
||||
$pdf->writeHTMLCell($w, 0, $x, $y, $content, 0, 0, false, true);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -206,23 +205,6 @@ class element_helper {
|
|||
$mform->addHelpButton('refpoint', 'refpoint', 'customcert');
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper function to render the alignment form element.
|
||||
*
|
||||
* @param \MoodleQuickForm $mform the edit_form instance.
|
||||
*/
|
||||
public static function render_form_element_alignment($mform) {
|
||||
$alignmentoptions = array();
|
||||
$alignmentoptions[element::ALIGN_LEFT] = get_string('alignleft', 'customcert');
|
||||
$alignmentoptions[element::ALIGN_CENTER] = get_string('aligncenter', 'customcert');
|
||||
$alignmentoptions[element::ALIGN_RIGHT] = get_string('alignright', 'customcert');
|
||||
|
||||
$mform->addElement('select', 'alignment', get_string('alignment', 'customcert'), $alignmentoptions);
|
||||
$mform->setType('alignment', PARAM_ALPHA);
|
||||
$mform->setDefault('alignment', element::ALIGN_LEFT);
|
||||
$mform->addHelpButton('alignment', 'alignment', 'customcert');
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper function to performs validation on the colour element.
|
||||
*
|
||||
|
|
|
@ -1,64 +0,0 @@
|
|||
<?php
|
||||
// This file is part of the customcert module for Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Provides helper functionality.
|
||||
*
|
||||
* @package mod_customcert
|
||||
* @copyright 2021 Mark Nelson <mdjnelson@gmail.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
namespace mod_customcert;
|
||||
|
||||
use core_user\fields;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
/**
|
||||
* Class helper.
|
||||
*
|
||||
* Helper functionality for this module.
|
||||
*
|
||||
* @package mod_customcert
|
||||
* @copyright 2021 Mark Nelson <mdjnelson@gmail.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class helper {
|
||||
|
||||
/**
|
||||
* A centralised location for the all name fields.
|
||||
*
|
||||
* Returns a sql string snippet.
|
||||
*
|
||||
* @param string $tableprefix table query prefix to use in front of each field.
|
||||
* @return string All name fields.
|
||||
*/
|
||||
public static function get_all_user_name_fields(string $tableprefix = ''): string {
|
||||
$alternatenames = [];
|
||||
foreach (fields::get_name_fields() as $field) {
|
||||
$alternatenames[$field] = $field;
|
||||
}
|
||||
|
||||
if ($tableprefix) {
|
||||
foreach ($alternatenames as $key => $altname) {
|
||||
$alternatenames[$key] = $tableprefix . '.' . $altname;
|
||||
}
|
||||
}
|
||||
|
||||
return implode(',', $alternatenames);
|
||||
}
|
||||
}
|
|
@ -47,23 +47,19 @@ class load_template_form extends \moodleform {
|
|||
|
||||
// Get the context.
|
||||
$context = $this->_customdata['context'];
|
||||
$syscontext = \context_system::instance();
|
||||
|
||||
$mform->addElement('header', 'loadtemplateheader', get_string('loadtemplate', 'customcert'));
|
||||
|
||||
// Display a link to the manage templates page.
|
||||
if ($context->contextlevel != CONTEXT_SYSTEM && has_capability('mod/customcert:manage', $syscontext)) {
|
||||
if ($context->contextlevel != CONTEXT_SYSTEM && has_capability('mod/customcert:manage', \context_system::instance())) {
|
||||
$link = \html_writer::link(new \moodle_url('/mod/customcert/manage_templates.php'),
|
||||
get_string('managetemplates', 'customcert'));
|
||||
$mform->addElement('static', 'managetemplates', '', $link);
|
||||
}
|
||||
|
||||
$arrtemplates = $DB->get_records_menu('customcert_templates', ['contextid' => $syscontext->id], 'name ASC', 'id, name');
|
||||
if ($arrtemplates) {
|
||||
$templates = [];
|
||||
foreach ($arrtemplates as $key => $template) {
|
||||
$templates[$key] = format_string($template, true, ['context' => $context]);
|
||||
}
|
||||
$templates = $DB->get_records_menu('customcert_templates',
|
||||
array('contextid' => \context_system::instance()->id), 'name ASC', 'id, name');
|
||||
if ($templates) {
|
||||
$group = array();
|
||||
$group[] = $mform->createElement('select', 'ltid', '', $templates);
|
||||
$group[] = $mform->createElement('submit', 'loadtemplatesubmit', get_string('load', 'customcert'));
|
||||
|
|
|
@ -77,7 +77,7 @@ class manage_templates_table extends \table_sql {
|
|||
* @return string
|
||||
*/
|
||||
public function col_name($template) {
|
||||
return format_string($template->name, true, ['context' => $this->context]);
|
||||
return $template->name;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -44,10 +44,9 @@ class mobile {
|
|||
global $OUTPUT, $DB, $USER;
|
||||
|
||||
$args = (object) $args;
|
||||
$versionname = $args->appversioncode >= 3950 ? 'latest' : 'ionic3';
|
||||
|
||||
$cmid = $args->cmid;
|
||||
$groupid = empty($args->group) ? 0 : (int) $args->group; // By default, group 0.
|
||||
$groupid = empty($args->group) ? 0 : $args->group; // By default, group 0.
|
||||
|
||||
// Capabilities check.
|
||||
$cm = get_coursemodule_from_id('customcert', $cmid);
|
||||
|
@ -115,7 +114,6 @@ class mobile {
|
|||
'showreport' => $showreport,
|
||||
'hasrecipients' => !empty($recipients),
|
||||
'recipients' => array_values($recipients),
|
||||
'numrecipients' => count($recipients),
|
||||
'currenttimestamp' => time()
|
||||
];
|
||||
|
||||
|
@ -123,13 +121,11 @@ class mobile {
|
|||
'templates' => [
|
||||
[
|
||||
'id' => 'main',
|
||||
'html' => $OUTPUT->render_from_template("mod_customcert/mobile_view_activity_page_$versionname", $data),
|
||||
'html' => $OUTPUT->render_from_template('mod_customcert/mobile_view_activity_page', $data),
|
||||
],
|
||||
],
|
||||
'javascript' => '',
|
||||
'otherdata' => [
|
||||
'group' => $groupid,
|
||||
]
|
||||
'otherdata' => ''
|
||||
];
|
||||
}
|
||||
|
||||
|
|
|
@ -66,7 +66,7 @@ class report_table extends \table_sql {
|
|||
parent::__construct('mod_customcert_report_table');
|
||||
|
||||
$context = \context_module::instance($cm->id);
|
||||
$extrafields = \core_user\fields::for_identity($context)->get_required_fields();
|
||||
$extrafields = get_extra_user_fields($context);
|
||||
|
||||
$columns = [];
|
||||
$columns[] = 'fullname';
|
||||
|
@ -79,7 +79,7 @@ class report_table extends \table_sql {
|
|||
$headers = [];
|
||||
$headers[] = get_string('fullname');
|
||||
foreach ($extrafields as $extrafield) {
|
||||
$headers[] = \core_user\fields::get_display_name($extrafield);
|
||||
$headers[] = get_user_field_name($extrafield);
|
||||
}
|
||||
$headers[] = get_string('receiveddate', 'customcert');
|
||||
$headers[] = get_string('code', 'customcert');
|
||||
|
|
|
@ -23,8 +23,6 @@
|
|||
*/
|
||||
namespace mod_customcert\task;
|
||||
|
||||
use mod_customcert\helper;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
/**
|
||||
|
@ -107,7 +105,7 @@ class email_certificate_task extends \core\task\scheduled_task {
|
|||
$info->certificatename = $certificatename;
|
||||
|
||||
// Get a list of all the issues.
|
||||
$userfields = helper::get_all_user_name_fields('u');
|
||||
$userfields = get_all_user_name_fields(true, 'u');
|
||||
$sql = "SELECT u.id, u.username, $userfields, u.email, ci.id as issueid, ci.emailed
|
||||
FROM {customcert_issues} ci
|
||||
JOIN {user} u
|
||||
|
@ -213,8 +211,7 @@ class email_certificate_task extends \core\task\scheduled_task {
|
|||
$subject = get_string('emailstudentsubject', 'customcert', $info);
|
||||
$message = $textrenderer->render($renderable);
|
||||
$messagehtml = $htmlrenderer->render($renderable);
|
||||
email_to_user($user, fullname($userfrom), html_entity_decode($subject), $message, $messagehtml,
|
||||
$tempfile, $filename);
|
||||
email_to_user($user, fullname($userfrom), $subject, $message, $messagehtml, $tempfile, $filename);
|
||||
}
|
||||
|
||||
if ($customcert->emailteachers) {
|
||||
|
@ -225,8 +222,8 @@ class email_certificate_task extends \core\task\scheduled_task {
|
|||
$message = $textrenderer->render($renderable);
|
||||
$messagehtml = $htmlrenderer->render($renderable);
|
||||
foreach ($teachers as $teacher) {
|
||||
email_to_user($teacher, fullname($userfrom), html_entity_decode($subject), $message, $messagehtml,
|
||||
$tempfile, $filename);
|
||||
email_to_user($teacher, fullname($userfrom), $subject, $message, $messagehtml, $tempfile,
|
||||
$filename);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -245,8 +242,8 @@ class email_certificate_task extends \core\task\scheduled_task {
|
|||
$emailuser = new \stdClass();
|
||||
$emailuser->id = -1;
|
||||
$emailuser->email = $email;
|
||||
email_to_user($emailuser, fullname($userfrom), html_entity_decode($subject), $message,
|
||||
$messagehtml, $tempfile, $filename);
|
||||
email_to_user($emailuser, fullname($userfrom), $subject, $message, $messagehtml, $tempfile,
|
||||
$filename);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,19 +18,13 @@
|
|||
* Class represents a customcert template.
|
||||
*
|
||||
* @package mod_customcert
|
||||
* @copyright 2016 Mark Nelson <markn@moodle.com>, 2022 Kumi Systems e.U. <office@kumi.systems>
|
||||
* @copyright 2016 Mark Nelson <markn@moodle.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
namespace mod_customcert;
|
||||
|
||||
error_reporting(E_ALL);
|
||||
require_once(__DIR__ . "/../vendor/autoload.php");
|
||||
require_once($CFG->dirroot.'/user/profile/lib.php');
|
||||
|
||||
use mikehaertl\wkhtmlto\Pdf;
|
||||
|
||||
#defined('MOODLE_INTERNAL') || die();
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
/**
|
||||
* Class represents a customcert template.
|
||||
|
@ -56,8 +50,6 @@ class template {
|
|||
*/
|
||||
protected $contextid;
|
||||
|
||||
protected $html;
|
||||
|
||||
/**
|
||||
* The constructor.
|
||||
*
|
||||
|
@ -67,7 +59,6 @@ class template {
|
|||
$this->id = $template->id;
|
||||
$this->name = $template->name;
|
||||
$this->contextid = $template->contextid;
|
||||
$this->html = $template->html;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -263,7 +254,7 @@ class template {
|
|||
* @return string|void Can return the PDF in string format if specified.
|
||||
*/
|
||||
public function generate_pdf(bool $preview = false, int $userid = null, bool $return = false) {
|
||||
global $CFG, $DB, $USER, $SITE;
|
||||
global $CFG, $DB, $USER;
|
||||
|
||||
if (empty($userid)) {
|
||||
$user = $USER;
|
||||
|
@ -273,8 +264,6 @@ class template {
|
|||
|
||||
require_once($CFG->libdir . '/pdflib.php');
|
||||
|
||||
profile_load_data($user);
|
||||
|
||||
// Get the pages for the template, there should always be at least one page for each template.
|
||||
if ($pages = $DB->get_records('customcert_pages', array('templateid' => $this->id), 'sequence ASC')) {
|
||||
// Create the pdf object.
|
||||
|
@ -294,13 +283,12 @@ class template {
|
|||
$deliveryoption = $customcert->deliveryoption;
|
||||
}
|
||||
|
||||
// Remove full-stop at the end, if it exists, to avoid "..pdf" being created and being filtered by clean_filename.
|
||||
$filename = rtrim(format_string($this->name, true, ['context' => $this->get_context()]), '.');
|
||||
|
||||
$pdf->setPrintHeader(false);
|
||||
$pdf->setPrintFooter(false);
|
||||
$pdf->SetTitle($filename);
|
||||
$pdf->SetTitle($this->name);
|
||||
$pdf->SetAutoPageBreak(true, 0);
|
||||
// Remove full-stop at the end, if it exists, to avoid "..pdf" being created and being filtered by clean_filename.
|
||||
$filename = rtrim($this->name, '.');
|
||||
|
||||
// This is the logic the TCPDF library uses when processing the name. This makes names
|
||||
// such as 'الشهادة' become empty, so set a default name in these cases.
|
||||
|
@ -321,70 +309,6 @@ class template {
|
|||
$orientation = 'P';
|
||||
}
|
||||
$pdf->AddPage($orientation, array($page->width, $page->height));
|
||||
|
||||
if ($this->html) {
|
||||
$pdf = new Pdf(array(
|
||||
"disable-smart-shrinking",
|
||||
"margin-bottom" => "0",
|
||||
"margin-right" => "0",
|
||||
"margin-left" => "0",
|
||||
"margin-top" => "0"
|
||||
));
|
||||
$html = $this->html;
|
||||
|
||||
$context = \context_user::instance($user->id);
|
||||
$fs = get_file_storage();
|
||||
$files = $fs->get_area_files($context->id, 'user', 'icon', 0);
|
||||
|
||||
$file = null;
|
||||
$content = "";
|
||||
foreach ($files as $filefound) {
|
||||
if (!$filefound->is_directory()) {
|
||||
$file = $filefound;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ($file) {
|
||||
$location = make_request_directory() . '/target';
|
||||
$content = $file->get_content();
|
||||
} else if ($preview) {
|
||||
}
|
||||
$html = str_replace("__PROFILEPIC__", 'data: ' . mime_content_type($file) . ';base64,' . $content, $html);
|
||||
|
||||
$html = str_replace("__NAME__", $user->firstname . " " . $user->lastname, $html);
|
||||
|
||||
if ($preview) {
|
||||
$code = \mod_customcert\certificate::generate_code();
|
||||
} else {
|
||||
$issue = $DB->get_record('customcert_issues', array('userid' => $user->id, 'customcertid' => $customcert->id),
|
||||
'*', IGNORE_MULTIPLE);
|
||||
$code = $issue->code;
|
||||
}
|
||||
|
||||
$html = str_replace("__CERTNUM__", $code, $html);
|
||||
|
||||
if ($preview) {
|
||||
$courseid = $SITE->id;
|
||||
} else {
|
||||
$courseid = $customcert->course;
|
||||
}
|
||||
|
||||
$course = get_course($courseid);
|
||||
$coursename = $course->fullname;
|
||||
|
||||
$html = str_replace("__COURSE__", $coursename, $html);
|
||||
|
||||
$date = $issue->timecreated;
|
||||
|
||||
$html = str_replace("__DATE__", userdate($date, '%B %d, %Y'), $html);
|
||||
|
||||
$html = str_replace("__PIN__", $user->username, $html);
|
||||
|
||||
$pdf->addPage($html);
|
||||
$pdf->send();
|
||||
die($pdf->getError());
|
||||
} else {
|
||||
$pdf->SetMargins($page->leftmargin, 0, $page->rightmargin);
|
||||
// Get the elements for the page.
|
||||
if ($elements = $DB->get_records('customcert_elements', array('pageid' => $page->id), 'sequence ASC')) {
|
||||
|
@ -397,17 +321,14 @@ class template {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($return && !$this->html) {
|
||||
if ($return) {
|
||||
return $pdf->Output('', 'S');
|
||||
}
|
||||
|
||||
if (!$this->html) {
|
||||
$pdf->Output($filename, $deliveryoption);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles copying this template into another.
|
||||
|
@ -417,10 +338,6 @@ class template {
|
|||
public function copy_to_template($copytotemplateid) {
|
||||
global $DB;
|
||||
|
||||
$copytotemplate = $DB->get_record('customcert_templates', array('id' => $copytotemplateid));
|
||||
$copytotemplate->html = $this->html;
|
||||
$DB->update_record('customcert_templates', $copytotemplate);
|
||||
|
||||
// Get the pages for the template, there should always be at least one page for each template.
|
||||
if ($templatepages = $DB->get_records('customcert_pages', array('templateid' => $this->id))) {
|
||||
// Loop through the pages.
|
||||
|
@ -513,10 +430,6 @@ class template {
|
|||
return $this->name;
|
||||
}
|
||||
|
||||
public function get_html() {
|
||||
return $this->html;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the context id.
|
||||
*
|
||||
|
|
|
@ -2,8 +2,7 @@
|
|||
"name": "mdjnelson/moodle-mod_customcert",
|
||||
"type": "moodle-mod",
|
||||
"require": {
|
||||
"composer/installers": "~1.0",
|
||||
"mikehaertl/phpwkhtmltopdf": "^2.5"
|
||||
"composer/installers": "~1.0"
|
||||
},
|
||||
"extra": {
|
||||
"installer-name": "customcert"
|
||||
|
|
311
composer.lock
generated
311
composer.lock
generated
|
@ -1,311 +0,0 @@
|
|||
{
|
||||
"_readme": [
|
||||
"This file locks the dependencies of your project to a known state",
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "749e39445f7c33f767b710400da4e9c6",
|
||||
"packages": [
|
||||
{
|
||||
"name": "composer/installers",
|
||||
"version": "v1.12.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/composer/installers.git",
|
||||
"reference": "d20a64ed3c94748397ff5973488761b22f6d3f19"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/composer/installers/zipball/d20a64ed3c94748397ff5973488761b22f6d3f19",
|
||||
"reference": "d20a64ed3c94748397ff5973488761b22f6d3f19",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"composer-plugin-api": "^1.0 || ^2.0"
|
||||
},
|
||||
"replace": {
|
||||
"roundcube/plugin-installer": "*",
|
||||
"shama/baton": "*"
|
||||
},
|
||||
"require-dev": {
|
||||
"composer/composer": "1.6.* || ^2.0",
|
||||
"composer/semver": "^1 || ^3",
|
||||
"phpstan/phpstan": "^0.12.55",
|
||||
"phpstan/phpstan-phpunit": "^0.12.16",
|
||||
"symfony/phpunit-bridge": "^4.2 || ^5",
|
||||
"symfony/process": "^2.3"
|
||||
},
|
||||
"type": "composer-plugin",
|
||||
"extra": {
|
||||
"class": "Composer\\Installers\\Plugin",
|
||||
"branch-alias": {
|
||||
"dev-main": "1.x-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Composer\\Installers\\": "src/Composer/Installers"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Kyle Robinson Young",
|
||||
"email": "kyle@dontkry.com",
|
||||
"homepage": "https://github.com/shama"
|
||||
}
|
||||
],
|
||||
"description": "A multi-framework Composer library installer",
|
||||
"homepage": "https://composer.github.io/installers/",
|
||||
"keywords": [
|
||||
"Craft",
|
||||
"Dolibarr",
|
||||
"Eliasis",
|
||||
"Hurad",
|
||||
"ImageCMS",
|
||||
"Kanboard",
|
||||
"Lan Management System",
|
||||
"MODX Evo",
|
||||
"MantisBT",
|
||||
"Mautic",
|
||||
"Maya",
|
||||
"OXID",
|
||||
"Plentymarkets",
|
||||
"Porto",
|
||||
"RadPHP",
|
||||
"SMF",
|
||||
"Starbug",
|
||||
"Thelia",
|
||||
"Whmcs",
|
||||
"WolfCMS",
|
||||
"agl",
|
||||
"aimeos",
|
||||
"annotatecms",
|
||||
"attogram",
|
||||
"bitrix",
|
||||
"cakephp",
|
||||
"chef",
|
||||
"cockpit",
|
||||
"codeigniter",
|
||||
"concrete5",
|
||||
"croogo",
|
||||
"dokuwiki",
|
||||
"drupal",
|
||||
"eZ Platform",
|
||||
"elgg",
|
||||
"expressionengine",
|
||||
"fuelphp",
|
||||
"grav",
|
||||
"installer",
|
||||
"itop",
|
||||
"joomla",
|
||||
"known",
|
||||
"kohana",
|
||||
"laravel",
|
||||
"lavalite",
|
||||
"lithium",
|
||||
"magento",
|
||||
"majima",
|
||||
"mako",
|
||||
"mediawiki",
|
||||
"miaoxing",
|
||||
"modulework",
|
||||
"modx",
|
||||
"moodle",
|
||||
"osclass",
|
||||
"pantheon",
|
||||
"phpbb",
|
||||
"piwik",
|
||||
"ppi",
|
||||
"processwire",
|
||||
"puppet",
|
||||
"pxcms",
|
||||
"reindex",
|
||||
"roundcube",
|
||||
"shopware",
|
||||
"silverstripe",
|
||||
"sydes",
|
||||
"sylius",
|
||||
"symfony",
|
||||
"tastyigniter",
|
||||
"typo3",
|
||||
"wordpress",
|
||||
"yawik",
|
||||
"zend",
|
||||
"zikula"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/composer/installers/issues",
|
||||
"source": "https://github.com/composer/installers/tree/v1.12.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://packagist.com",
|
||||
"type": "custom"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/composer",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/composer/composer",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2021-09-13T08:19:44+00:00"
|
||||
},
|
||||
{
|
||||
"name": "mikehaertl/php-shellcommand",
|
||||
"version": "1.6.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/mikehaertl/php-shellcommand.git",
|
||||
"reference": "3488d7803df1e8f1a343d3d0ca452d527ad8d5e5"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/mikehaertl/php-shellcommand/zipball/3488d7803df1e8f1a343d3d0ca452d527ad8d5e5",
|
||||
"reference": "3488d7803df1e8f1a343d3d0ca452d527ad8d5e5",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">= 5.3.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": ">4.0 <=9.4"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"mikehaertl\\shellcommand\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Michael Härtl",
|
||||
"email": "haertl.mike@gmail.com"
|
||||
}
|
||||
],
|
||||
"description": "An object oriented interface to shell commands",
|
||||
"keywords": [
|
||||
"shell"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/mikehaertl/php-shellcommand/issues",
|
||||
"source": "https://github.com/mikehaertl/php-shellcommand/tree/1.6.4"
|
||||
},
|
||||
"time": "2021-03-17T06:54:33+00:00"
|
||||
},
|
||||
{
|
||||
"name": "mikehaertl/php-tmpfile",
|
||||
"version": "1.2.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/mikehaertl/php-tmpfile.git",
|
||||
"reference": "70a5b70b17bc0d9666388e6a551ecc93d0b40a10"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/mikehaertl/php-tmpfile/zipball/70a5b70b17bc0d9666388e6a551ecc93d0b40a10",
|
||||
"reference": "70a5b70b17bc0d9666388e6a551ecc93d0b40a10",
|
||||
"shasum": ""
|
||||
},
|
||||
"require-dev": {
|
||||
"php": ">=5.3.0",
|
||||
"phpunit/phpunit": ">4.0 <=9.4"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"mikehaertl\\tmp\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Michael Härtl",
|
||||
"email": "haertl.mike@gmail.com"
|
||||
}
|
||||
],
|
||||
"description": "A convenience class for temporary files",
|
||||
"keywords": [
|
||||
"files"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/mikehaertl/php-tmpfile/issues",
|
||||
"source": "https://github.com/mikehaertl/php-tmpfile/tree/1.2.1"
|
||||
},
|
||||
"time": "2021-03-01T18:26:25+00:00"
|
||||
},
|
||||
{
|
||||
"name": "mikehaertl/phpwkhtmltopdf",
|
||||
"version": "2.5.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/mikehaertl/phpwkhtmltopdf.git",
|
||||
"reference": "17ee71341591415d942774eda2c98d8ba7ea9e90"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/mikehaertl/phpwkhtmltopdf/zipball/17ee71341591415d942774eda2c98d8ba7ea9e90",
|
||||
"reference": "17ee71341591415d942774eda2c98d8ba7ea9e90",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"mikehaertl/php-shellcommand": "^1.5.0",
|
||||
"mikehaertl/php-tmpfile": "^1.2.1",
|
||||
"php": ">=5.0.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": ">4.0 <9.4"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"mikehaertl\\wkhtmlto\\": "src"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Michael Haertl",
|
||||
"email": "haertl.mike@gmail.com"
|
||||
}
|
||||
],
|
||||
"description": "A slim PHP wrapper around wkhtmltopdf with an easy to use and clean OOP interface",
|
||||
"homepage": "http://mikehaertl.github.com/phpwkhtmltopdf/",
|
||||
"keywords": [
|
||||
"pdf",
|
||||
"wkhtmltoimage",
|
||||
"wkhtmltopdf"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/mikehaertl/phpwkhtmltopdf/issues",
|
||||
"source": "https://github.com/mikehaertl/phpwkhtmltopdf/tree/2.5.0"
|
||||
},
|
||||
"time": "2021-03-01T19:41:06+00:00"
|
||||
}
|
||||
],
|
||||
"packages-dev": [],
|
||||
"aliases": [],
|
||||
"minimum-stability": "stable",
|
||||
"stability-flags": [],
|
||||
"prefer-stable": false,
|
||||
"prefer-lowest": false,
|
||||
"platform": [],
|
||||
"platform-dev": [],
|
||||
"plugin-api-version": "2.0.0"
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<XMLDB PATH="mod/customcert/db" VERSION="20211105" COMMENT="XMLDB file for Moodle mod/customcert"
|
||||
<XMLDB PATH="mod/customcert/db" VERSION="20170530" COMMENT="XMLDB file for Moodle mod/customcert"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:noNamespaceSchemaLocation="../../../lib/xmldb/xmldb.xsd"
|
||||
>
|
||||
|
@ -10,7 +10,7 @@
|
|||
<FIELD NAME="course" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/>
|
||||
<FIELD NAME="templateid" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/>
|
||||
<FIELD NAME="name" TYPE="char" LENGTH="255" NOTNULL="true" SEQUENCE="false"/>
|
||||
<FIELD NAME="intro" TYPE="text" NOTNULL="false" SEQUENCE="false"/>
|
||||
<FIELD NAME="intro" TYPE="text" LENGTH="small" NOTNULL="false" SEQUENCE="false"/>
|
||||
<FIELD NAME="introformat" TYPE="int" LENGTH="4" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/>
|
||||
<FIELD NAME="requiredtime" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/>
|
||||
<FIELD NAME="verifyany" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/>
|
||||
|
@ -34,7 +34,6 @@
|
|||
<FIELD NAME="contextid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="References contextid."/>
|
||||
<FIELD NAME="timecreated" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/>
|
||||
<FIELD NAME="timemodified" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/>
|
||||
<FIELD NAME="html" TYPE="text" NOTNULL="false" SEQUENCE="false"/>
|
||||
</FIELDS>
|
||||
<KEYS>
|
||||
<KEY NAME="primary" TYPE="primary" FIELDS="id" COMMENT="Primary key for customcert_template"/>
|
||||
|
@ -78,7 +77,7 @@
|
|||
<FIELD NAME="pageid" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/>
|
||||
<FIELD NAME="name" TYPE="char" LENGTH="255" NOTNULL="true" SEQUENCE="false"/>
|
||||
<FIELD NAME="element" TYPE="char" LENGTH="255" NOTNULL="true" SEQUENCE="false"/>
|
||||
<FIELD NAME="data" TYPE="text" NOTNULL="false" SEQUENCE="false"/>
|
||||
<FIELD NAME="data" TYPE="text" LENGTH="big" NOTNULL="false" SEQUENCE="false"/>
|
||||
<FIELD NAME="font" TYPE="char" LENGTH="255" NOTNULL="false" SEQUENCE="false"/>
|
||||
<FIELD NAME="fontsize" TYPE="int" LENGTH="10" NOTNULL="false" SEQUENCE="false"/>
|
||||
<FIELD NAME="colour" TYPE="char" LENGTH="50" NOTNULL="false" SEQUENCE="false"/>
|
||||
|
@ -86,7 +85,6 @@
|
|||
<FIELD NAME="posy" TYPE="int" LENGTH="10" NOTNULL="false" SEQUENCE="false"/>
|
||||
<FIELD NAME="width" TYPE="int" LENGTH="10" NOTNULL="false" SEQUENCE="false"/>
|
||||
<FIELD NAME="refpoint" TYPE="int" LENGTH="4" NOTNULL="false" SEQUENCE="false"/>
|
||||
<FIELD NAME="alignment" TYPE="char" LENGTH="1" NOTNULL="true" DEFAULT="L" SEQUENCE="false"/>
|
||||
<FIELD NAME="sequence" TYPE="int" LENGTH="10" NOTNULL="false" SEQUENCE="false"/>
|
||||
<FIELD NAME="timecreated" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/>
|
||||
<FIELD NAME="timemodified" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/>
|
||||
|
|
|
@ -166,7 +166,7 @@ function xmldb_customcert_upgrade($oldversion) {
|
|||
upgrade_mod_savepoint(true, 2019111803, 'customcert');
|
||||
}
|
||||
|
||||
if ($oldversion < 2020110901) {
|
||||
if ($oldversion < 2019111806) {
|
||||
$table = new xmldb_table('customcert');
|
||||
$field = new xmldb_field('deliveryoption', XMLDB_TYPE_CHAR, '255', null, null, null, null, 'verifyany');
|
||||
|
||||
|
@ -175,28 +175,7 @@ function xmldb_customcert_upgrade($oldversion) {
|
|||
$dbman->add_field($table, $field);
|
||||
}
|
||||
|
||||
upgrade_mod_savepoint(true, 2020110901, 'customcert');
|
||||
}
|
||||
|
||||
if ($oldversion < 2021051702) {
|
||||
$table = new xmldb_table('customcert_elements');
|
||||
$field = new xmldb_field('alignment', XMLDB_TYPE_CHAR, '1', null, XMLDB_NOTNULL, null, 'L', 'refpoint');
|
||||
|
||||
$dbman->add_field($table, $field);
|
||||
|
||||
upgrade_mod_savepoint(true, 2021051702, 'customcert');
|
||||
}
|
||||
|
||||
if ($oldversion < 2021110501) {
|
||||
$table = new xmldb_table('customcert_templates');
|
||||
$field = new xmldb_field('html', XMLDB_TYPE_TEXT, null, null, null, null, null, 'timemodified');
|
||||
|
||||
// Conditionally launch add field html.
|
||||
if (!$dbman->field_exists($table, $field)) {
|
||||
$dbman->add_field($table, $field);
|
||||
}
|
||||
|
||||
upgrade_mod_savepoint(true, 2021110501, 'customcert');
|
||||
upgrade_mod_savepoint(true, 2019111806, 'customcert');
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
|
@ -24,6 +24,6 @@
|
|||
|
||||
defined('MOODLE_INTERNAL') || die('Direct access to this script is forbidden.');
|
||||
|
||||
$plugin->version = 2021051700; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2021051700; // Requires this Moodle version (3.11).
|
||||
$plugin->version = 2019111800; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2019111800; // Requires this Moodle version (3.8).
|
||||
$plugin->component = 'customcertelement_bgimage';
|
||||
|
|
|
@ -24,6 +24,6 @@
|
|||
|
||||
defined('MOODLE_INTERNAL') || die('Direct access to this script is forbidden.');
|
||||
|
||||
$plugin->version = 2021051700; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2021051700; // Requires this Moodle version (3.11).
|
||||
$plugin->version = 2019111800; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2019111800; // Requires this Moodle version (3.8).
|
||||
$plugin->component = 'customcertelement_border';
|
||||
|
|
|
@ -24,6 +24,6 @@
|
|||
|
||||
defined('MOODLE_INTERNAL') || die('Direct access to this script is forbidden.');
|
||||
|
||||
$plugin->version = 2021051700; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2021051700; // Requires this Moodle version (3.11).
|
||||
$plugin->version = 2019111800; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2019111800; // Requires this Moodle version (3.8).
|
||||
$plugin->component = 'customcertelement_categoryname';
|
||||
|
|
|
@ -24,6 +24,6 @@
|
|||
|
||||
defined('MOODLE_INTERNAL') || die('Direct access to this script is forbidden.');
|
||||
|
||||
$plugin->version = 2021051700; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2021051700; // Requires this Moodle version (3.11).
|
||||
$plugin->version = 2019111800; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2019111800; // Requires this Moodle version (3.8).
|
||||
$plugin->component = 'customcertelement_code';
|
||||
|
|
|
@ -25,6 +25,6 @@
|
|||
|
||||
defined('MOODLE_INTERNAL') || die('Direct access to this script is forbidden.');
|
||||
|
||||
$plugin->version = 2021051700; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2021051700; // Requires this Moodle version (3.11).
|
||||
$plugin->version = 2019111800; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2019111800; // Requires this Moodle version (3.8).
|
||||
$plugin->component = 'customcertelement_coursefield';
|
||||
|
|
|
@ -35,42 +35,6 @@ defined('MOODLE_INTERNAL') || die();
|
|||
*/
|
||||
class element extends \mod_customcert\element {
|
||||
|
||||
/**
|
||||
* The course short name.
|
||||
*/
|
||||
const COURSE_SHORT_NAME = 1;
|
||||
|
||||
/**
|
||||
* The course fullname.
|
||||
*/
|
||||
const COURSE_FULL_NAME = 2;
|
||||
|
||||
/**
|
||||
* This function renders the form elements when adding a customcert element.
|
||||
*
|
||||
* @param \MoodleQuickForm $mform the edit_form instance
|
||||
*/
|
||||
public function render_form_elements($mform) {
|
||||
// The course name display options.
|
||||
$mform->addElement('select', 'coursenamedisplay', get_string('coursenamedisplay', 'customcertelement_coursename'),
|
||||
self::get_course_name_display_options());
|
||||
$mform->setType('coursenamedisplay', PARAM_INT);
|
||||
$mform->addHelpButton('coursenamedisplay', 'coursenamedisplay', 'customcertelement_coursename');
|
||||
|
||||
parent::render_form_elements($mform);
|
||||
}
|
||||
|
||||
/**
|
||||
* This will handle how form data will be saved into the data column in the
|
||||
* customcert_elements table.
|
||||
*
|
||||
* @param \stdClass $data the form data
|
||||
* @return string the text
|
||||
*/
|
||||
public function save_unique_data($data) {
|
||||
return $data->coursenamedisplay;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles rendering the element on the pdf.
|
||||
*
|
||||
|
@ -79,7 +43,7 @@ class element extends \mod_customcert\element {
|
|||
* @param \stdClass $user the user we are rendering this for
|
||||
*/
|
||||
public function render($pdf, $preview, $user) {
|
||||
\mod_customcert\element_helper::render_content($pdf, $this, $this->get_course_name_detail());
|
||||
\mod_customcert\element_helper::render_content($pdf, $this, $this->get_course_name());
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -91,52 +55,19 @@ class element extends \mod_customcert\element {
|
|||
* @return string the html
|
||||
*/
|
||||
public function render_html() {
|
||||
return \mod_customcert\element_helper::render_html_content($this, $this->get_course_name_detail());
|
||||
return \mod_customcert\element_helper::render_html_content($this, $this->get_course_name());
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the data on the form when editing an element.
|
||||
*
|
||||
* @param \MoodleQuickForm $mform the edit_form instance
|
||||
*/
|
||||
public function definition_after_data($mform) {
|
||||
if (!empty($this->get_data())) {
|
||||
$element = $mform->getElement('coursenamedisplay');
|
||||
$element->setValue($this->get_data());
|
||||
}
|
||||
parent::definition_after_data($mform);
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper function that returns the selected course name detail (i.e. name or short description) for display.
|
||||
* Helper function that returns the category name.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function get_course_name_detail(): string {
|
||||
protected function get_course_name() : string {
|
||||
$courseid = \mod_customcert\element_helper::get_courseid($this->get_id());
|
||||
$course = get_course($courseid);
|
||||
$context = \mod_customcert\element_helper::get_context($this->get_id());
|
||||
|
||||
// The name field to display.
|
||||
$field = $this->get_data();
|
||||
// The name value to display.
|
||||
$value = $course->fullname;
|
||||
if ($field == self::COURSE_SHORT_NAME) {
|
||||
$value = $course->shortname;
|
||||
}
|
||||
|
||||
return format_string($value, true, ['context' => $context]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper function to return all the possible name display options.
|
||||
*
|
||||
* @return array returns an array of name options
|
||||
*/
|
||||
public static function get_course_name_display_options(): array {
|
||||
return [
|
||||
self::COURSE_FULL_NAME => get_string('coursefullname', 'customcertelement_coursename'),
|
||||
self::COURSE_SHORT_NAME => get_string('courseshortname', 'customcertelement_coursename')
|
||||
];
|
||||
return format_string($course->fullname, true, ['context' => $context]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -22,10 +22,5 @@
|
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
$string['coursenamedisplay'] = 'Type';
|
||||
$string['coursenamedisplay_help'] = 'Display the course full name or short name?';
|
||||
$string['coursefullname'] = 'Full name';
|
||||
$string['courseshortname'] = 'Short name';
|
||||
$string['pluginname'] = 'Course name';
|
||||
$string['privacy:metadata'] = 'The Course name plugin does not store any personal data.';
|
||||
|
||||
|
|
|
@ -24,6 +24,6 @@
|
|||
|
||||
defined('MOODLE_INTERNAL') || die('Direct access to this script is forbidden.');
|
||||
|
||||
$plugin->version = 2021051700; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2021051700; // Requires this Moodle version (3.11).
|
||||
$plugin->version = 2019111800; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2019111800; // Requires this Moodle version (3.8).
|
||||
$plugin->component = 'customcertelement_coursename';
|
||||
|
|
|
@ -24,6 +24,6 @@
|
|||
|
||||
defined('MOODLE_INTERNAL') || die('Direct access to this script is forbidden.');
|
||||
|
||||
$plugin->version = 2021051700; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2021051700; // Requires this Moodle version (3.11).
|
||||
$plugin->version = 2019111801; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2019111800; // Requires this Moodle version (3.8).
|
||||
$plugin->component = 'customcertelement_date';
|
||||
|
|
|
@ -24,6 +24,6 @@
|
|||
|
||||
defined('MOODLE_INTERNAL') || die('Direct access to this script is forbidden.');
|
||||
|
||||
$plugin->version = 2021051700; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2021051700; // Requires this Moodle version (3.11).
|
||||
$plugin->version = 2019111800; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2019111800; // Requires this Moodle version (3.8).
|
||||
$plugin->component = 'customcertelement_daterange';
|
||||
|
|
|
@ -24,6 +24,6 @@
|
|||
|
||||
defined('MOODLE_INTERNAL') || die('Direct access to this script is forbidden.');
|
||||
|
||||
$plugin->version = 2021051700; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2021051700; // Requires this Moodle version (3.11).
|
||||
$plugin->version = 2019111800; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2019111800; // Requires this Moodle version (3.8).
|
||||
$plugin->component = 'customcertelement_digitalsignature';
|
||||
|
|
|
@ -24,6 +24,6 @@
|
|||
|
||||
defined('MOODLE_INTERNAL') || die('Direct access to this script is forbidden.');
|
||||
|
||||
$plugin->version = 2021051700; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2021051700; // Requires this Moodle version (3.11).
|
||||
$plugin->version = 2019111800; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2019111800; // Requires this Moodle version (3.8).
|
||||
$plugin->component = 'customcertelement_grade';
|
||||
|
|
|
@ -24,6 +24,6 @@
|
|||
|
||||
defined('MOODLE_INTERNAL') || die('Direct access to this script is forbidden.');
|
||||
|
||||
$plugin->version = 2021051700; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2021051700; // Requires this Moodle version (3.11).
|
||||
$plugin->version = 2019111800; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2019111800; // Requires this Moodle version (3.8).
|
||||
$plugin->component = 'customcertelement_gradeitemname';
|
||||
|
|
|
@ -24,6 +24,6 @@
|
|||
|
||||
defined('MOODLE_INTERNAL') || die('Direct access to this script is forbidden.');
|
||||
|
||||
$plugin->version = 2021051700; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2021051700; // Requires this Moodle version (3.11).
|
||||
$plugin->version = 2019111800; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2019111800; // Requires this Moodle version (3.8).
|
||||
$plugin->component = 'customcertelement_image';
|
||||
|
|
|
@ -24,6 +24,6 @@
|
|||
|
||||
defined('MOODLE_INTERNAL') || die('Direct access to this script is forbidden.');
|
||||
|
||||
$plugin->version = 2021051700; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2021051700; // Requires this Moodle version (3.11).
|
||||
$plugin->version = 2019111800; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2019111800; // Requires this Moodle version (3.8).
|
||||
$plugin->component = 'customcertelement_qrcode';
|
||||
|
|
|
@ -24,6 +24,6 @@
|
|||
|
||||
defined('MOODLE_INTERNAL') || die('Direct access to this script is forbidden.');
|
||||
|
||||
$plugin->version = 2021051700; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2021051700; // Requires this Moodle version (3.11).
|
||||
$plugin->version = 2019111800; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2019111800; // Requires this Moodle version (3.8).
|
||||
$plugin->component = 'customcertelement_studentname';
|
||||
|
|
|
@ -24,6 +24,6 @@
|
|||
|
||||
defined('MOODLE_INTERNAL') || die('Direct access to this script is forbidden.');
|
||||
|
||||
$plugin->version = 2021051700; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2021051700; // Requires this Moodle version (3.11).
|
||||
$plugin->version = 2019111800; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2019111800; // Requires this Moodle version (3.8).
|
||||
$plugin->component = 'customcertelement_teachername';
|
||||
|
|
|
@ -24,6 +24,6 @@
|
|||
|
||||
defined('MOODLE_INTERNAL') || die('Direct access to this script is forbidden.');
|
||||
|
||||
$plugin->version = 2021051700; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2021051700; // Requires this Moodle version (3.11).
|
||||
$plugin->version = 2019111800; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2019111800; // Requires this Moodle version (3.8).
|
||||
$plugin->component = 'customcertelement_text';
|
||||
|
|
|
@ -24,8 +24,6 @@
|
|||
|
||||
namespace customcertelement_userfield;
|
||||
|
||||
use core_user\fields;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
/**
|
||||
|
@ -45,20 +43,24 @@ class element extends \mod_customcert\element {
|
|||
public function render_form_elements($mform) {
|
||||
// Get the user profile fields.
|
||||
$userfields = array(
|
||||
'firstname' => fields::get_display_name('firstname'),
|
||||
'lastname' => fields::get_display_name('lastname'),
|
||||
'username' => fields::get_display_name('username'),
|
||||
'email' => fields::get_display_name('email'),
|
||||
'city' => fields::get_display_name('city'),
|
||||
'country' => fields::get_display_name('country'),
|
||||
'url' => fields::get_display_name('url'),
|
||||
'skype' => fields::get_display_name('skype'),
|
||||
'idnumber' => fields::get_display_name('idnumber'),
|
||||
'institution' => fields::get_display_name('institution'),
|
||||
'department' => fields::get_display_name('department'),
|
||||
'phone1' => fields::get_display_name('phone1'),
|
||||
'phone2' => fields::get_display_name('phone2'),
|
||||
'address' => fields::get_display_name('address')
|
||||
'firstname' => get_user_field_name('firstname'),
|
||||
'lastname' => get_user_field_name('lastname'),
|
||||
'username' => get_user_field_name('username'),
|
||||
'email' => get_user_field_name('email'),
|
||||
'city' => get_user_field_name('city'),
|
||||
'country' => get_user_field_name('country'),
|
||||
'url' => get_user_field_name('url'),
|
||||
'icq' => get_user_field_name('icq'),
|
||||
'skype' => get_user_field_name('skype'),
|
||||
'aim' => get_user_field_name('aim'),
|
||||
'yahoo' => get_user_field_name('yahoo'),
|
||||
'msn' => get_user_field_name('msn'),
|
||||
'idnumber' => get_user_field_name('idnumber'),
|
||||
'institution' => get_user_field_name('institution'),
|
||||
'department' => get_user_field_name('department'),
|
||||
'phone1' => get_user_field_name('phone1'),
|
||||
'phone2' => get_user_field_name('phone2'),
|
||||
'address' => get_user_field_name('address')
|
||||
);
|
||||
// Get the user custom fields.
|
||||
$arrcustomfields = \availability_profile\condition::get_custom_profile_fields();
|
||||
|
|
|
@ -24,6 +24,6 @@
|
|||
|
||||
defined('MOODLE_INTERNAL') || die('Direct access to this script is forbidden.');
|
||||
|
||||
$plugin->version = 2021051700; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2021051700; // Requires this Moodle version (3.11).
|
||||
$plugin->version = 2019111800; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2019111800; // Requires this Moodle version (3.8).
|
||||
$plugin->component = 'customcertelement_userfield';
|
||||
|
|
|
@ -24,6 +24,6 @@
|
|||
|
||||
defined('MOODLE_INTERNAL') || die('Direct access to this script is forbidden.');
|
||||
|
||||
$plugin->version = 2021051700; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2021051700; // Requires this Moodle version (3.11).
|
||||
$plugin->version = 2019111800; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2019111800; // Requires this Moodle version (3.8).
|
||||
$plugin->component = 'customcertelement_userpicture';
|
||||
|
|
|
@ -25,11 +25,6 @@
|
|||
$string['activity'] = 'Activity';
|
||||
$string['addcertpage'] = 'Add page';
|
||||
$string['addelement'] = 'Add element';
|
||||
$string['aligncenter'] = 'Centered';
|
||||
$string['alignleft'] = 'Left alignment';
|
||||
$string['alignment'] = 'Alignment';
|
||||
$string['alignment_help'] = 'This property sets the horizontal alignment of the element. Some elements may not support this, while the behaviour of others may differ.';
|
||||
$string['alignright'] = 'Right alignment';
|
||||
$string['awardedto'] = 'Awarded to';
|
||||
$string['cannotverifyallcertificates'] = 'You do not have the permission to verify all certificates on the site.';
|
||||
$string['certificate'] = 'Certificate';
|
||||
|
|
|
@ -1,57 +0,0 @@
|
|||
<?php
|
||||
// This file is part of the customcert module for Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
define('CLI_SCRIPT', true);
|
||||
require_once('../../config.php');
|
||||
|
||||
$tid = $argv[1];
|
||||
$ltid = $argv[2];
|
||||
|
||||
$template = $DB->get_record('customcert_templates', array('id' => $tid), '*', MUST_EXIST);
|
||||
$template = new \mod_customcert\template($template);
|
||||
|
||||
$loadtemplate = $DB->get_record('customcert_templates', array('id' => $ltid), '*', MUST_EXIST);
|
||||
$loadtemplate = new \mod_customcert\template($loadtemplate);
|
||||
|
||||
$cm = $template->get_cm();
|
||||
|
||||
if ($template->get_context()->contextlevel == CONTEXT_MODULE) {
|
||||
$customcert = $DB->get_record('customcert', ['id' => $cm->instance], '*', MUST_EXIST);
|
||||
$title = $customcert->name;
|
||||
$heading = format_string($title);
|
||||
} else {
|
||||
$title = $SITE->fullname;
|
||||
$heading = $title;
|
||||
}
|
||||
|
||||
$sql = "SELECT e.*
|
||||
FROM {customcert_elements} e
|
||||
INNER JOIN {customcert_pages} p
|
||||
ON e.pageid = p.id
|
||||
WHERE p.templateid = :templateid";
|
||||
|
||||
if ($elements = $DB->get_records_sql($sql, array('templateid' => $template->get_id()))) {
|
||||
foreach ($elements as $element) {
|
||||
if ($e = \mod_customcert\element_factory::get_element_instance($element)) {
|
||||
$e->delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$DB->delete_records('customcert_pages', array('templateid' => $template->get_id()));
|
||||
|
||||
$loadtemplate->copy_to_template($template->get_id());
|
||||
|
|
@ -47,6 +47,7 @@ require_login();
|
|||
require_capability('mod/customcert:manage', $context);
|
||||
|
||||
$title = $SITE->fullname;
|
||||
$heading = $title;
|
||||
|
||||
// Set up the page.
|
||||
$pageurl = new moodle_url('/mod/customcert/manage_templates.php');
|
||||
|
@ -60,8 +61,6 @@ if ($tid && $action && confirm_sesskey()) {
|
|||
$PAGE->navbar->add(get_string('managetemplates', 'customcert'));
|
||||
}
|
||||
|
||||
$heading = format_string($title, true, ['context' => $context]);
|
||||
|
||||
if ($tid) {
|
||||
if ($action && confirm_sesskey()) {
|
||||
$nourl = new moodle_url('/mod/customcert/manage_templates.php');
|
||||
|
|
|
@ -112,18 +112,6 @@ if ($elements) {
|
|||
default:
|
||||
$class = 'element refpoint-left';
|
||||
}
|
||||
switch ($element->alignment) {
|
||||
case \mod_customcert\element::ALIGN_CENTER:
|
||||
$class .= ' align-center';
|
||||
break;
|
||||
case \mod_customcert\element::ALIGN_RIGHT:
|
||||
$class .= ' align-right';
|
||||
break;
|
||||
case \mod_customcert\element::ALIGN_LEFT:
|
||||
default:
|
||||
$class .= ' align-left';
|
||||
break;
|
||||
}
|
||||
$html .= html_writer::tag('div', $e->render_html(), array('class' => $class,
|
||||
'data-refpoint' => $element->refpoint, 'id' => 'element-' . $element->id));
|
||||
}
|
||||
|
|
12
styles.css
12
styles.css
|
@ -57,18 +57,6 @@
|
|||
margin: -4px -5px -5px 4px;
|
||||
}
|
||||
|
||||
#page-mod-customcert-rearrange .element.align-left {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
#page-mod-customcert-rearrange .element.align-center {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#page-mod-customcert-rearrange .element.align-right {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
#page-mod-customcert-rearrange #pdf {
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
|
|
|
@ -1,169 +0,0 @@
|
|||
{{!
|
||||
This file is part of Moodle - http://moodle.org/
|
||||
|
||||
Moodle is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Moodle is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
}}
|
||||
{{!
|
||||
@template mod_customcert/mobile_view_activity_page
|
||||
|
||||
The main page to view the custom certificate activity
|
||||
|
||||
Classes required for JS:
|
||||
* None
|
||||
|
||||
Data attibutes required for JS:
|
||||
* All data attributes are required
|
||||
|
||||
Context variables required for this template:
|
||||
* certificate
|
||||
* cmid
|
||||
* hasissues
|
||||
* issues
|
||||
* showgroups
|
||||
* groups
|
||||
* canmanage
|
||||
* requiredtimemet
|
||||
* hasrecipients
|
||||
* recipients
|
||||
* fileurl
|
||||
* showreport
|
||||
* currenttimestamp
|
||||
|
||||
Example context (json):
|
||||
{
|
||||
"certificate": {
|
||||
"id": "1",
|
||||
"course": "2",
|
||||
"name": "A rad certificate name!",
|
||||
"intro": "A certificate",
|
||||
"requiredtime": "60"
|
||||
},
|
||||
"cmid": "25",
|
||||
"issue": {
|
||||
"timecreated": "1528370177"
|
||||
},
|
||||
"showgroups": "true",
|
||||
"groups": [
|
||||
{
|
||||
"id": "2",
|
||||
"selected": "false",
|
||||
"name": "Group A"
|
||||
}
|
||||
],
|
||||
"canmanage": "true",
|
||||
"requiredtimemet": "true",
|
||||
"fileurl": "http://yoursite.com/mod/customcert/mobile/pluginfile.php?id=4",
|
||||
"showreport": "true",
|
||||
"hasrecipients": "true",
|
||||
"recipients": [
|
||||
{
|
||||
"id": "2",
|
||||
"issueid": "3",
|
||||
"displayname": "Michaelangelo (Mickey)",
|
||||
"fileurl": "http://yoursite.com/mod/customcert/mobile/pluginfile.php?id=4",
|
||||
"timecreated": "1528370177"
|
||||
}
|
||||
],
|
||||
"currenttimestamp": "1528370177"
|
||||
}
|
||||
}}
|
||||
{{=<% %>=}}
|
||||
<core-course-module-description description="<% certificate.intro %>" component="mod_customcert" componentId="<% cmid %>"></core-course-module-description>
|
||||
<ion-list>
|
||||
<%^canmanage%>
|
||||
<%#requiredtimemet%>
|
||||
<ion-item>
|
||||
<ion-label>
|
||||
{{ 'plugin.mod_customcert.receiveddate' | translate }}
|
||||
<br />
|
||||
<div class="timerewarded">
|
||||
<%#issue%>
|
||||
{{ <% timecreated %> | coreToLocaleString }}
|
||||
<%/issue%>
|
||||
<%^issue%>
|
||||
{{ 'plugin.mod_customcert.notissued' | translate }}
|
||||
<%/issue%>
|
||||
</div>
|
||||
</ion-label>
|
||||
<div slot="end" class="flex-row">
|
||||
<ion-button fill="clear" [core-download-file]="{fileurl: '<% fileurl %>', timemodified: '<% currenttimestamp %>'}" moduleId="<% cmid %>" courseId="<% certificate.course %>" component="mod_customcert" [attr.aria-label]="'core.download' | translate">
|
||||
<ion-icon name="cloud-download" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||
</ion-button>
|
||||
</div>
|
||||
</ion-item>
|
||||
<%/requiredtimemet%>
|
||||
<%^requiredtimemet%>
|
||||
<ion-item>
|
||||
<ion-label>
|
||||
<p>{{ 'plugin.mod_customcert.requiredtimenotmet' | translate: {$a: { requiredtime: <% certificate.requiredtime %>} } }}</p>
|
||||
</ion-label>
|
||||
</ion-item>
|
||||
<%/requiredtimemet%>
|
||||
<%/canmanage%>
|
||||
<%#canmanage%>
|
||||
<ion-button expand="block" class="ion-margin" core-course-download-module-main-file moduleId="<% cmid %>" courseId="<% certificate.course %>" component="mod_customcert" [files]="[{fileurl: '<% fileurl %>', timemodified: '<% currenttimestamp %>'}]">
|
||||
<ion-icon name="cloud-download" slot="start" aria-hidden="true"></ion-icon>
|
||||
{{ 'plugin.mod_customcert.getcustomcert' | translate }}
|
||||
</ion-button>
|
||||
<%/canmanage%>
|
||||
<%#showreport%>
|
||||
<ion-item>
|
||||
<ion-label>
|
||||
{{ 'plugin.mod_customcert.listofissues' | translate: { $a: <% numrecipients %> } }}
|
||||
</ion-label>
|
||||
</ion-item>
|
||||
<%#showgroups%>
|
||||
<ion-item>
|
||||
<ion-label>{{ 'plugin.mod_customcert.selectagroup' | translate }}</ion-label>
|
||||
<ion-select [(ngModel)]="CONTENT_OTHERDATA.group" name="group" (ionChange)="updateContent({cmid: <% cmid %>, courseid: <% certificate.course %>, group: CONTENT_OTHERDATA.group})" interface="popover">
|
||||
<%#groups%>
|
||||
<ion-select-option [value]="<% id %>"><% name %></ion-select-option>
|
||||
<%/groups%>
|
||||
</ion-select>
|
||||
</ion-item>
|
||||
<%/showgroups%>
|
||||
<%#hasrecipients%>
|
||||
<%#recipients%>
|
||||
<ion-item>
|
||||
<ion-label>
|
||||
<% displayname %>
|
||||
<br />
|
||||
<div class="timerewarded">{{ <% timecreated %> | coreToLocaleString }}</div>
|
||||
</ion-label>
|
||||
<div slot="end" class="flex-row">
|
||||
<ion-button fill="clear" [core-download-file]="{fileurl: '<% fileurl %>', timemodified: '<% currenttimestamp %>'}" moduleId="<% cmid %>" courseId="<% certificate.course %>" component="mod_customcert" [attr.aria-label]="'core.download' | translate">
|
||||
<ion-icon name="cloud-download" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||
</ion-button>
|
||||
<%#canmanage%>
|
||||
<ion-button fill="clear" core-site-plugins-call-ws name="mod_customcert_delete_issue"
|
||||
[params]="{certificateid: <% certificate.id %>, issueid: <% issueid %>}"
|
||||
[preSets]="{getFromCache: 0, saveToCache: 0, typeExpected: 'boolean'}"
|
||||
confirmMessage="{{ 'plugin.mod_customcert.deleteissueconfirm' | translate }}"
|
||||
refreshOnSuccess="true" [attr.aria-label]="'core.delete' | translate">
|
||||
<ion-icon name="fas-trash" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||
</ion-button>
|
||||
<%/canmanage%>
|
||||
</div>
|
||||
</ion-item>
|
||||
<%/recipients%>
|
||||
<%/hasrecipients%>
|
||||
<%^hasrecipients%>
|
||||
<ion-item>
|
||||
<ion-label>
|
||||
{{ 'plugin.mod_customcert.nothingtodisplay' | translate }}
|
||||
</ion-label>
|
||||
</ion-item>
|
||||
<%/hasrecipients%>
|
||||
<%/showreport%>
|
||||
</ion-list>
|
|
@ -8,9 +8,11 @@ Feature: Being able to correctly display options on the certificate activity edi
|
|||
And the following "users" exist:
|
||||
| username | firstname | lastname | email |
|
||||
| teacher1 | Teacher | 1 | teacher1@example.com |
|
||||
| manager1 | Manager | 1 | Manager1@example.com |
|
||||
And the following "course enrolments" exist:
|
||||
| user | course | role |
|
||||
| teacher1 | C1 | editingteacher |
|
||||
| manager1 | C1 | manager |
|
||||
And the following "activities" exist:
|
||||
| activity | name | intro | course | idnumber |
|
||||
| customcert | Custom certificate 1 | Custom certificate 1 intro | C1 | customcert1 |
|
||||
|
@ -27,7 +29,40 @@ Feature: Being able to correctly display options on the certificate activity edi
|
|||
And I should see "Required minutes in course"
|
||||
And I should see "Set protection"
|
||||
|
||||
@javascript
|
||||
Scenario: Create an activity as an Editing Teacher I can see all custom certificate options
|
||||
And I log in as "teacher1"
|
||||
And I am on "Course 1" course homepage with editing mode on
|
||||
And I add a "Custom certificate" to section "1"
|
||||
And I should see "Email students"
|
||||
And I should see "Email teachers"
|
||||
And I should see "Email others"
|
||||
And I should see "Allow anyone to verify a certificate"
|
||||
And I should see "Required minutes in course"
|
||||
And I should see "Set protection"
|
||||
|
||||
Scenario: Add an activity as a Manager I can see all custom certificate options
|
||||
And I log in as "manager1"
|
||||
And I am on "Course 1" course homepage with editing mode on
|
||||
And I add a "Custom certificate" to section "1"
|
||||
And I should see "Email students"
|
||||
And I should see "Email teachers"
|
||||
And I should see "Email others"
|
||||
And I should see "Allow anyone to verify a certificate"
|
||||
And I should see "Required minutes in course"
|
||||
And I should see "Set protection"
|
||||
|
||||
Scenario: Edit an activity as a Manager Teacher I can see all custom certificate options
|
||||
And I log in as "manager1"
|
||||
And I am on "Course 1" course homepage with editing mode on
|
||||
And I follow "Custom certificate 1"
|
||||
And I navigate to "Edit settings" in current page administration
|
||||
And I should see "Email students"
|
||||
And I should see "Email teachers"
|
||||
And I should see "Email others"
|
||||
And I should see "Allow anyone to verify a certificate"
|
||||
And I should see "Required minutes in course"
|
||||
And I should see "Set protection"
|
||||
|
||||
Scenario: Create an activity as an Editing Teacher without required capabilities I can't see all custom certificate options
|
||||
And I log in as "admin"
|
||||
And I set the following system permissions of "Teacher" role:
|
||||
|
@ -71,9 +106,8 @@ Feature: Being able to correctly display options on the certificate activity edi
|
|||
And I should not see "Required minutes in course"
|
||||
And I should not see "Set protection"
|
||||
|
||||
@javascript
|
||||
Scenario: Add an activity using default custom certificate options
|
||||
And I log in as "teacher1"
|
||||
And I log in as "manager1"
|
||||
And I am on "Course 1" course homepage with editing mode on
|
||||
And I add a "Custom certificate" to section "0"
|
||||
And the field "emailstudents" matches value "0"
|
||||
|
@ -85,7 +119,6 @@ Feature: Being able to correctly display options on the certificate activity edi
|
|||
And the field "protection_modify" matches value "0"
|
||||
And the field "protection_copy" matches value "0"
|
||||
|
||||
@javascript
|
||||
Scenario: Add an activity using configured custom certificate options
|
||||
And the following config values are set as admin:
|
||||
| emailstudents | 1 | customcert |
|
||||
|
@ -96,7 +129,7 @@ Feature: Being able to correctly display options on the certificate activity edi
|
|||
| protection_print | 1 | customcert |
|
||||
| protection_modify | 1 | customcert |
|
||||
| protection_copy | 1 | customcert |
|
||||
And I log in as "teacher1"
|
||||
And I log in as "manager1"
|
||||
And I am on "Course 1" course homepage with editing mode on
|
||||
And I add a "Custom certificate" to section "1"
|
||||
And the field "emailstudents" matches value "1"
|
||||
|
|
|
@ -101,7 +101,6 @@ Feature: Being able to manage elements in a certificate template
|
|||
And I add the element "Course name" to page "1" of the "Custom certificate 1" certificate template
|
||||
And I set the following fields to these values:
|
||||
| Font | Helvetica |
|
||||
| Type | Short name |
|
||||
| Size | 20 |
|
||||
| Colour | #045ECD |
|
||||
| Width | 20 |
|
||||
|
@ -111,7 +110,6 @@ Feature: Being able to manage elements in a certificate template
|
|||
And I click on ".edit-icon" "css_element" in the "Course name" "table_row"
|
||||
And the following fields match these values:
|
||||
| Font | Helvetica |
|
||||
| Type | Short name |
|
||||
| Size | 20 |
|
||||
| Colour | #045ECD |
|
||||
| Width | 20 |
|
||||
|
|
|
@ -21,8 +21,6 @@ Feature: Being able to view the certificates that have been issued
|
|||
And the following "activities" exist:
|
||||
| activity | name | intro | course | idnumber |
|
||||
| customcert | Custom certificate 1 | Custom certificate 1 intro | C1 | customcert1 |
|
||||
And the following config values are set as admin:
|
||||
| showuseridentity | username,email |
|
||||
|
||||
Scenario: View the issued certificates
|
||||
And I log in as "student1"
|
||||
|
@ -40,12 +38,6 @@ Feature: Being able to view the certificates that have been issued
|
|||
And I follow "Custom certificate 1"
|
||||
And I should see "Student 1"
|
||||
And I should see "Student 2"
|
||||
And I should see "Email address"
|
||||
And I should see "Username"
|
||||
And "Student 1" row "Email address" column of "generaltable" table should contain "student1@example.com"
|
||||
And "Student 1" row "Username" column of "generaltable" table should contain "student1"
|
||||
And "Student 2" row "Email address" column of "generaltable" table should contain "student2@example.com"
|
||||
And "Student 2" row "Username" column of "generaltable" table should contain "student2"
|
||||
|
||||
Scenario: Delete an issued certificate
|
||||
And I log in as "student1"
|
||||
|
|
|
@ -40,7 +40,7 @@ class mod_customcert_element_helper_testcase extends advanced_testcase {
|
|||
/**
|
||||
* Test set up.
|
||||
*/
|
||||
public function setUp(): void {
|
||||
public function setUp() {
|
||||
$this->resetAfterTest();
|
||||
}
|
||||
|
||||
|
|
|
@ -38,7 +38,7 @@ class mod_customcert_task_email_certificate_task_testcase extends advanced_testc
|
|||
/**
|
||||
* Test set up.
|
||||
*/
|
||||
public function setUp(): void {
|
||||
public function setUp() {
|
||||
$this->resetAfterTest();
|
||||
}
|
||||
|
||||
|
|
|
@ -40,7 +40,7 @@ class mod_customcert_external_test_testcase extends advanced_testcase {
|
|||
/**
|
||||
* Test set up.
|
||||
*/
|
||||
public function setUp(): void {
|
||||
public function setUp() {
|
||||
$this->resetAfterTest();
|
||||
}
|
||||
|
||||
|
|
|
@ -98,9 +98,9 @@ class mod_customcert_privacy_provider_testcase extends \core_privacy\tests\provi
|
|||
|
||||
// Check this time there are 2 users.
|
||||
$this->assertCount(2, $userlist->get_userids());
|
||||
$this->assertContains((int) $user1->id, $userlist->get_userids());
|
||||
$this->assertContains((int) $user2->id, $userlist->get_userids());
|
||||
$this->assertNotContains((int) $user3->id, $userlist->get_userids());
|
||||
$this->assertContains($user1->id, $userlist->get_userids());
|
||||
$this->assertContains($user2->id, $userlist->get_userids());
|
||||
$this->assertNotContains($user3->id, $userlist->get_userids());
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -93,7 +93,7 @@ if ($code) {
|
|||
$result->issues = array();
|
||||
|
||||
// Ok, now check if the code is valid.
|
||||
$userfields = \mod_customcert\helper::get_all_user_name_fields('u');
|
||||
$userfields = get_all_user_name_fields(true, 'u');
|
||||
$sql = "SELECT ci.id, u.id as userid, $userfields, co.id as courseid,
|
||||
co.fullname as coursefullname, c.id as certificateid,
|
||||
c.name as certificatename, c.verifyany
|
||||
|
|
|
@ -24,10 +24,10 @@
|
|||
|
||||
defined('MOODLE_INTERNAL') || die('Direct access to this script is forbidden.');
|
||||
|
||||
$plugin->version = 2021110501; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2021051700; // Requires this Moodle version (3.11).
|
||||
$plugin->version = 2019111807; // The current module version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2019111800; // Requires this Moodle version (3.8).
|
||||
$plugin->cron = 0; // Period for cron to check this module (secs).
|
||||
$plugin->component = 'mod_customcert';
|
||||
|
||||
$plugin->maturity = MATURITY_STABLE;
|
||||
$plugin->release = "3.11.1-seachefs"; // User-friendly version number.
|
||||
$plugin->release = "3.8.6"; // User-friendly version number.
|
||||
|
|
3
view.php
3
view.php
|
@ -18,7 +18,7 @@
|
|||
* Handles viewing a customcert.
|
||||
*
|
||||
* @package mod_customcert
|
||||
* @copyright 2013 Mark Nelson <markn@moodle.com>, 2022 Kumi Systems e.U. <office@kumi.systems>
|
||||
* @copyright 2013 Mark Nelson <markn@moodle.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
|
@ -142,7 +142,6 @@ if (!$downloadown && !$downloadissue) {
|
|||
$link = new moodle_url('/mod/customcert/view.php', array('id' => $cm->id, 'downloadown' => true));
|
||||
$downloadbutton = new single_button($link, $linkname, 'get', true);
|
||||
$downloadbutton->class .= ' m-b-1'; // Seems a bit hackish, ahem.
|
||||
$downloadbutton->add_action(new \popup_action('click', $link));
|
||||
$downloadbutton = $OUTPUT->render($downloadbutton);
|
||||
}
|
||||
|
||||
|
|
|
@ -1 +1 @@
|
|||
YUI.add("moodle-mod_customcert-rearrange",function(r,t){var s=function(){s.superclass.constructor.apply(this,[arguments])};r.extend(s,r.Base,{templateid:0,page:[],elements:[],pdfx:0,pdfy:0,pdfwidth:0,pdfheight:0,elementxy:0,pdfleftboundary:0,pdfrightboundary:0,pixelsinmm:3.779527559055,initializer:function(t){this.templateid=t[0],this.page=t[1],this.elements=t[2],this.setPdfDimensions(),this.setBoundaries(),this.setpositions(),this.createevents(),window.addEventListener("resize",this.checkWindownResize.bind(this))},setpositions:function(){var t,e,i,s,n,o;for(t in this.elements){switch(e=this.elements[t],i=this.pdfx+e.posx*this.pixelsinmm,s=this.pdfy+e.posy*this.pixelsinmm,n=parseFloat(r.one("#element-"+e.id).getComputedStyle("width")),(o=e.width*this.pixelsinmm)&&o<n&&(n=o),e.refpoint){case"1":i-=n/2;break;case"2":i=i-n+2}r.one("#element-"+e.id).setX(i),r.one("#element-"+e.id).setY(s)}},setPdfDimensions:function(){this.pdfx=r.one("#pdf").getX(),this.pdfy=r.one("#pdf").getY(),this.pdfwidth=parseFloat(r.one("#pdf").getComputedStyle("width")),this.pdfheight=parseFloat(r.one("#pdf").getComputedStyle("height"))},setBoundaries:function(){this.pdfleftboundary=this.pdfx,this.page.leftmargin&&(this.pdfleftboundary+=parseInt(this.page.leftmargin*this.pixelsinmm,10)),this.pdfrightboundary=this.pdfx+this.pdfwidth,this.page.rightmargin&&(this.pdfrightboundary-=parseInt(this.page.rightmargin*this.pixelsinmm,10))},checkWindownResize:function(){this.setPdfDimensions(),this.setBoundaries(),this.setpositions()},createevents:function(){r.one(".savepositionsbtn [type=submit]").on("click",function(t){this.savepositions(t)},this),r.one(".applypositionsbtn [type=submit]").on("click",function(t){this.savepositions(t),t.preventDefault()},this);var e=new r.DD.Delegate({container:"#pdf",nodes:".element"});e.on("drag:start",function(){var t=e.get("currentNode");this.elementxy=t.getXY()},this),e.on("drag:end",function(){var t=e.get("currentNode");this.isoutofbounds(t)&&t.setXY(this.elementxy)},this)},isoutofbounds:function(t){var e=parseFloat(t.getComputedStyle("width")),i=parseFloat(t.getComputedStyle("height")),s=t.getX(),n=s+e,o=t.getY(),a=o+i;return s<this.pdfleftboundary||n>this.pdfrightboundary||(o<this.pdfy||a>this.pdfy+this.pdfheight)},savepositions:function(o){var t,e,i,s,n,a,d,p={tid:this.templateid,values:[]};for(t in this.elements){switch(e=this.elements[t],s=(i=r.one("#element-"+e.id)).getX()-this.pdfx,n=i.getY()-this.pdfy,a=i.getData("refpoint"),d=parseFloat(i.getComputedStyle("width")),a){case"1":s+=d/2;break;case"2":s+=d}p.values.push({id:e.id,posx:Math.round(parseFloat(s/this.pixelsinmm)),posy:Math.round(parseFloat(n/this.pixelsinmm))})}p.values=JSON.stringify(p.values),r.io(M.cfg.wwwroot+"/mod/customcert/ajax.php",{method:"POST",data:p,on:{failure:function(t,e){this.ajaxfailure(e)},success:function(){var t,e,i=o.currentTarget.ancestor("form",!0),s=i.getAttribute("action"),n=i.one("[name=pid]");n?(t=n.get("value"),window.location=s+"?pid="+t):(e=i.one("[name=tid]").get("value"),window.location=s+"?tid="+e)}},context:this}),o.preventDefault()},ajaxfailure:function(t){var e={name:t.status+" "+t.statusText,message:t.responseText};return new M.core.exception(e)}}),r.namespace("M.mod_customcert.rearrange").init=function(t,e,i){new s(t,e,i)}},"@VERSION@",{requires:["dd-delegate","dd-drag"]});
|
||||
YUI.add("moodle-mod_customcert-rearrange",function(e,t){var n=function(){n.superclass.constructor.apply(this,[arguments])};e.extend(n,e.Base,{templateid:0,page:[],elements:[],pdfx:0,pdfy:0,pdfwidth:0,pdfheight:0,elementxy:0,pdfleftboundary:0,pdfrightboundary:0,pixelsinmm:3.779527559055,initializer:function(e){this.templateid=e[0],this.page=e[1],this.elements=e[2],this.setPdfDimensions(),this.setBoundaries(),this.setpositions(),this.createevents(),window.addEventListener("resize",this.checkWindownResize.bind(this))},setpositions:function(){for(var t in this.elements){var n=this.elements[t],r=this.pdfx+n.posx*this.pixelsinmm,i=this.pdfy+n.posy*this.pixelsinmm,s=parseFloat(e.one("#element-"+n.id).getComputedStyle("width")),o=n.width*this.pixelsinmm;o&&s>o&&(s=o);switch(n.refpoint){case"1":r-=s/2;break;case"2":r=r-s+2}e.one("#element-"+n.id).setX(r),e.one("#element-"+n.id).setY(i)}},setPdfDimensions:function(){this.pdfx=e.one("#pdf").getX(),this.pdfy=e.one("#pdf").getY(),this.pdfwidth=parseFloat(e.one("#pdf").getComputedStyle("width")),this.pdfheight=parseFloat(e.one("#pdf").getComputedStyle("height"))},setBoundaries:function(){this.pdfleftboundary=this.pdfx,this.page.leftmargin&&(this.pdfleftboundary+=parseInt(this.page.leftmargin*this.pixelsinmm,10)),this.pdfrightboundary=this.pdfx+this.pdfwidth,this.page.rightmargin&&(this.pdfrightboundary-=parseInt(this.page.rightmargin*this.pixelsinmm,10))},checkWindownResize:function(){this.setPdfDimensions(),this.setBoundaries(),this.setpositions()},createevents:function(){e.one(".savepositionsbtn [type=submit]").on("click",function(e){this.savepositions(e)},this),e.one(".applypositionsbtn [type=submit]").on("click",function(e){this.savepositions(e),e.preventDefault()},this);var t=new e.DD.Delegate({container:"#pdf",nodes:".element"});t.on("drag:start",function(){var e=t.get("currentNode");this.elementxy=e.getXY()},this),t.on("drag:end",function(){var e=t.get("currentNode");this.isoutofbounds(e)&&e.setXY(this.elementxy)},this)},isoutofbounds:function(e){var t=parseFloat(e.getComputedStyle("width")),n=parseFloat(e.getComputedStyle("height")),r=e.getX(),i=r+t,s=e.getY(),o=s+n;return r<this.pdfleftboundary||i>this.pdfrightboundary?!0:s<this.pdfy||o>this.pdfy+this.pdfheight?!0:!1},savepositions:function(t){var n={tid:this.templateid,values:[]};for(var r in this.elements){var i=this.elements[r],s=e.one("#element-"+i.id),o=s.getX()-this.pdfx,u=s.getY()-this.pdfy,a=s.getData("refpoint"),f=parseFloat(s.getComputedStyle("width"));switch(a){case"1":o+=f/2;break;case"2":o+=f}n.values.push({id:i.id,posx:Math.round(parseFloat(o/this.pixelsinmm)),posy:Math.round(parseFloat(u/this.pixelsinmm))})}n.values=JSON.stringify(n.values),e.io(M.cfg.wwwroot+"/mod/customcert/ajax.php",{method:"POST",data:n,on:{failure:function(e,t){this.ajaxfailure(t)},success:function(){var e=t.currentTarget.ancestor("form",!0),n=e.getAttribute("action"),r=e.one("[name=pid]");if(r){var i=r.get("value");window.location=n+"?pid="+i}else{var s=e.one("[name=tid]").get("value");window.location=n+"?tid="+s}}},context:this}),t.preventDefault()},ajaxfailure:function(e){var t={name:e.status+" "+e.statusText,message:e.responseText};return new M.core.exception(t)}}),e.namespace("M.mod_customcert.rearrange").init=function(e,t,r){new n(e,t,r)}},"@VERSION@",{requires:["dd-delegate","dd-drag"]});
|
||||
|
|
Loading…
Reference in a new issue