Estou utilizando um sistema de Ambiente Virtual de Aprendizagem chamado E-Front. Excelente Sistema.
Instalei um módulo para gerar certificados de conclusão, mas ele não gera caso o título do curso ou nome do aluno possuam acentos (áéíóú, ãõ, etc).
Já tentei de tudo, verifiquei que existe um arquivo chamado encryt.php que reconhece como caracteres inválidos caso o nome possua acento.
Será que alguém pode me ajudar a resolver isso?
Segue os códigos do módulo (module_pdfcert):
encrypt.php
<?php
// ******************************************************************************
// A reversible password encryption routine by:
// Copyright 2003-2009 by A J Marston <http://www.tonymarston.net>
// Distributed under the GNU General Public Licence
// Modification: May 2007, M. Kolar <http://mkolar.org>:
// No need for repeating the first character of scramble strings at the end;
// instead using the exact inverse function transforming $num2 to $num1.
// Modification: Jan 2009, A J Marston <http://www.tonymarston.net>:
// Use mb_substr() if it is available (for multibyte characters).
// ******************************************************************************
class encryption_class {
var $scramble1; // 1st string of ASCII characters
var $scramble2; // 2nd string of ASCII characters
var $errors; // array of error messages
var $adj; // 1st adjustment value (optional)
var $mod; // 2nd adjustment value (optional)
// ****************************************************************************
// class constructor
// ****************************************************************************
function encryption_class ()
{
$this->errors = array();
// Each of these two strings must contain the same characters, but in a different order.
// Use only printable characters from the ASCII table.
// Do not use single quote, double quote or backslash as these have special meanings in PHP.
// Each character can only appear once in each string.
$this->scramble1 = '! #$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~';
$this->scramble2 = 'f^jAE]okIOzU[2&q1{3`h5w_794p@6s8?BgP>dFV=m D<TcS%Ze|r:lGK/uCy.Jx)HiQ!#$~(;Lt-R}Ma,NvW+Ynb*0X';
if (strlen($this->scramble1) <> strlen($this->scramble2)) {
trigger_error('** SCRAMBLE1 is not same length as SCRAMBLE2 **', E_USER_ERROR);
} // if
$this->adj = 1.75; // this value is added to the rolling fudgefactors
$this->mod = 3; // if divisible by this the adjustment is made negative
} // constructor
// ****************************************************************************
function decrypt ($key, $source)
// decrypt string into its original form
{
$this->errors = array();
// convert $key into a sequence of numbers
$fudgefactor = $this->_convertKey($key);
if ($this->errors) return;
if (empty($source)) {
$this->errors[] = 'No value has been supplied for decryption';
return;
} // if
$target = null;
$factor2 = 0;
for ($i = 0; $i < strlen($source); $i++) {
// extract a (multibyte) character from $source
if (function_exists('mb_substr')) {
$char2 = mb_substr($source, $i, 1);
} else {
$char2 = substr($source, $i, 1);
} // if
// identify its position in $scramble2
$num2 = strpos($this->scramble2, $char2);
if ($num2 === false) {
$this->errors[] = "Source string contains an invalid character ($char2)";
return;
} // if
// get an adjustment value using $fudgefactor
$adj = $this->_applyFudgeFactor($fudgefactor);
$factor1 = $factor2 + $adj; // accumulate in $factor1
$num1 = $num2 - round($factor1); // generate offset for $scramble1
$num1 = $this->_checkRange($num1); // check range
$factor2 = $factor1 + $num2; // accumulate in $factor2
// extract (multibyte) character from $scramble1
if (function_exists('mb_substr')) {
$char1 = mb_substr($this->scramble1, $num1, 1);
} else {
$char1 = substr($this->scramble1, $num1, 1);
} // if
// append to $target string
$target .= $char1;
//echo "char1=$char1, num1=$num1, adj= $adj, factor1= $factor1, num2=$num2, char2=$char2, factor2= $factor2<br />\n";
} // for
return rtrim($target);
} // decrypt
// ****************************************************************************
function encrypt ($key, $source, $sourcelen = 0)
// encrypt string into a garbled form
{
$this->errors = array();
// convert $key into a sequence of numbers
$fudgefactor = $this->_convertKey($key);
if ($this->errors) return;
if (empty($source)) {
$this->errors[] = 'No value has been supplied for encryption';
return;
} // if
// pad $source with spaces up to $sourcelen
$source = str_pad($source, $sourcelen);
$target = null;
$factor2 = 0;
for ($i = 0; $i < strlen($source); $i++) {
// extract a (multibyte) character from $source
if (function_exists('mb_substr')) {
$char1 = mb_substr($source, $i, 1);
} else {
$char1 = substr($source, $i, 1);
} // if
// identify its position in $scramble1
$num1 = strpos($this->scramble1, $char1);
if ($num1 === false) {
$this->errors[] = "Source string contains an invalid character ($char1)";
return;
} // if
// get an adjustment value using $fudgefactor
$adj = $this->_applyFudgeFactor($fudgefactor);
$factor1 = $factor2 + $adj; // accumulate in $factor1
$num2 = round($factor1) + $num1; // generate offset for $scramble2
$num2 = $this->_checkRange($num2); // check range
$factor2 = $factor1 + $num2; // accumulate in $factor2
// extract (multibyte) character from $scramble2
if (function_exists('mb_substr')) {
$char2 = mb_substr($this->scramble2, $num2, 1);
} else {
$char2 = substr($this->scramble2, $num2, 1);
} // if
// append to $target string
$target .= $char2;
//echo "char1=$char1, num1=$num1, adj= $adj, factor1= $factor1, num2=$num2, char2=$char2, factor2= $factor2<br />\n";
} // for
return $target;
} // encrypt
// ****************************************************************************
function getAdjustment ()
// return the adjustment value
{
return $this->adj;
} // setAdjustment
// ****************************************************************************
function getModulus ()
// return the modulus value
{
return $this->mod;
} // setModulus
// ****************************************************************************
function setAdjustment ($adj)
// set the adjustment value
{
$this->adj = (float)$adj;
} // setAdjustment
// ****************************************************************************
function setModulus ($mod)
// set the modulus value
{
$this->mod = (int)abs($mod); // must be a positive whole number
} // setModulus
// ****************************************************************************
// private methods
// ****************************************************************************
function _applyFudgeFactor (&$fudgefactor)
// return an adjustment value based on the contents of $fudgefactor
// NOTE: $fudgefactor is passed by reference so that it can be modified
{
$fudge = array_shift($fudgefactor); // extract 1st number from array
$fudge = $fudge + $this->adj; // add in adjustment value
$fudgefactor[] = $fudge; // put it back at end of array
if (!empty($this->mod)) { // if modifier has been supplied
if ($fudge % $this->mod == 0) { // if it is divisible by modifier
$fudge = $fudge * -1; // make it negative
} // if
} // if
return $fudge;
} // _applyFudgeFactor
// ****************************************************************************
function _checkRange ($num)
// check that $num points to an entry in $this->scramble1
{
$num = round($num); // round up to nearest whole number
$limit = strlen($this->scramble1);
while ($num >= $limit) {
$num = $num - $limit; // value too high, so reduce it
} // while
while ($num < 0) {
$num = $num + $limit; // value too low, so increase it
} // while
return $num;
} // _checkRange
// ****************************************************************************
function _convertKey ($key)
// convert $key into an array of numbers
{
if (empty($key)) {
$this->errors[] = 'No value has been supplied for the encryption key';
return;
} // if
$array[] = strlen($key); // first entry in array is length of $key
$tot = 0;
for ($i = 0; $i < strlen($key); $i++) {
// extract a (multibyte) character from $key
if (function_exists('mb_substr')) {
$char = mb_substr($key, $i, 1);
} else {
$char = substr($key, $i, 1);
} // if
// identify its position in $scramble1
$num = strpos($this->scramble1, $char);
if ($num === false) {
$this->errors[] = "Key contains an invalid character ($char)";
return;
} // if
$array[] = $num; // store in output array
$tot = $tot + $num; // accumulate total for later
} // for
$array[] = $tot; // insert total as last entry in array
return $array;
} // _convertKey
// ****************************************************************************
} // end encryption_class
// ****************************************************************************
?>
module_pdfcert.class.php
<?php
//===================
// For debugging, do the following:
// Open /libraries/globals.php
//
// comment error_reporting(E_ERROR);
// uncomment error_reporting(E_ALL); ini_set("display_errors",true);
//
// On about line 130 change define("G_DEBUG",0); to a value of 1
// comment out the line: $GLOBALS['db'] -> debug = true;
//
// smsoa / placitas
// Christine / nicks
//===================
require 'encrypt.php';
class module_pdfcert extends EfrontModule {
//--------------------------------------------------------
// Mandatory functions required for module function
//--------------------------------------------------------
public function getName() {
return _PDFCERT_TITLE;
}
//--------------------------------------------------------
// getPermittedRoles
// The certificate page will only appear
//--------------------------------------------------------
public function getPermittedRoles() {
return array('professor','student');
}
//--------------------------------------------------------
// Optional functions
// What should happen on installing the module
//--------------------------------------------------------
public function onInstall() {
return true;
}
//--------------------------------------------------------
// onUninstall
// When the module is uninstalled, delete the corresponding
// database tables.
//--------------------------------------------------------
public function onUninstall() {
return true;
}
//--------------------------------------------------------
// onDeleteLesson
// When a lesson is deleted, this method will delete the
// pdfcert records for the specified lesson.
//--------------------------------------------------------
public function onDeleteLesson($lessonId) {
return false;
}
//--------------------------------------------------------
// OnExportLesson
// This method is called when the user exports a lesson.
//--------------------------------------------------------
public function onExportLesson($lessonId) {
return false;
}
//--------------------------------------------------------
// onImportLesson
// This method is called when the user imports a lesson
//--------------------------------------------------------
public function onImportLesson($lessonId, $data) {
return false;
}
//--------------------------------------------------------
// getCenterLinkInfo
// Defines any links for the Administrator menu
//--------------------------------------------------------
public function getCenterLinkInfo() {
$optionArray = array('title' => _PDFCERT_TITLE,
'image' => $this -> moduleBaseDir.'images/certificate32.png',
'link' => $this -> moduleBaseUrl);
$centerLinkInfo = $optionArray;
return $centerLinkInfo;
}
//--------------------------------------------------------
// getLessonCenterLinkInfo
// Returns links for the defined users control panel.
//--------------------------------------------------------
public function getLessonCenterLinkInfo() {
return false;
}
//--------------------------------------------------------
// getSidebarLinkInfo
// This method defines the Menu Links that will appear by
// user and what menu they appear in. This code displays
// in the sidebar for professor and student.
//--------------------------------------------------------
public function getSidebarLinkInfo() {
$currentUser = $this -> getCurrentUser();
if($currentUser->getType() == "administrator"){}
if($currentUser->getType() == "professor"){}
else
{
//Menu will only appear for the student
$link_of_menu_lessons = array (array ('id' => 'other_link_id1',
'title' => 'Certificates',
'image' => $this -> moduleBaseDir . 'images/certificate16',
'eFrontExtensions' => '1',
'link' => $this -> moduleBaseUrl));
}
return array ( "tools" => $link_of_menu_lessons);
}
//--------------------------------------------------------
// getNavigationLinks
//--------------------------------------------------------
public function getNavigationLinks() {
return array (array ('title' => 'Meus Cursos',
'link' => 'student.php?ctg=lessons'),
array ('title' => _PDFCERT,
'link' => $this -> moduleBaseUrl));
}
//--------------------------------------------------------
// getLinkToHighlight
//--------------------------------------------------------
public function getLinkToHighlight() {
return 'module_pdfcert';
}
public function isLessonModule(){
return false;
}
//--------------------------------------------------------
// onCompleteLesson
//--------------------------------------------------------
public function onCompleteLesson($lessonId, $login) {
return false;
}
//--------------------------------------------------------
// getModule
// This method handles the all of the logic for the module.
//--------------------------------------------------------
public function getModule() {
// Get smarty variable
$smarty = $this -> getSmartyVar();
$currentLesson = $this -> getCurrentLesson();
$currentUser = $this -> getCurrentUser();
$currentLogin = $currentUser->login;
$smarty -> assign("T_PDFCERT_GENERATOR", $this->moduleBaseLink."certificates/certificate.php");
$smarty -> assign("T_PDFCERT_TARGET", $this->moduleBaseLink);
try {
$crypt = new encryption_class;
//Get the users Course
$aCourse = eF_getTableData("users_to_courses u inner join courses c on u.courses_ID = c.id",
"c.id as course_id, c.name, u.completed",
"users_LOGIN='".$currentLogin."' and u.archive = 0");
//print_r($aCourse);
//exit;
/*
$coursekey = null;
if($aCourse[0]['completed'] == 1)
{
$coursekey = $crypt->encrypt('ZIPPITYDOODAH', $currentUser->user['name'].'|'.$currentUser->user['surname'].'|'.$aCourse[0]['name'], 80);
$smarty -> assign("T_PDFCERT_COURSE_KEY", $coursekey);
}
*/
// Create an array to hold the courses this individual is in.
// If the course is marked as completed, encrypt the
for($cnt = 0; $cnt < count($aCourse); $cnt++)
{
if(intval($aCourse[$cnt][completed]) == 1)
{
$aTmp = array(
'id' => $aCourse[$cnt]['course_id'],
'name' => $aCourse[$cnt]['name'],
'enc' => $crypt->encrypt('ZIPPITYDOODAH', $currentUser->user['name'].'|'.$currentUser->user['surname'].'|'.$aCourse[0]['name'], 80)
);
}
else
{
$aTmp = array(
'id' => $aCourse[$cnt]['course_id'],
'name' => $aCourse[$cnt]['name'],
'enc' => ''
);
}
$aCourses[] = $aTmp;
}
$smarty -> assign("T_PDFCERT_COURSES", $aCourses); //Pass in the array of courses
//print_r($aCourses);
//echo "Get All Lessons";
//exit;
//$allLessons = eF_getTableData("courses as c inner join lessons_to_courses lc on c.id = lc.courses_ID inner join lessons as l on lc.lessons_ID = l.id inner join tests as t on t.lessons_ID = l.id left join completed_tests as ct on ct.tests_ID = t.id and ct.status != 'deleted' and ct.users_LOGIN = '".$currentLogin."'",
// "lc.courses_ID, lc.lessons_ID, l.name, t.mastery_score, ct.status, ct.score",
// "order by c.id, l.name asc");
//$sql = "select ".
// " uc.courses_ID,lc.lessons_ID , l.`name`, t.mastery_score, completed_tests.score ".
// "from ".
// " users_to_courses AS uc ".
// " INNER JOIN lessons_to_courses AS lc ON uc.courses_ID = lc.courses_ID ".
// " INNER JOIN lessons AS l ON l.id = lc.lessons_ID ".
// " LEFT JOIN tests AS t ON t.lessons_ID = lc.lessons_ID ".
// " LEFT JOIN completed_tests ON completed_tests.users_LOGIN = uc.users_LOGIN ".
// "where ".
// " uc.users_LOGIN = '".$currentLogin."' and uc.archive = 0 ".
// "order by ".
// " courses_ID, l.name asc";
//belen/1954, erma/bobby20, will_gina/tafoya5659
$sql = "SELECT ".
"users_to_courses.courses_ID, lessons.`name`, s.* ".
"FROM ".
"users_to_courses ".
"INNER JOIN lessons_to_courses ON lessons_to_courses.courses_ID = users_to_courses.courses_ID AND users_to_courses.users_LOGIN = '".$currentLogin."' AND users_to_courses.archive = 0 ".
"INNER JOIN lessons ON lessons.id = lessons_to_courses.lessons_ID ".
"left join ".
"(SELECT completed_tests.score, tests.mastery_score, completed_tests.archive, tests.lessons_ID FROM completed_tests INNER JOIN tests ON tests.id = completed_tests.tests_ID where users_LOGIN = '".$currentLogin."' and completed_tests.archive=0) AS s ".
"on lessons_to_courses.lessons_ID = s.lessons_ID ".
"order by ".
"users_to_courses.courses_ID, lessons.`name` asc";
$allLessons = $GLOBALS['db'] -> GetAll($sql);
//echo "Query for Lessons";
//print_r($allLessons);
//exit;
/* -----------------------------------------------------------------------------------
Note: Per periklis uc.archive = 0 means the student is in the course. A value in this
field indicates a timestamp when they were removed
SELECT
uc.courses_ID,
lc.lessons_ID,
l.`name`,
t.mastery_score,
completed_tests.score
FROM
users_to_courses AS uc
INNER JOIN lessons_to_courses AS lc ON uc.courses_ID = lc.courses_ID
INNER JOIN lessons AS l ON l.id = lc.lessons_ID
LEFT JOIN tests AS t ON t.lessons_ID = lc.lessons_ID
LEFT JOIN completed_tests ON completed_tests.users_LOGIN = uc.users_LOGIN
where
uc.users_LOGIN = 'student' and uc.active = 1
order by
courses_ID, l.name asc
SELECT DISTINCT
users_to_courses.courses_ID,
lessons.`name`, s.*
FROM
users_to_courses
INNER JOIN lessons_to_courses ON lessons_to_courses.courses_ID = users_to_courses.courses_ID AND users_to_courses.users_LOGIN = 'student' AND users_to_courses.archive = 0
INNER JOIN lessons ON lessons.id = lessons_to_courses.lessons_ID ,
(select completed_tests.score, tests.mastery_score, completed_tests.archive from completed_tests, tests where users_LOGIN = 'student' and completed_tests.archive=0) AS s
order by
users_to_courses.courses_ID, lessons.`name` asc
SELECT DISTINCT
users_to_courses.courses_ID,
lessons.`name`,
s.*
FROM
users_to_courses
INNER JOIN lessons_to_courses ON lessons_to_courses.courses_ID = users_to_courses.courses_ID AND users_to_courses.users_LOGIN = 'student' AND users_to_courses.archive = 0
INNER JOIN lessons ON lessons.id = lessons_to_courses.lessons_ID
left join
(SELECT completed_tests.score, tests.mastery_score, completed_tests.archive, tests.lessons_ID FROM completed_tests INNER JOIN tests ON tests.id = completed_tests.tests_ID where users_LOGIN = 'student' and completed_tests.archive=0) AS s
on lessons_to_courses.lessons_ID = s.lessons_ID
order by
users_to_courses.courses_ID, lessons.`name` asc
---------------------------------------------------------------------------------------*/
//print_r($allLessons);
//exit;
$aLessons = array();
foreach ($allLessons as $student_lesson)
{
$genkey = null;
if($student_lesson['score'] != "")
{
if(intval($student_lesson['score']) >= intval($student_lesson['mastery_score']))
{
$fname = str_replace("'","$",$currentUser->user['name']);
$smarty -> assign("T_FNAME",$fname);
$lname = str_replace("'","$",$currentUser->user['surname']);
$smarty -> assign("T_LNAME",$lname);
$crs = str_replace("'","$",$student_lesson['name']);
$genkey = $crypt->encrypt('ZIPPITYDOODAH', $fname.'|'.$lname.'|'.$crs, 80);
}
else
{
$genkey = null;
}
}
$errors = $crypt->errors;
$lsson = str_replace(" EXAM",'',$student_lesson['name']);
$aLessons[] = array("courses_ID"=>$student_lesson['courses_ID'],
"lessons_ID"=>$student_lesson['lessons_ID'],
"users_LOGIN"=>$student_lesson['users_LOGIN'],
"name"=>$lsson,
"score"=>$student_lesson['score'],
"genkey"=>$genkey);
}
//print_r($aLessons);
//exit;
$smarty -> assign("T_PDFCERT_LESSONS", $aLessons);
$smarty -> assign("T_STUDENT_NAME", $currentUser-> user['name'].' '.$currentUser-> user['surname']);
$err = '';
foreach($errors as $error)
{
$err = $err.$error.'<br/>';
}
$smarty -> assign("T_PDFCERT_GENERR", $err);
return true;
}
catch (Exception $e){
$currentUser = EfrontUserFactory :: factory($_SESSION['s_login']);
$role = $currentUser -> getRole($this -> getCurrentLesson());
}
}
//--------------------------------------------------------
// getSmartyTpl
// Used to return the Smarty Template. In this case,
// module.tpl is selected. Values are passed into the
// smarty template.
//--------------------------------------------------------
public function getSmartyTpl() {
$smarty = $this -> getSmartyVar();
$smarty -> assign("T_PDFCERT_MODULE_BASEDIR" , $this -> moduleBaseDir);
$smarty -> assign("T_PDFCERT_MODULE_BASELINK" , $this -> moduleBaseLink);
return $this -> moduleBaseDir . "module.tpl";
}
//--------------------------------------------------------
// getLessonModule
//--------------------------------------------------------
public function getLessonModule() {
return false;
}
//--------------------------------------------------------
// getControlPanelSmartyTpl
//--------------------------------------------------------
public function getControlPanelSmartyTpl() {
return false;
}
//--------------------------------------------------------
// getControlPanelModuleS
//--------------------------------------------------------
public function getControlPanelModule() {
return false;
}
//--------------------------------------------------------
// getLessonSmartyTpl
//--------------------------------------------------------
public function getLessonSmartyTpl() {
return false;
}
//--------------------------------------------------------
// getModuleCSS
//--------------------------------------------------------
public function getModuleCSS()
{
return false;
}
}
?>
Question
fabio.schneider
Estou utilizando um sistema de Ambiente Virtual de Aprendizagem chamado E-Front. Excelente Sistema.
Instalei um módulo para gerar certificados de conclusão, mas ele não gera caso o título do curso ou nome do aluno possuam acentos (áéíóú, ãõ, etc).
Já tentei de tudo, verifiquei que existe um arquivo chamado encryt.php que reconhece como caracteres inválidos caso o nome possua acento.
Será que alguém pode me ajudar a resolver isso?
Segue os códigos do módulo (module_pdfcert):
encrypt.php
module_pdfcert.class.php module.tplTem outros códigos no módulo, mas eu acredito que o erro esteja no "encrypt.php".
Por favor me ajudem a corrigir isso. Obrigado
Link to comment
Share on other sites
2 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.