Subversion Repositories ALCASAR

Compare Revisions

No changes between revisions

Ignore whitespace Rev 2167 → Rev 2168

/web/acc/manager/lib/alcasar/ticketspdf.class.php
File deleted
\ No newline at end of file
/web/acc/manager/lib/alcasar/TicketsGenerator.php
0,0 → 1,178
<?php
/**
* ALCASAR tickets generator
*
* Generate tickets of users.
* Use wkhtmltopdf to convert HTML to PDF.
*
* @author Tom Houdayer
* @copyright Copyright (C) ALCASAR (http://www.alcasar.net)
* @license GPL-3.0
* @version $Id$
*/
 
class TicketsGenerator
{
/**
* @var string Path to wkhtmltopdf executable.
*/
private $wkhtmltopdfPath = 'wkhtmltopdf';
 
/**
* @var object[] Tickets of users.
*/
private $tickets = [];
 
/**
* @var string Language of tickets.
*/
private $language = 'en';
 
/**
* @var string HTML template filename.
*/
private $template = __DIR__ . '/' . 'tickets.template.php';
 
/**
* @var string|null HTML generated filename (null if not generated).
*/
private $htmlGeneratedFilename;
 
/**
* Constructor.
*
* @param array $options Options of the instance.
*/
public function __construct($options = [])
{
if (isset($options['wkhtmltopdfPath'])) {
$this->wkhtmltopdfPath = $options['wkhtmltopdfPath'];
}
if (isset($options['language'])) {
$this->language = $options['language'];
}
if (isset($options['template'])) {
$this->template = $options['template'];
}
}
 
/**
* Add a ticket.
*
* @param array $user User.
* @param bool $duplicate Print a duplicated ticket if true.
*/
public function addTicket($user, $duplicate = true)
{
$this->tickets[] = (object) [
'username' => $user['username'],
'password' => $user['password'],
'maxAllSession' => $user['maxAllSession'],
'sessionTimeout' => $user['sessionTimeout'],
'maxDailySession' => $user['maxDailySession'],
'expiration' => ((isset($user['expiration'])) ? $user['expiration'] : '-'),
'isDuplicate' => false
];
if ($duplicate) {
$this->tickets[] = (object) [
'username' => $user['username'],
'password' => $user['password'],
'maxAllSession' => $user['maxAllSession'],
'sessionTimeout' => $user['sessionTimeout'],
'maxDailySession' => $user['maxDailySession'],
'expiration' => ((isset($user['expiration'])) ? $user['expiration'] : '-'),
'isDuplicate' => true
];
}
}
 
/**
* Generate and save the PDF to the filesystem.
*
* @param string $filename File name of the generated PDF.
*
* @return bool Result of the convertion (true if success).
*/
public function saveAs($filename)
{
if (file_exists($filename)) {
return false;
}
 
// TODO: Regex validation of $filename
 
if (!$this->generateHtml("$filename.html")) {
return false;
}
 
$command = $this->wkhtmltopdfPath . ' --quiet --disable-smart-shrinking --footer-font-size 8 --footer-left "ALCASAR" --footer-center "[page] / [toPage]" --footer-right "' . date('Y-m-d H:i:s') . '" ' . escapeshellarg("$filename.html") . ' ' . escapeshellarg($filename);
$output;
$exitCode;
exec($command, $output, $exitCode);
 
unlink("$filename.html");
 
if ($exitCode !== 0) {
return false;
}
 
return true;
}
 
/**
* Send the PDF to the browser.
*
* @return bool Result of the convertion (true if success).
*/
public function output()
{
$filename = tempnam('/tmp', 'ALCASAR-PDF_');
unlink($filename);
 
if (!$this->saveAs($filename)) {
return false;
}
 
header('Content-Type: application/pdf');
header('Content-Disposition: inline; filename="tickets.pdf"');
header('Cache-Control: private, max-age=0, must-revalidate');
header('Pragma: public');
readfile($filename);
 
unlink($filename);
 
return true;
}
 
/**
* Generate HTML document from the template.
*
* @param string $output File name of the generated template.
*
* @return bool Result of the generation (true if success).
*/
private function generateHtml($output)
{
if (file_exists($output)) {
return false;
}
 
if (!file_exists($this->template)) {
return false;
}
 
$language = $this->language;
$users = $this->tickets;
 
ob_start();
require($this->template);
$content = ob_get_clean();
 
$ret = file_put_contents($output, $content);
if ($ret === false) {
return false;
}
 
return true;
}
}
Property changes:
Added: svn:keywords
+Id
\ No newline at end of property
/web/acc/manager/lib/alcasar/tickets.template.php
0,0 → 1,134
<?php
/**
* Tickets template for TicketsGenerator
*
* @author Tom Houdayer
* @copyright Copyright (C) ALCASAR (http://www.alcasar.net)
* @license GPL-3.0
* @version $Id$
*/
 
