From 6400e587d8ff9c598a8e3531c04da9c70d627e36 Mon Sep 17 00:00:00 2001 From: Shamim Rezaie Date: Wed, 29 Jul 2015 11:29:16 +1000 Subject: [PATCH] Added support for having right margin and width limit for each element In addition to width and height, each page can have an optional (right) margin attribute. Also, each element can have an optional width attribute. --- db/install.xml | 4 +++ db/upgrade.php | 65 +++++++++++++++++++++++++++++++++++++++ edit_form.php | 15 ++++++++- element/element.class.php | 13 +++++++- lang/en/customcert.php | 6 ++++ locallib.php | 4 ++- version.php | 2 +- 7 files changed, 105 insertions(+), 4 deletions(-) create mode 100644 db/upgrade.php diff --git a/db/install.xml b/db/install.xml index bed795f..ad17256 100644 --- a/db/install.xml +++ b/db/install.xml @@ -39,6 +39,7 @@ + @@ -60,6 +61,7 @@ + @@ -86,6 +88,7 @@ + @@ -107,6 +110,7 @@ + diff --git a/db/upgrade.php b/db/upgrade.php new file mode 100644 index 0000000..a488429 --- /dev/null +++ b/db/upgrade.php @@ -0,0 +1,65 @@ +. + +/** + * This file keeps track of upgrades to the customcert module + * + * @package mod_customcert + * @copyright 2015 Shamim Rezaie + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +function xmldb_customcert_upgrade($oldversion=0) { + + global $CFG, $DB; + $dbman = $DB->get_manager(); + + if ($oldversion < 2015072700) { + // Add the margin fields to customcert_pages table + $table = new xmldb_table('customcert_pages'); + $field = new xmldb_field('margin', XMLDB_TYPE_INTEGER, 10, null, null, null, 0, 'height'); + if (!$dbman->field_exists($table, $field)) { + $dbman->add_field($table, $field); + } + + // Add the margin fields to customcert_template_pages table + $table = new xmldb_table('customcert_template_pages'); + $field = new xmldb_field('margin', XMLDB_TYPE_INTEGER, 10, null, null, null, 0, 'height'); + if (!$dbman->field_exists($table, $field)) { + $dbman->add_field($table, $field); + } + + // Add the width fields to customcert_elements table + $table = new xmldb_table('customcert_elements'); + $field = new xmldb_field('width', XMLDB_TYPE_INTEGER, 10, null, null, null, 0, 'posy'); + if (!$dbman->field_exists($table, $field)) { + $dbman->add_field($table, $field); + } + + // Add the width fields to customcert_template_elements table + $table = new xmldb_table('customcert_template_elements'); + $field = new xmldb_field('width', XMLDB_TYPE_INTEGER, 10, null, null, null, 0, 'posy'); + if (!$dbman->field_exists($table, $field)) { + $dbman->add_field($table, $field); + } + + // Customcert savepoint reached. + upgrade_mod_savepoint(true, 2015072700, 'customcert'); + } + + return true; +} diff --git a/edit_form.php b/edit_form.php index f5baae3..769758c 100644 --- a/edit_form.php +++ b/edit_form.php @@ -99,6 +99,9 @@ class mod_customcert_edit_form extends moodleform { // Set the height. $element = $mform->getElement('pageheight_' . $p->id); $element->setValue($p->height); + // Set the margin. + $element = $mform->getElement('pagemargin_' . $p->id); + $element->setValue($p->margin); } } } @@ -114,7 +117,7 @@ class mod_customcert_edit_form extends moodleform { public function validation($data, $files) { $errors = parent::validation($data, $files); - // Go through the data and check any width or height values. + // Go through the data and check any width, height or margin values. foreach ($data as $key => $value) { if (strpos($key, 'pagewidth_') !== false) { $page = str_replace('pagewidth_', '', $key); @@ -132,6 +135,12 @@ class mod_customcert_edit_form extends moodleform { $errors[$heightid] = get_string('invalidheight', 'customcert'); } } + if (strpos($key, 'pagemargin_') !== false) { + // Validate that the margin is a valid value. + if (isset($data[$key]) && ($data[$key] < 0)) { + $errors[$key] = get_string('invalidmargin', 'customcert'); + } + } } return $errors; @@ -174,6 +183,10 @@ class mod_customcert_edit_form extends moodleform { $mform->addRule('pageheight_' . $page->id, null, 'required', null, 'client'); $mform->addHelpButton('pageheight_' . $page->id, 'height', 'customcert'); + $mform->addElement('text', 'pagemargin_' . $page->id, get_string('margin', 'customcert')); + $mform->setType('pagemargin_' . $page->id, PARAM_INT); + $mform->addHelpButton('pagemargin_' . $page->id, 'margin', 'customcert'); + $mform->addElement('submit', 'downloadgrid_' . $page->id, get_string('downloadgrid', 'customcert')); $group = array(); diff --git a/element/element.class.php b/element/element.class.php index 62929d6..dd71b62 100644 --- a/element/element.class.php +++ b/element/element.class.php @@ -113,6 +113,7 @@ abstract class customcert_element_base { $element->colour = (isset($data->colour)) ? $data->colour : null; $element->posx = (isset($data->posx)) ? $data->posx : null; $element->posy = (isset($data->posy)) ? $data->posy : null; + $element->width = (isset($data->width)) ? $data->width : null; $element->timemodified = time(); // Check if we are updating, or inserting a new element. @@ -183,7 +184,7 @@ abstract class customcert_element_base { $this->set_font($pdf); $fontcolour = TCPDF_COLORS::convertHTMLColorToDec($this->element->colour, $fontcolour); $pdf->SetTextColor($fontcolour['R'], $fontcolour['G'], $fontcolour['B']); - $pdf->writeHTMLCell(0, 0, $this->element->posx, $this->element->posy, $content); + $pdf->writeHTMLCell($this->element->width, 0, $this->element->posx, $this->element->posy, $content); } /** @@ -266,6 +267,11 @@ abstract class customcert_element_base { $mform->setType('posy', PARAM_INT); $mform->setDefault('posy', '0'); $mform->addHelpButton('posy', 'posy', 'customcert'); + + $mform->addElement('text', 'width', get_string('elementwidth', 'customcert'), array('size' => 10)); + $mform->setType('width', PARAM_INT); + $mform->setDefault('width', ''); + $mform->addHelpButton('width', 'elementwidth', 'customcert'); } /** @@ -304,6 +310,11 @@ abstract class customcert_element_base { $errors['posy'] = get_string('invalidposition', 'customcert', 'Y'); } + // Check if width is less than 0. + if (isset($data['width']) && $data['width'] < 0) { + $errors['width'] = get_string('invalidelementwidth', 'customcert'); + } + return $errors; } diff --git a/lang/en/customcert.php b/lang/en/customcert.php index 484667f..d681fb6 100644 --- a/lang/en/customcert.php +++ b/lang/en/customcert.php @@ -47,6 +47,8 @@ $string['elementname_help'] = 'This will be the name used to identify this eleme page and will want to distinguish between them quickly when editing the certificate. Note: this will not displayed on the PDF.'; $string['elements'] = 'Elements'; $string['elements_help'] = 'These are the list of elements that will be displayed on this PDF page.'; +$string['elementwidth'] = 'Max width'; +$string['elementwidth_help'] = 'Specify the maximum width of the element. 0 means no limit.'; $string['errorloadingelement'] = 'Error loading the element "{$a}"'; $string['errorsavingelement'] = 'Error saving the element "{$a}"'; $string['font'] = 'Font'; @@ -60,14 +62,18 @@ $string['gridpdfname'] = 'grid_for_page_{$a}'; $string['height'] = 'Height'; $string['height_help'] = 'This is the height of the certificate PDF in mm. For reference an A4 piece of paper is 297mm high and a letter is 279mm high.'; $string['invalidcolour'] = 'Invalid colour chosen, please enter a valid HTML colour name, or a six-digit, or three-digit hexadecimal colour.'; +$string['invalidelementwidth'] = 'Please enter a positive number.'; $string['invalidposition'] = 'Please select a positive number for position {$a}.'; $string['invalidheight'] = 'The height has to be a valid number greater than 0.'; +$string['invalidmargin'] = 'The margin cannot be a negative number.'; $string['invalidwidth'] = 'The width has to be a valid number greater than 0.'; $string['issued'] = 'Issued'; $string['landscape'] = 'Landscape'; $string['load'] = 'Load'; $string['loadtemplate'] = 'Load template'; $string['loadtemplatemsg'] = 'Are you sure you wish to load this template? This will remove any existing pages and elements for this certificate.'; +$string['margin'] = 'Right margin'; +$string['margin_help'] = 'This is the right margin of the certificate PDF in mm.'; $string['modify'] = 'Modify'; $string['modulename'] = 'Custom Certificate'; $string['modulenameplural'] = 'Custom Certificates'; diff --git a/locallib.php b/locallib.php index 8e07982..8bbef73 100644 --- a/locallib.php +++ b/locallib.php @@ -207,11 +207,13 @@ function customcert_save_page_data($data) { // Get the name of the fields we want from the form. $width = 'pagewidth_' . $page->id; $height = 'pageheight_' . $page->id; + $margin = 'pagemargin_' . $page->id; // Create the page data to update the DB with. $p = new stdClass(); $p->id = $page->id; $p->width = $data->$width; $p->height = $data->$height; + $p->margin = $data->$margin; $p->timemodified = $time; // Update the page. $DB->update_record('customcert_pages', $p); @@ -668,7 +670,6 @@ function customcert_generate_pdf($customcert, $preview = false) { $pdf->setPrintHeader(false); $pdf->setPrintFooter(false); $pdf->SetTitle($customcert->name); - $pdf->SetMargins(0, 0); $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($customcert->name, '.'); @@ -682,6 +683,7 @@ function customcert_generate_pdf($customcert, $preview = false) { $orientation = 'P'; } $pdf->AddPage($orientation, array($page->width, $page->height)); + $pdf->SetMargins(0, 0, $page->margin); // Get the elements for the page. if ($elements = $DB->get_records('customcert_elements', array('pageid' => $page->id), 'sequence ASC')) { // Loop through and display. diff --git a/version.php b/version.php index ece81da..bf15d40 100644 --- a/version.php +++ b/version.php @@ -24,7 +24,7 @@ defined('MOODLE_INTERNAL') || die('Direct access to this script is forbidden.'); -$plugin->version = 2015031300; // The current module version (Date: YYYYMMDDXX). +$plugin->version = 2015072700; // The current module version (Date: YYYYMMDDXX). $plugin->requires = 2014051200; // Requires this Moodle version (2.7). $plugin->cron = 0; // Period for cron to check this module (secs). $plugin->component = 'mod_customcert';