From 6bb72f655fa81a2ba121aea7f94bb2b3637c5472 Mon Sep 17 00:00:00 2001 From: Kumi Date: Tue, 9 Nov 2021 13:42:47 +0000 Subject: [PATCH] Current changes --- .gitignore | 1 + README.md | 4 +- classes/.template.php.swp | Bin 0 -> 36864 bytes classes/template.php | 78 +++++++++- composer.json | 3 +- composer.lock | 311 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 389 insertions(+), 8 deletions(-) create mode 100644 .gitignore create mode 100644 classes/.template.php.swp create mode 100644 composer.lock diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..48b8bf9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +vendor/ diff --git a/README.md b/README.md index e4b870d..5dcf2f7 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,8 @@ 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 @@ -36,4 +38,4 @@ Visit the [wiki page](https://docs.moodle.org/en/Custom_certificate_module "Wiki ## License -Licensed under the [GNU GPL License](http://www.gnu.org/copyleft/gpl.html). \ No newline at end of file +Licensed under the [GNU GPL License](http://www.gnu.org/copyleft/gpl.html). diff --git a/classes/.template.php.swp b/classes/.template.php.swp new file mode 100644 index 0000000000000000000000000000000000000000..1b4914ea64b8e2629cc99d566367639c1a5c34b2 GIT binary patch literal 36864 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, array($page->width, $page->height)); if ($this->html) { - $pdf->WriteHTML($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); + + $pdf->addPage($html); + $pdf->send(); + die($pdf->getError()); } else { $pdf->SetMargins($page->leftmargin, 0, $page->rightmargin); // Get the elements for the page. @@ -331,11 +394,13 @@ class template { } } - if ($return) { + if ($return && !$this->html) { return $pdf->Output('', 'S'); } - $pdf->Output($filename, $deliveryoption); + if (!$this->html) { + $pdf->Output($filename, $deliveryoption); + } } } @@ -347,8 +412,9 @@ class template { public function copy_to_template($copytotemplateid) { global $DB; - $copytotemplate = $DB->get_records('customcert_templates', array('id' => $copytotemplateid)); + $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))) { diff --git a/composer.json b/composer.json index f072256..d609b46 100644 --- a/composer.json +++ b/composer.json @@ -2,7 +2,8 @@ "name": "mdjnelson/moodle-mod_customcert", "type": "moodle-mod", "require": { - "composer/installers": "~1.0" + "composer/installers": "~1.0", + "mikehaertl/phpwkhtmltopdf": "^2.5" }, "extra": { "installer-name": "customcert" diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..5d6fad3 --- /dev/null +++ b/composer.lock @@ -0,0 +1,311 @@ +{ + "_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" +}