33require
'../main.inc.php';
34require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formcompany.class.php';
35require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
36require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
37require_once DOL_DOCUMENT_ROOT.
'/user/class/user.class.php';
38require_once DOL_DOCUMENT_ROOT.
'/hrm/class/job.class.php';
39require_once DOL_DOCUMENT_ROOT.
'/hrm/class/skill.class.php';
40require_once DOL_DOCUMENT_ROOT.
'/hrm/class/skillrank.class.php';
41require_once DOL_DOCUMENT_ROOT.
'/hrm/lib/hrm_skill.lib.php';
42require_once DOL_DOCUMENT_ROOT.
'/hrm/class/evaluation.class.php';
43require_once DOL_DOCUMENT_ROOT.
'/hrm/lib/hrm_evaluation.lib.php';
44require_once DOL_DOCUMENT_ROOT.
'/hrm/class/evaluationdet.class.php';
47$langs->loadLangs(array(
'hrm',
'companies',
'other'));
50$action =
GETPOST(
'action',
'aZ09');
51$confirm =
GETPOST(
'confirm',
'alpha');
52$cancel =
GETPOST(
'cancel',
'aZ09');
53$contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') :
'skillcard';
54$backtopage =
GETPOST(
'backtopage',
'alpha');
55$backtopageforcancel =
GETPOST(
'backtopageforcancel',
'alpha');
58$TSkillsToAdd =
GETPOST(
'fk_skill',
'array');
59$objecttype =
GETPOST(
'objecttype',
'alpha');
60$TNote =
GETPOST(
'TNote',
'array');
63if (empty($objecttype)) {
67$TAuthorizedObjects = array(
'job',
'user');
71if (in_array($objecttype, $TAuthorizedObjects)) {
72 if ($objecttype ==
'job') {
74 } elseif ($objecttype ==
"user") {
81$hookmanager->initHooks(array(
'skilltab',
'globalcard'));
84include DOL_DOCUMENT_ROOT .
'/core/actions_fetchobject.inc.php';
85if (method_exists(
$object,
'loadPersonalConf')) {
90$permissiontoread = $user->hasRight(
'hrm',
'all',
'read');
91$permissiontoadd = $user->hasRight(
'hrm',
'all',
'write');
94if ($user->socid > 0) {
97if (!isModEnabled(
'hrm')) {
100if (!$permissiontoread) {
109$parameters = array();
110$reshook = $hookmanager->executeHooks(
'doActions', $parameters,
$object, $action);
115if (empty($reshook)) {
118 $backurlforlist = DOL_URL_ROOT.
'/hrm/skill_list.php';
120 if (empty($backtopage) || ($cancel && empty($id))) {
121 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
122 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
123 $backtopage = $backurlforlist;
125 $backtopage = DOL_URL_ROOT.
'/hrm/skill_list.php?id=' . (
$id > 0 ?
$id :
'__ID__');
131 if ($action ==
'setnational_registration_number' && $permissiontoadd) {
132 $object->national_registration_number = (string)
GETPOST(
'national_registration_number',
'alphanohtml');
133 $result =
$object->update($user);
139 if ($action ==
'addSkill' && $permissiontoadd) {
143 if (empty($TSkillsToAdd)) {
149 foreach ($TSkillsToAdd as $k => $v) {
151 $skillAdded->fk_skill = $v;
152 $skillAdded->fk_object =
$id;
153 $skillAdded->objecttype = $objecttype;
154 $ret = $skillAdded->create($user);
161 $sql_eval =
"SELECT e.rowid FROM ".MAIN_DB_PREFIX.
"hrm_evaluation as e";
162 $sql_eval .=
" WHERE e.status = 0 ";
164 $sql_eval .=
" AND e.fk_job = ".(int)
$object->id;
165 $result = $db->query($sql_eval);
166 $numEvals = $db->num_rows($result);
168 while ($i < $numEvals) {
169 $objEval = $db->fetch_object($result);
171 $line->fk_evaluation = $objEval->rowid;
172 $line->fk_skill = $v;
173 $line->required_rank = 0;
176 $res = $line->create($user);
193 } elseif ($action ==
'saveSkill' && $permissiontoadd) {
194 if (!empty($TNote)) {
197 foreach ($TNote as $skillId => $rank) {
198 $rank = ($rank ==
"NA" ? -1 : $rank);
199 $TSkills = $skill->fetchAll(
'ASC',
't.rowid', 0, 0,
'(fk_object:=:'.((
int) $id).
") AND (objecttype:=:'".$db->escape($objecttype).
"') AND (fk_skill:=:".((int) $skillId).
')');
200 '@phan-var-force SkillRank[] $tSkills';
201 if (is_array($TSkills) && !empty($TSkills)) {
202 foreach ($TSkills as $tmpObj) {
203 $tmpObj->rankorder = $rank;
204 $ret = $tmpObj->update($user);
212 $sql_eval =
"SELECT e.rowid FROM ".MAIN_DB_PREFIX.
"hrm_evaluation as e";
213 $sql_eval .=
" WHERE e.status = 0 ";
214 $sql_eval .=
" AND e.entity = ".getEntity(
$object->element);
215 $sql_eval .=
" AND e.fk_job = ".(int)
$object->id;
216 $result = $db->query($sql_eval);
217 $numEvals = $db->num_rows($result);
219 while ($i < $numEvals) {
220 $objEval = $db->fetch_object($result);
222 $lines = $line->fetchAll(
'',
'', 0, 0,
'((fk_skill:=:'.((
int) $tmpObj->fk_skill).
') AND (fk_evaluation:=:'.((
int) $objEval->rowid).
'))');
223 if (is_array($lines)) {
224 foreach ($lines as $key => $evalline) {
226 if (is_object($evalline) && $evalline instanceof
EvaluationLine) {
227 $evalline->required_rank = $rank;
228 $ret = $evalline->update($user);
257 header(
"Location: " . DOL_URL_ROOT.
'/hrm/skill_tab.php?id=' .
$id.
'&objecttype=job');
260 } elseif ($action ==
'confirm_deleteskill' && $confirm ==
'yes' && $permissiontoadd) {
264 $ret = $skillToDelete->fetch($lineid);
267 $sql_eval =
"SELECT e.rowid FROM ".MAIN_DB_PREFIX.
"hrm_evaluation as e";
268 $sql_eval .=
" WHERE e.status = 0 ";
269 $sql_eval .=
" AND e.entity = ".getEntity(
$object->element);
270 $sql_eval .=
" AND e.fk_job = ".(int)
$object->id;
271 $result = $db->query($sql_eval);
272 $numEvals = $db->num_rows($result);
274 while ($i < $numEvals) {
275 $objEval = $db->fetch_object($result);
277 $lines = $line->fetchAll(
'',
'', 0, 0,
'((fk_skill:=:'.((
int) $skillToDelete->fk_skill).
') AND (fk_evaluation:=:'.((
int) $objEval->rowid).
'))');
278 if (is_array($lines)) {
279 foreach ($lines as $key => $evalline) {
281 if (is_object($evalline) && $evalline instanceof
EvaluationLine) {
282 $ret = $evalline->delete($user);
302 $ret = $skillToDelete->delete($user);
322$form =
new Form($db);
326$title = $langs->trans(
"RequiredSkills");
332if (
$object->id > 0 && (empty($action) || ($action !=
'edit' && $action !=
'create'))) {
333 $res =
$object->fetch_optionals();
336 if ($objecttype ==
'job') {
337 require_once DOL_DOCUMENT_ROOT .
'/hrm/lib/hrm_job.lib.php';
340 } elseif ($objecttype ==
"user") {
341 require_once DOL_DOCUMENT_ROOT .
"/core/lib/usergroups.lib.php";
353 if ($action ==
'ask_deleteskill') {
354 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&objecttype=' . $objecttype .
'&lineid=' . $lineid, $langs->trans(
'DeleteLine'), $langs->trans(
'ConfirmDeleteLine'),
'confirm_deleteskill',
'', 0, 1);
364 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
365 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters,
$object, $action);
366 if (empty($reshook)) {
367 $formconfirm .= $hookmanager->resPrint;
368 } elseif ($reshook > 0) {
369 $formconfirm = $hookmanager->resPrint;
378 if ($objecttype ==
'job') {
379 $linkback =
'<a href="' .
dol_buildpath(
'/hrm/job_list.php', 1) .
'?restore_lastsearch_values=1' . (!empty($socid) ?
'&socid=' . $socid :
'') .
'">' . $langs->trans(
"BackToList") .
'</a>';
381 $morehtmlref =
'<div class="refid">';
382 $morehtmlref .=
$object->label;
383 $morehtmlref .=
'</div>';
385 dol_banner_tab(
$object,
'id', $linkback, 1,
'rowid',
'rowid', $morehtmlref);
386 } elseif ($listLink !==
null) {
387 $linkback =
'<a href="' . $listLink .
'?restore_lastsearch_values=1' . (!empty($socid) ?
'&socid=' . $socid :
'') .
'">' . $langs->trans(
"BackToList") .
'</a>';
389 $morehtmlref =
'<a href="'.DOL_URL_ROOT.
'/user/vcard.php?id='.
$object->id.
'&output=file&file='.urlencode(
dol_sanitizeFileName(
$object->getFullName($langs).
'.vcf')).
'" class="refid" rel="noopener">';
390 $morehtmlref .=
img_picto($langs->trans(
"Download").
' '.$langs->trans(
"VCard"),
'vcard.png',
'class="valignmiddle marginleftonly paddingrightonly"');
391 $morehtmlref .=
'</a>';
393 $urltovirtualcard =
'/user/virtualcard.php?id='.((int)
$object->id);
394 $morehtmlref .=
dolButtonToOpenUrlInDialogPopup(
'publicvirtualcard', $langs->trans(
"PublicVirtualCardUrl").
' - '.
$object->getFullName($langs),
img_picto($langs->trans(
"PublicVirtualCardUrl"),
'card',
'class="valignmiddle marginleftonly paddingrightonly"'), $urltovirtualcard,
'',
'nohover');
396 dol_banner_tab(
$object,
'id', $linkback, 1,
'rowid',
'rowid', $morehtmlref,
'&objecttype='.$objecttype);
400 $static_skill =
new Skill($db);
401 $TAllSkills = $static_skill->fetchAll();
404 $TAllSkillsFormatted = array();
405 if (!empty($TAllSkills)) {
406 foreach ($TAllSkills as $k => $v) {
407 $TAllSkillsFormatted[$k] = $v->label;
413 $sql_skill =
"SELECT sr.fk_object, sr.rowid, s.label,s.skill_type, sr.rankorder, sr.fk_skill";
414 $sql_skill .=
" FROM ".MAIN_DB_PREFIX.
"hrm_skillrank AS sr";
415 $sql_skill .=
" JOIN ".MAIN_DB_PREFIX.
"hrm_skill AS s ON sr.fk_skill = s.rowid";
416 $sql_skill .=
" AND sr.fk_object = ".((int) $id);
417 $result = $db->query($sql_skill);
418 $numSkills = $db->num_rows($result);
419 $TSkillsJob = array();
420 for ($i = 0; $i < $numSkills; $i++) {
421 $objSkillRank = $db->fetch_object($result);
422 $TSkillsJob[] = $objSkillRank;
425 $TAlreadyUsedSkill = array();
426 if (is_array($TSkillsJob) && !empty($TSkillsJob)) {
427 foreach ($TSkillsJob as $skillElement) {
428 $TAlreadyUsedSkill[$skillElement->fk_skill] = $skillElement->fk_skill;
432 print
'<div class="fichecenter">';
433 print
'<div class="fichehalfleft">';
435 print
'<div class="underbanner clearboth"></div>';
436 print
'<table class="border centpercent tableforfield">'.
"\n";
438 if ($objecttype ==
'job') {
443 $object->fields[
'label'][
'visible'] = 0;
444 include DOL_DOCUMENT_ROOT .
'/core/tpl/commonfields_view.tpl.php';
447 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_view.tpl.php';
450 print
'<tr><td class="titlefield">'.$langs->trans(
"Login").
'</td>';
452 print
'<td class="error">';
453 print $langs->trans(
"LoginAccountDisableInDolibarr");
458 if (property_exists(
$object,
'admin')) {
459 if (isModEnabled(
'multicompany') && !empty(
$object->admin) && empty(
$object->entity)) {
460 $addadmin .=
img_picto($langs->trans(
"SuperAdministratorDesc"),
"redstar",
'class="paddingleft"');
461 } elseif (!empty(
$object->admin)) {
462 $addadmin .=
img_picto($langs->trans(
"AdministratorDesc"),
"star",
'class="paddingleft"');
470 $object->fields[
'label'][
'visible'] = 0;
471 $object->fields[
'firstname'][
'visible'] = 0;
472 $object->fields[
'lastname'][
'visible'] = 0;
476 print
'<tr><td class="titlefield">'.$langs->trans(
"RefEmployee").
'</td>';
477 print
'<td class="error">';
483 print
'<tr><td class="titlefield">'.$langs->trans(
"NationalRegistrationNumber").
' <a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&objecttype=user&action=editnational_registration_number&token='.
newToken().
'">'.
img_picto($langs->trans(
"Edit"),
'edit').
'</a></td>';
485 if ($action ==
'editnational_registration_number') {
486 $ret =
'<form method="post" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&objecttype=user">';
487 $ret .=
'<input type="hidden" name="action" value="setnational_registration_number">';
488 $ret .=
'<input type="hidden" name="token" value="'.newToken().
'">';
489 $ret .=
'<input type="hidden" name="id" value="'.$object->id.
'">';
490 $ret .=
'<input type="text" name="national_registration_number" value="'.$object->national_registration_number.
'">';
491 $ret .=
'<input type="submit" class="button smallpaddingimp" name="modify" value="'.$langs->trans(
"Modify").
'"> ';
492 $ret .=
'<input type="submit" class="button smallpaddingimp button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
508 print
'<div class="clearboth"></div><br>';
510 if ($objecttype !=
'user' && $permissiontoadd) {
513 print
'<form name="addSkill" method="post" action="' . $_SERVER[
'PHP_SELF'] .
'">';
514 print
'<input type="hidden" name="objecttype" value="' . $objecttype .
'">';
515 print
'<input type="hidden" name="id" value="' .
$id .
'">';
516 print
'<input type="hidden" name="action" value="addSkill">';
517 print
'<input type="hidden" name="token" value="'.newToken().
'">';
518 print
'<div class="div-table-responsive-no-min">';
519 print
'<table id="tablelines" class="noborder noshadow" width="100%">';
520 print
'<tr><td style="width:90%">' . $langs->trans(
'AddSkill') .
'</td><td style="width:10%"></td></tr>';
523 print
img_picto(
'',
'shapes',
'class="pictofixedwidth"');
524 print $form->multiselectarray(
'fk_skill', array_diff_key($TAllSkillsFormatted, $TAlreadyUsedSkill), array(), 0, 0,
'widthcentpercentminusx') .
'</td>';
525 print
'<td><input class="button reposition" type="submit" value="' . $langs->trans(
'Add') .
'"></td>';
533 print
'<div class="clearboth"></div>';
535 if ($objecttype !=
'user' && $permissiontoadd) {
536 print
'<form name="saveSkill" method="post" action="' . $_SERVER[
'PHP_SELF'] .
'">';
537 print
'<input type="hidden" name="objecttype" value="' . $objecttype .
'">';
538 print
'<input type="hidden" name="id" value="' .
$id .
'">';
539 print
'<input type="hidden" name="token" value="'.newToken().
'">';
540 print
'<input type="hidden" name="action" value="saveSkill">';
542 if ($objecttype !=
'user') {
543 print
'<div class="div-table-responsive-no-min">';
544 print
'<table id="tablelines" class="noborder centpercent" width="100%">';
545 print
'<tr class="liste_titre">';
546 print
'<th>'.$langs->trans(
'SkillType').
'</th>';
547 print
'<th>'.$langs->trans(
'Label').
'</th>';
548 print
'<th>'.$langs->trans(
'Description').
'</th>';
549 print
'<th>'.$langs->trans($objecttype ===
'job' ?
'RequiredRank' :
'EmployeeRank').
'</th>';
550 if ($objecttype ===
'job') {
551 print
'<th class="linecoledit"></th>';
552 print
'<th class="linecoldelete"></th>';
555 if (!is_array($TSkillsJob) || empty($TSkillsJob)) {
556 print
'<tr><td><span class="opacitymedium">' . $langs->trans(
"NoRecordFound") .
'</span></td></tr>';
558 $sk =
new Skill($db);
559 foreach ($TSkillsJob as $skillElement) {
560 $sk->fetch((
int) $skillElement->fk_skill);
564 print
'</td><td class="linecolfk_skill">';
565 print $sk->getNomUrl(1);
568 print $sk->description;
569 print
'</td><td class="linecolrank">';
570 print
displayRankInfos($skillElement->rankorder, $skillElement->fk_skill,
'TNote', $objecttype ==
'job' && $permissiontoadd ?
'edit' :
'view');
572 if ($objecttype !=
'user' && $permissiontoadd) {
573 print
'<td class="linecoledit"></td>';
574 print
'<td class="linecoldelete">';
575 print
'<a class="reposition" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' . $skillElement->fk_object .
'&objecttype=' . $objecttype .
'&action=ask_deleteskill&lineid=' . $skillElement->rowid .
'&token='.newToken().
'">';
585 if ($objecttype !=
'user' && $permissiontoadd) {
586 print
'<td><input class="button pull-right" type="submit" value="' . $langs->trans(
'SaveRank') .
'"></td>';
589 if ($objecttype !=
'user' && $permissiontoadd) {
596 if ($objecttype ==
'user' && $permissiontoadd) {
599 $sql =
"select e.rowid,e.ref,e.fk_user,e.fk_job,e.date_eval,ed.rankorder,ed.required_rank,ed.fk_skill,s.label";
600 $sql .=
" FROM ".MAIN_DB_PREFIX.
"hrm_evaluation as e";
601 $sql .=
", ".MAIN_DB_PREFIX.
"hrm_evaluationdet as ed";
602 $sql .=
", ".MAIN_DB_PREFIX.
"hrm_skill as s";
603 $sql .=
" WHERE e.rowid = ed.fk_evaluation";
604 $sql .=
" AND s.rowid = ed.fk_skill";
605 $sql .=
" AND e.fk_user = ".((int) $id);
606 $sql .=
" AND e.status > 0";
607 $resql = $db->query($sql);
608 $num = $db->num_rows($resql);
611 $sqlEval =
"SELECT rowid FROM ".MAIN_DB_PREFIX.
"hrm_evaluation as e";
612 $sqlEval .=
" WHERE e.fk_user = ".((int) $id);
613 $rslt = $db->query($sqlEval);
614 $numEval = $db->num_rows($rslt);
617 print_barre_liste($langs->trans(
"Evaluations"), $page, $_SERVER[
"PHP_SELF"],
'',
'',
'',
'', $numEval, $numEval, $evaltmp->picto, 0);
619 print
'<div class="div-table-responsive-no-min">';
620 print
'<table id="tablelines" class="noborder centpercent">';
621 print
'<tr class="liste_titre">';
622 print
'<th>'.$langs->trans(
'Label').
'</th>';
623 print
'<th>'.$langs->trans(
'Description').
'</th>';
624 print
'<th>'.$langs->trans(
'DateEval').
'</th>';
625 print
'<th>'.$langs->trans(
'Status').
'</th>';
626 print
'<th>'.$langs->trans(
"Result").
' ' .$form->textwithpicto(
'',
GetLegendSkills(), 1) .
'</th>';
629 print
'<tr><td><span class="opacitymedium">' . $langs->trans(
"NoRecordFound") .
'</span></td></tr>';
636 $obj = $db->fetch_object($resql);
643 foreach ($resultArray as
$object) {
645 $evaltmp->fetch(
$object[0]->rowid);
646 $evaltmp->id =
$object[0]->rowid;
647 $evaltmp->ref =
$object[0]->ref;
648 $job->fetch(
$object[0]->fk_job);
651 $evaltmp->fetch(
$object->rowid);
657 print
'<td class="nowraponall">';
658 print $evaltmp->getNomUrl(1);
659 print
'</td><td class="linecolfk_skill">';
660 print $job->getNomUrl(1);
665 print $evaltmp->getLibStatut(2);
667 print
'<td class="linecolrank tdoverflowmax300">';
673 print $skill->result;
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Class for EvaluationLine.
static typeCodeToLabel($code)
Class to manage Dolibarr users.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $selectlimitsuffix=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
showValueWithClipboardCPButton($valuetocopy, $showonlyonhover=1, $texttoshow='')
Create a button to copy $valuetocopy in the clipboard (for copy and paste feature).
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled='', $morecss='classlink button bordertransp', $jsonopen='', $backtopagejsfields='', $accesskey='')
Return HTML code to output a button to open a dialog popup box.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0, $attop=0)
Set event message in dol_events session object.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
newToken()
Return the value of token currently saved into session with name 'newtoken'.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
getRankOrderResults($obj)
getGroupedEval($objects)
Grouped rows with same ref in array.
jobPrepareHead($object)
Prepare array of tabs for Job.
displayRankInfos($selected_rank, $fk_skill, $inputname='TNote', $mode='view')
Used to print ranks of a skill into several case, view or edit pour js necessary to select a rank.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.
user_prepare_head(User $object)
Prepare array with list of tabs.