Files
MYSOPHAL/inc/knowbaseitem_revision.class.php
2025-08-07 13:15:31 +01:00

356 lines
13 KiB
PHP

<?php
/**
* ---------------------------------------------------------------------
* GLPI - Gestionnaire Libre de Parc Informatique
* Copyright (C) 2015-2020 Teclib' and contributors.
*
* http://glpi-project.org
*
* based on GLPI - Gestionnaire Libre de Parc Informatique
* Copyright (C) 2003-2014 by the INDEPNET Development Team.
*
* ---------------------------------------------------------------------
*
* LICENSE
*
* This file is part of GLPI.
*
* GLPI is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* GLPI is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GLPI. If not, see <http://www.gnu.org/licenses/>.
* ---------------------------------------------------------------------
*/
if (!defined('GLPI_ROOT')) {
die("Sorry. You can't access this file directly");
}
/// Class KnowbaseItem_Revision
/// since version 9.2
class KnowbaseItem_Revision extends CommonDBTM {
static function getTypeName($nb = 0) {
return _n('Revision', 'Revisions', $nb);
}
function getTabNameForItem(CommonGLPI $item, $withtemplate = 0) {
if (!$item->canUpdateItem()) {
return '';
}
$nb = 0;
if ($_SESSION['glpishow_count_on_tabs']) {
$where = [];
if ($item->getType() == KnowbaseItem::getType()) {
$where = [
'knowbaseitems_id' => $item->getID(),
'language' => ''
];
} else {
$where = [
'knowbaseitems_id' => $item->fields['knowbaseitems_id'],
'language' => $item->fields['language']
];
}
$nb = countElementsInTable(
'glpi_knowbaseitems_revisions',
$where
);
}
return self::createTabEntry(self::getTypeName($nb), $nb);
}
static function displayTabContentForItem(CommonGLPI $item, $tabnum = 1, $withtemplate = 0) {
self::showForItem($item, $withtemplate);
return true;
}
/**
* Show linked items of a knowbase item
*
* @param $item CommonDBTM object
* @param $withtemplate integer withtemplate param (default 0)
**/
static function showForItem(CommonDBTM $item, $withtemplate = 0) {
global $DB, $CFG_GLPI;
$item_id = $item->getID();
$item_type = $item::getType();
if (isset($_GET["start"])) {
$start = intval($_GET["start"]);
} else {
$start = 0;
}
// Total Number of revisions
if ($item->getType() == KnowbaseItem::getType()) {
$where = [
'knowbaseitems_id' => $item->getID(),
'language' => ''
];
} else {
$where = [
'knowbaseitems_id' => $item->fields['knowbaseitems_id'],
'language' => $item->fields['language']
];
}
$number = countElementsInTable(
'glpi_knowbaseitems_revisions',
$where
);
// No revisions in database
if ($number < 1) {
$no_txt = __('No revisions');
echo "<div class='center'>";
echo "<table class='tab_cadre_fixe'>";
echo "<tr><th>$no_txt</th></tr>";
echo "</table>";
echo "</div>";
return;
}
// Display the pager
Html::printAjaxPager(self::getTypeName(1), $start, $number);
// Output events
echo "<div class='center'>";
echo "<input type='button' name='compare' value='"._sx('button', 'Compare selected revisions').
"' class='submit compare'>";
echo "<table class='tab_cadre_fixehov'>";
$header = '<tr>';
$header .= "<th title='" . _sn('Revision', 'Revisions', 1) . "'>#</th>";
$header .= "<th>&nbsp;</th>";
$header .= "<th>" . __('Author') . "</th>";
$header .= "<th>".__('Creation date')."</th>";
$header .= "<th></th></tr>";
echo $header;
$user = new User();
$user->getFromDB($item->fields['users_id']);
//current contents
echo "<tr class='tab_bg_2'>";
echo "<td>(" . __('cur') . ")</td>" .
"<td><input type='radio' name='oldid' value='0' style='visibility:hidden'/>" .
"<input type='radio' name='diff' value='0' checked='checked'/></td>" .
"<td>" . $user->getLink() . "</td>".
"<td class='tab_date'>". $item->fields['date_mod'] . "</td>" .
"<td></td>" .
"</tr>";
$revisions = $DB->request(
'glpi_knowbaseitems_revisions',
$where + ['ORDER' => 'id DESC']
);
$is_checked = true;
foreach ($revisions as $revision) {
// Before GLPI 9.3.1, author was not stored in revision.
// See https://github.com/glpi-project/glpi/issues/4377.
$hasRevUser = $user->getFromDB($revision['users_id']);
echo "<tr class='tab_bg_2'>";
echo "<td>" . $revision['revision'] . "</td>" .
"<td><input type='radio' name='oldid' value='{$revision['id']}'";
if ($is_checked) {
echo " checked='checked'";
$is_checked = false;
}
echo "/> <input type='radio' name='diff' value='{$revision['id']}'/></td>";
echo "<td>" . ($hasRevUser ? $user->getLink() : __('Unknown user')) . "</td>".
"<td class='tab_date'>". $revision['date_creation'] . "</td>";
$form = null;
if ($item->getType() == KnowbaseItem::getType()) {
$form = KnowbaseItem::getFormURLWithID($revision['knowbaseitems_id']);
} else {
$form = KnowbaseItemTranslation::getFormURLWithID($revision['knowbaseitems_id']);
}
echo "<td><a href='#' data-rev='" . $revision['revision'] . "'
data-revid='" . $revision['id'] . "' class='show'>" . __('show') . "</a>
- <a href='$form&to_rev={$revision['id']}' class='restore'>".
__('restore') . "</a></td>";
echo "</tr>";
}
echo Html::script("public/lib/jquery-prettytextdiff.js");
echo "<script type='text/javascript'>
$(function() {
$('.restore').on('click', function(e) {
lastClickedElement = e.target;
return window.confirm('" . __s('Do you want to restore the selected revision?') . "');
});
$('.show').on('click', function(e) {
e.preventDefault();
var _this = $(this);
$.ajax({
url: '{$CFG_GLPI['root_doc']}/ajax/getKbRevision.php',
method: 'post',
cache: false,
data: {
'revid': _this.data('revid')
},
success: function(data) {
var title = '" . __('Show revision %rev') . "'.replace(/%rev/, _this.data('rev'));
var html = '<div title=\"' + title + '\" id=\"compare_view\"><table class=\"tab_cadre_fixehov\">';
html += '<h2>".__('Subject')."</h2>';
html += '<div>' + data.name + '</div>';
html += '<h2>".__('Content')."</h2>';
html += '<div>' + data.answer + '</div>';
html += '</div>';
$(html).appendTo('body').dialog({
height: 'auto',
width: 'auto',
modal: true
});
},
error: function() { ".
Html::jsAlertCallback(__('Contact your GLPI admin!'), __('Unable to load revision!'))."
}
});
});
$('.compare').on('click', function(e) {
e.preventDefault();
var _oldid = $('[name=oldid]:checked').val();
var _diffid = $('[name=diff]:checked').val();
$.ajax({
url: '{$CFG_GLPI['root_doc']}/ajax/compareKbRevisions.php',
method: 'post',
cache: false,
data: {
'oldid' : _oldid,
'diffid': _diffid,
'kbid' : '{$revision['knowbaseitems_id']}'
},
success: function(data) {
if (_diffid == 0) {
_diffid = '" . __('current') . "';
}
var title = '" . __s('Compare revisions old and diff') . "'.replace(/old/, _oldid).replace(/diff/, _diffid);
var html_compare = '<div title=\"' + title + '\" id=\"compare_view\"><table class=\"tab_cadre_fixehov\">';
html_compare += '<tr><th></th><th>" . __s('Original') . "</th><th>" . __s('Changed') ."</th><th>" . __('Differences') . "</th></tr>';
html_compare += '<tr><th>" . __s('Subject') . "</th><td class=\"original\">' + data['old']['name'] + '</td><td class=\"changed\">' + data['diff']['name'] + '</td><td class=\"diff\"></td></tr>';
html_compare += '<tr><th>" . __s('Content') . "</th><td class=\"original\">' + data['old']['answer'] + '</td><td class=\"changed\">' + data['diff']['answer'] + '</td><td class=\"diff\"></td></tr>';
html_compare += '</table></div>';
$(html_compare).appendTo('body').dialog({
height: 'auto',
width: 'auto',
modal: true
});
$('#compare_view tr').prettyTextDiff();
},
error: function() { ".
Html::jsAlertCallback(__('Contact your GLPI admin!'), __('Unable to load requested comparison!'))."
}
});
});
$('[name=diff]:gt(0)').css('visibility', 'hidden');
$('[name=oldid]').on('click', function(e) {
var _index = $(this).index('[name=oldid]');
var _checked_index = $('[name=diff]:checked').index('[name=diff]');
if (_checked_index >= _index) {
$('[name=diff]:eq(' + (_index - 1) +')').prop('checked', true);
}
$('[name=diff]:gt(' + _index + '), [name=diff]:eq(' + _index + ')').css('visibility', 'hidden');
$('[name=diff]:lt(' + _index + ')').css('visibility', 'visible');
});
});
</script>";
echo $header;
echo "</table>";
echo "<input type='button' name='compare' value='"._sx('button', 'Compare selected revisions')."' class='submit compare'>";
echo "</div>";
Html::printAjaxPager(self::getTypeName(1), $start, $number);
}
/**
* Populate and create a new revision from KnowbaseItem informations
*
* @param KnowbaseItem $item Knowledge base item
*
* @return boolean
*/
public function createNew(KnowbaseItem $item) {
$this->getEmpty();
$this->fields['knowbaseitems_id'] = $item->fields['id'];
$this->fields['name'] = Toolbox::addslashes_deep($item->fields['name']);
$this->fields['answer'] = Toolbox::clean_cross_side_scripting_deep(
Toolbox::addslashes_deep($item->fields['answer'])
);
$this->fields['date_creation'] = $item->fields['date_mod'];
$this->fields['revision'] = $this->getNewRevision();
$this->fields['users_id'] = $item->fields['users_id'];
$this->addToDB();
}
/**
* Populate and create a new revision from KnowbaseItem informations
*
* @param KnowbaseItemTranslation $item Knowledge base item translation
*
* @return boolean
*/
public function createNewTranslated(KnowbaseItemTranslation $item) {
$this->getEmpty();
$this->fields['knowbaseitems_id'] = $item->fields['knowbaseitems_id'];
$this->fields['name'] = $item->fields['name'];
$this->fields['answer'] = $item->fields['answer'];
$this->fields['date_creation'] = $item->fields['date_mod'];
$this->fields['language'] = $item->fields['language'];
$this->fields['revision'] = $this->getNewRevision();
$this->fields['users_id'] = $item->fields['users_id'];
$this->addToDB();
}
/**
* Get new revision number for item
*
* @return integer
*/
private function getNewRevision() {
global $DB;
$result = $DB->request([
'SELECT' => ['MAX' => 'revision AS revision'],
'FROM' => 'glpi_knowbaseitems_revisions',
'WHERE' => [
'knowbaseitems_id' => $this->fields['knowbaseitems_id'],
'language' => $this->fields['language']
]
])->next();
$rev = $result['revision'];
if ($rev === null) {
//no revisions yet
$rev = 1;
} else {
++$rev;
}
return $rev;
}
}