getConf('display_banner_for_readonly')) {
return false;
}
/** @var helper_plugin_approve_acl $acl */
$acl = $this->loadHelper('approve_acl');
if (!$acl->useApproveHere($INFO['id'])) return false;
return true;
}
/**
* Do all checks and return banner html
*
* @param string $action
* @return string
*/
public function banner($action) {
global $INFO;
$html = '';
if (!$this->shouldDisplay($action)) return $html;
/** @var helper_plugin_approve_acl $acl */
$acl = $this->loadHelper('approve_acl');
$last_change_date = @filemtime(wikiFN($INFO['id']));
$rev = !$INFO['rev'] ? $last_change_date : $INFO['rev'];
/** @var helper_plugin_approve_db $db */
$db = $this->loadHelper('approve_db');
$page_revision = $db->getPageRevision($INFO['id'], $rev);
$last_approved_rev = $db->getLastDbRev($INFO['id'], 'approved');
$classes = $this->getStatusClasses($page_revision['status'], $rev, $last_approved_rev);
$html .= '
';
if ($page_revision['status'] == 'approved') {
$html .= '
'.$this->getLang('approved').'';
$html .= ' ' . dformat(strtotime($page_revision['approved']));
if ($this->getConf('banner_long')) {
$html .= ' ' . $this->getLang('by') . ' ' . userlink($page_revision['approved_by'], true);
$html .= ' (' . $this->getLang('version') . ': ' . $page_revision['version'] . ')';
}
//not the newest page
$noprintContent = '';
if ($rev != $last_change_date) {
// we can see drafts
if ($acl->clientCanSeeDrafts($INFO['id'])) {
$noprintContent .= '
';
$noprintContent .= $this->getLang($last_approved_rev == $last_change_date ? 'newest_approved' : 'newest_draft');
$noprintContent .= '';
// we cannot see link to draft but there is some newer approved version
} elseif ($last_approved_rev != $rev) {
$urlParameters = [];
if ($last_approved_rev != $last_change_date) {
$urlParameters['rev'] = $last_approved_rev;
}
$noprintContent .= '
';
$noprintContent .= $this->getLang('newest_approved');
$noprintContent .= '';
}
}
$html .= $this->noprint($noprintContent);
} else {
if ($this->getConf('ready_for_approval') && $page_revision['status'] == 'ready_for_approval') {
// alternative print status (only approved or otherwise draft)
$html .= '
' . $this->getLang('draft').'';
$noprintContent = '
'.$this->getLang('marked_approve_ready').'';
$noprintContent .= ' ' . dformat(strtotime($page_revision['ready_for_approval']));
$noprintContent .= ' ' . $this->getLang('by') . ' ' . userlink($page_revision['ready_for_approval_by'], true);
$html .= $this->noprint($noprintContent);
} else {
$html .= '
'.$this->getLang('draft').'';
}
// not exists approve for current page
$noprintContent = '';
if ($last_approved_rev == null) {
// not the newest page
if ($rev != $last_change_date) {
$noprintContent .= '
';
$noprintContent .= $this->getLang('newest_draft');
$noprintContent .= '';
}
} else {
$urlParameters = [];
if ($last_approved_rev != $last_change_date) {
$urlParameters['rev'] = $last_approved_rev;
}
$noprintContent .= '
';
$noprintContent .= $this->getLang('newest_approved');
$noprintContent .= '';
}
//we are in current page
if ($rev == $last_change_date) {
if ($this->getConf('ready_for_approval') &&
$acl->clientCanMarkReadyForApproval($INFO['id']) &&
$page_revision['status'] != 'ready_for_approval') {
$urlParameters = [
'rev' => $last_approved_rev,
'do' => 'diff',
'ready_for_approval' => 'ready_for_approval'
];
$noprintContent .= ' |
';
$noprintContent .= $this->getLang('approve_ready');
$noprintContent .= '';
}
if ($acl->clientCanApprove($INFO['id'])) {
$urlParameters = [
'rev' => $last_approved_rev,
'do' => 'diff',
'approve' => 'approve'
];
$noprintContent .= ' |
';
$noprintContent .= $this->getLang('approve');
$noprintContent .= '';
}
}
$html .= $this->noprint($noprintContent);
}
if ($this->getConf('banner_long')) {
$page_metadata = $db->getPageMetadata($INFO['id']);
if (isset($page_metadata['approver'])) {
$html .= $this->noprint(
' | ' . $this->getLang('approver') . ': ' . userlink($page_metadata['approver'], true)
);
}
}
$html .= '
';
return $html;
}
/**
* @param $status
* @param $rev
* @param int|null $last_approved_rev
* @return array
*/
protected function getStatusClasses($status, $rev, ?int $last_approved_rev): array
{
$classes = [];
if ($status == 'approved' && $rev == $last_approved_rev) {
$classes[] = 'plugin__approve_approved';
} elseif ($status == 'approved') {
$classes[] = 'plugin__approve_old_approved';
} elseif ($this->getConf('ready_for_approval') && $status == 'ready_for_approval') {
$classes[] = 'plugin__approve_ready';
} else {
$classes[] = 'plugin__approve_draft';
}
return $classes;
}
/**
* Wrap string in noprint span
* @param $content
* @return string
*/
protected function noprint($content)
{
return '