TincanService.php in Opigno module 8
File
ActivityTypes/opigno_tincan_activity/src/TincanService.php
View source
<?php
namespace Drupal\opigno_tincan_activity;
use Drupal\Core\Database\Connection;
use Drupal\file\Entity\File;
class TincanService implements TincanServiceInterface {
const PATH_PUBLIC_PACKAGE_FOLDER = 'public://opigno_tincan/';
const PATH_PUBLIC_EXTRACTED_PACKAGE_FOLDER = 'public://opigno_tincan_extracted/';
const SCORE_MAX = 50;
protected $connection;
public function __construct(Connection $connection) {
$this->connection = $connection;
}
public function saveTincanPackageInfo(File $file) {
if (!$file) {
return FALSE;
}
if (!file_exists(self::getExtractPath($file) . 'tincan.xml')) {
try {
self::unzipPackage($file);
} catch (\Exception $e) {
return $e;
}
}
$package_info = self::getInfoFromExtractedPackage($file);
if ($package_info === FALSE) {
\Drupal::logger('opigno_tincan_activity')
->error('The package does not contain an activity ID or a launch file');
return;
}
$fid = $file
->id();
$activity_id = $package_info['id'];
$launch_filename = $package_info['launch'];
$connection = $this->connection;
try {
$connection
->insert('opigno_tincan_activity_type_properties')
->fields([
'fid' => $fid,
'activity_id' => $activity_id,
'launch_filename' => $launch_filename,
])
->execute();
} catch (\Exception $e) {
return $e;
}
}
public function getMaximumScore() {
return self::SCORE_MAX;
}
public function deleteTincanPackage() {
}
public function tincanLoadByFileEntity(File $file) {
$connection = $this->connection;
return $connection
->select('opigno_tincan_activity_type_properties', 'otn')
->fields('otn', [
'activity_id',
'launch_filename',
])
->condition('fid', $file
->id())
->execute()
->fetchObject();
}
public static function getInfoFromExtractedPackage($file) {
$tincan_file = self::getExtractPath($file) . 'tincan.xml';
if (!file_exists(self::getExtractPath($file) . 'tincan.xml')) {
return FALSE;
}
$xml = simplexml_load_file($tincan_file);
if (!$xml) {
return FALSE;
}
if (!isset($xml->activities->activity->launch)) {
return FALSE;
}
if (!isset($xml->activities->activity['id'])) {
return FALSE;
}
return [
'launch' => (string) $xml->activities->activity->launch,
'id' => (string) $xml->activities->activity['id'],
];
}
public static function getExtractPath($file) {
$filename = self::getPackageName($file);
$filename = preg_replace([
"/[^a-zA-Z0-9]/",
], "_", $filename);
return self::PATH_PUBLIC_EXTRACTED_PACKAGE_FOLDER . $filename . '/';
}
public static function getPackageName($file) {
$file_full_name = $file
->getFileName();
$file_name_parts = explode('.', $file_full_name);
return $file_name_parts[0];
}
public static function unzipPackage($file) {
$path = \Drupal::service('file_system')
->realpath($file
->getFileUri());
$zip = new \ZipArchive();
$result = $zip
->open($path);
if ($result === TRUE) {
$extract_dir = self::getExtractPath($file);
$zip
->extractTo($extract_dir);
$zip
->close();
}
else {
$error = 'none';
switch ($result) {
case \ZipArchive::ER_EXISTS:
$error = 'ER_EXISTS';
break;
case \ZipArchive::ER_INCONS:
$error = 'ER_INCONS';
break;
case \ZipArchive::ER_INVAL:
$error = 'ER_INVAL';
break;
case \ZipArchive::ER_NOENT:
$error = 'ER_NOENT';
break;
case \ZipArchive::ER_NOZIP:
$error = 'ER_NOZIP';
break;
case \ZipArchive::ER_OPEN:
$error = 'ER_OPEN';
break;
case \ZipArchive::ER_READ:
$error = 'ER_READ';
break;
case \ZipArchive::ER_SEEK:
$error = 'ER_SEEK';
break;
}
\Drupal::logger('opigno_tincan_activity')
->error("An error occurred when unzipping the TINCAN package data. Error: !error", [
'!error' => $error,
]);
return FALSE;
}
}
}