$langue_imp = $language;
require __DIR__ . '/../langues_imp.php';
 
$img_logoAlcasar = __DIR__ . '/../../../../images/logo-alcasar.png';
$img_logoOrganization = __DIR__ . '/../../../../images/organisme.png';
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<style>
body {
margin: 0;
}
.ticket {
margin: 20px 0;
width: 50%;
display: inline-block;
font-family: Arial;
font-size: 10px;
line-height: 20px;
}
.ticket-header {
min-height: 40px;
line-height: 40px;
font-size: 12px;
text-align: center;
}
.ticket-header > .ticket-title {
color: red;
font-weight: bold;
}
.ticket-box {
position: relative;
border: 1px solid black;
border-radius: 10px;
width: 275px;
margin: 0 auto;
}
.ticket-box > .logo {
position: absolute;
display: inline-block;
width: 80px;
height: 80px;
text-align: center;
}
.ticket-box > .logo img {
max-width: 100%;
max-height: 100%;
}
.ticket-box > .logo-alcasar {
top: -40px;
left: -40px;
}
.ticket-box > .logo-organization {
top: -40px;
right: -40px;
}
.ticket-body {
position: relative;
z-index: 10;
padding: 5px;
}
.ticket-body > div > span {
display: inline-block;
}
.ticket-body > div.spacer {
height: 12px;
}
.ticket-body > div > span.key {
width: 50%;
text-align: right;
}
.ticket-body > div > span.value {
width: 50%;
font-weight: bold;
}
.ticket-footer > .infos {
font-size: 9px;
height: 70px;
}
.center {
text-align: center;
}
</style>
</head>
<body>
<?php foreach ($users as $user):
?><div class="ticket">
<div class="ticket-header">
<span class="ticket-title"><?= $l_title_imp ?></span>
</div>
<div class="ticket-box">
<div class="logo logo-alcasar"><img src="<?= $img_logoAlcasar ?>" alt=""></div>
<div class="logo logo-organization"><img src="<?= $img_logoOrganization ?>" alt=""></div>
<div class="ticket-body">
<div class="spacer"></div>
<div><span class="key"><?= $l_login_imp ?>&nbsp;</span><span class="value"><?= $user->username ?></span></div>
<div><span class="key"><?= $l_password_imp ?>&nbsp;</span><span class="value"><?= $user->password ?></span></div>
<div class="spacer"></div>
<div><span class="key"><?= $l_max_all_session_imp ?>&nbsp;</span><span class="value"><?= $user->maxAllSession ?></span></div>
<div><span class="key"><?= $l_session_timeout_imp ?>&nbsp;</span><span class="value"><?= $user->sessionTimeout ?></span></div>
<div><span class="key"><?= $l_max_daily_session_imp ?>&nbsp;</span><span class="value"><?= $user->maxDailySession ?></span></div>
<div><span class="key"><?= $l_expiration_imp ?>&nbsp;</span><span class="value"><?= $user->expiration ?></span></div>
<div class="spacer"></div>
</div>
</div>
<div class="ticket-footer">
<?php if ($user->isDuplicate): ?>
<div class="infos center">
<p><?= $l_duplicate ?></p>
</div>
<?php else: ?>
<div class="infos">
<p><?= nl2br($l_explain, false) ?></p>
</div>
<?php endif; ?>
<div class="credits center"><?= $l_footer_imp ?></div>
</div>
</div><?php
endforeach; ?>
</body>
</html>
 
Property changes:
Added: svn:keywords
+Id
\ No newline at end of property