]> _ Git - fluidbook-toolbox.git/commitdiff
wip #7003 @3
authorVincent Vanwaelscappel <vincent@cubedesigners.com>
Mon, 15 Jul 2024 15:29:55 +0000 (17:29 +0200)
committerVincent Vanwaelscappel <vincent@cubedesigners.com>
Mon, 15 Jul 2024 15:29:55 +0000 (17:29 +0200)
app/Models/Badges/BadgeClass.php
app/Models/ElearningTranslate.php
resources/badge/generate_image/generate_image.js [new file with mode: 0644]
resources/badge/translate.js [deleted file]
resources/badge/translate/translate.js [new file with mode: 0644]

index 8198139efd8c1708abcd4ced40d3169929fbb9fa..e89038c5889d6138e16a2620cbd77e728b1f6aa6 100644 (file)
@@ -3,9 +3,13 @@
 namespace App\Models\Badges;
 
 use App\Fields\BadgeIssuer;
+use App\Fields\ElearningLocale;
+use App\Models\ElearningTranslate;
 use Cubist\Backpack\Magic\Fields\Files;
 use Cubist\Backpack\Magic\Fields\Text;
 use Cubist\Backpack\Magic\Fields\Textarea;
+use Cubist\Util\CommandLine;
+use Cubist\Util\Zip;
 
 class BadgeClass extends Base
 {
@@ -23,6 +27,95 @@ class BadgeClass extends Base
         $this->addField('name', Text::class, __('Nom du certificat'), ['column' => true]);
         $this->addField('area', Text::class, __('Domaine de formation'));
         $this->addField('description', Textarea::class, __('Description du certificat'), ['hint' => __('Description de la formation. Sera intégré dans les métadonnées du certificat, mais invisible dans l\'image')]);
+        $this->addField('locale', ElearningLocale::class, __('Locale'), ['default' => 'en']);
         $this->addField('template', Files::class, __('Template du badge'));
+        $this->addField('preview', 'NoValue', __('Preview'), ['column_escape' => false, 'column' => true, 'column_type' => 'model_function', 'column_function_name' => 'getPreviewImage', 'column_limit' => -1]);
+
+    }
+
+    public function onSaved(): bool
+    {
+        $res = parent::onSaved();
+        $this->generateSampleImage();
+        return $res;
+    }
+
+    /**
+     * @return array
+     */
+    protected function getPreviewData()
+    {
+        $l = ElearningTranslate::getLocaleTranslations($this->locale);
+
+        $d = ['earner' => 'Rameshbhulabbhai Patel-Rajjesh',
+            'name' => $this->name,
+            'area' => $this->area,
+            'date' => '2024-09-21',
+            'completed' => $l['Completed'] ?? 'Completed',
+            'template' => $this->unzipTemplate(),
+        ];
+        return $d;
+    }
+
+    public function generateSampleImage()
+    {
+        return self::generateImage($this->getPreviewData());
+    }
+
+    public static function generateImage($data)
+    {
+        $hash = sha1(json_encode($data));
+
+
+        if (!file_exists($data['template'] . $hash . '.html')) {
+            $html = file_get_contents($data['template'] . 'template.html');
+            foreach ($data as $key => $value) {
+                $html = str_replace('$' . $key, $value, $html);
+            }
+            file_put_contents($data['template'] . $hash . '.html', $html);
+        }
+
+        $dest = \Cubist\Util\Files\Files::mkdir(protected_path('badge/images/')) . $hash . '.png';
+        if (!file_exists($dest)) {
+            $cl = new CommandLine('node');
+            $cl->setArg(null, resource_path('badge/generate_image/generate_image.js'));
+            $cl->setArg('width', 500);
+            $cl->setArg('height', 500);
+            $cl->setArg('delay', 3);
+            $cl->setArg('scale', 1);
+            $cl->setArg('dest', $dest);
+            $cl->setArg('url', 'file://' . $data['template'] . $hash . '.html');
+            $cl->execute();
+        }
+        return $dest;
+
+    }
+
+    public function getPreviewImage()
+    {
+        $f = $this->generateSampleImage();
+        if (!file_exists($f)) {
+            $b = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mN89x8AAuEB74Y0o2cAAAAASUVORK5CYII=';
+        } else {
+            $b = base64_encode(file_get_contents($f));
+        }
+        return '<img src="data:image/png;base64,' . $b . '" width="150" height="150" alt="" />';
     }
+
+
+    protected function unzipTemplate()
+    {
+        $zipPath = $this->getFirstMediaInField('template')->getPath();
+        $dir = \Cubist\Util\Files\Files::mkdir(protected_path('badge/cache/unzip') . '/' . \Cubist\Util\Files\Files::hashFileAttributes($zipPath));
+
+        if (!file_exists($dir . 'template.html')) {
+            \Cubist\Util\Files\Files::mkdir($dir);
+            Zip::extract($zipPath, $dir);
+        }
+
+        return $dir;
+
+    }
+
+
 }
index aff48873c5a34376d23d1b526e1401e744d3fd2a..c37debb3005371d358caaeae960f747a7a0b4d7f 100644 (file)
@@ -30,4 +30,11 @@ class ElearningTranslate extends ToolboxContentTranslate
     protected static $_permissionBase = 'elearning-translate';
 
     protected $_operations = [ExcelExportOperation::class, ExcelImportOperation::class];
+
+    public function getPaths()
+    {
+        $res = parent::getPaths();
+        $res['OpenBadges'] = 'resources/badge/translate';
+        return $res;
+    }
 }
diff --git a/resources/badge/generate_image/generate_image.js b/resources/badge/generate_image/generate_image.js
new file mode 100644 (file)
index 0000000..d8e3333
--- /dev/null
@@ -0,0 +1,30 @@
+const puppeteer = require('puppeteer');
+const commandLineArgs = require('command-line-args');
+const optionDefinitions = [
+    {name: 'url', type: String},
+    {name: 'dest', type: String},
+    {name: 'delay', type: Number, defaultOption: 3},
+    {name: 'scale', type: Number, defaultOption: 1},
+    {name: 'width', type: Number, defaultOption: 500},
+    {name: 'height', type: Number, defaultOption: 500},
+];
+
+(async () => {
+    const options = commandLineArgs(optionDefinitions);
+    const browser = await puppeteer.launch({
+        headless: true,
+        args: [
+            "--disable-setuid-sandbox",
+            "--no-sandbox",
+        ],
+        executablePath: 'google-chrome-stable',
+    });
+
+    const page = await browser.newPage();
+    await page.setViewport({
+        width: options.width / options.scale, height: options.height / options.scale, deviceScaleFactor: options.scale,
+    });
+    await page.goto(options.url, {waitUntil: 'networkidle2'});
+    await page.screenshot({path: options.dest, type: 'png', omitBackground: true});
+    await browser.close();
+})();
diff --git a/resources/badge/translate.js b/resources/badge/translate.js
deleted file mode 100644 (file)
index 1985c52..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-/*
-__('Réussi')
-
- */
diff --git a/resources/badge/translate/translate.js b/resources/badge/translate/translate.js
new file mode 100644 (file)
index 0000000..c3bf9a2
--- /dev/null
@@ -0,0 +1,5 @@
+/*
+__('Completed')
+__('badgedateformat')
+
+ */