add('name', PLUGIN_DASHBOARD_TITLE);
$propbag->add('description', PLUGIN_DASHBOARD_DESC);
$propbag->add('requirements', array(
'serendipity' => '1.3',
'smarty' => '2.6.7',
'php' => '4.1.0'
));
$propbag->add('version', '0.6.3');
$propbag->add('author', 'Garvin Hicking');
$propbag->add('stackable', false);
$propbag->add('configuration', array('read_only', 'limit_draft', 'limit_comments', 'limit_comments_pending', 'limit_future', 'sequence', 'update'));
$propbag->add('event_hooks', array(
'backend_frontpage_display' => true,
'css_backend' => true,
)
);
$propbag->add('groups', array('BACKEND_FEATURES'));
}
function introspect_config_item($name, &$propbag) {
switch($name) {
case 'limit_draft':
$propbag->add('type', 'string');
$propbag->add('name', PLUGIN_DASHBOARD_LIMIT_DRAFT);
$propbag->add('description', '');
$propbag->add('default', '5');
break;
case 'read_only':
$propbag->add('type', 'boolean');
$propbag->add('name', PLUGIN_DASHBOARD_READONLY);
$propbag->add('description', PLUGIN_DASHBOARD_READONLY_DESC);
$propbag->add('default', 'false');
break;
case 'update':
$propbag->add('type', 'radio');
$propbag->add('name', PLUGIN_DASHBOARD_UPDATE);
$propbag->add('description', PLUGIN_DASHBOARD_UPDATE_DESC);
$propbag->add('radio', array(
'value' => array('stable', 'beta', 'none'),
'desc' => array(PLUGIN_DASHBOARD_STABLE, PLUGIN_DASHBOARD_UNSTABLE, PLUGIN_DASHBOARD_NONE)
));
$propbag->add('radio_per_row', '1');
$propbag->add('default', 'stable');
break;
case 'limit_comments':
$propbag->add('type', 'string');
$propbag->add('name', PLUGIN_DASHBOARD_LIMIT_COMMENTS);
$propbag->add('description', '');
$propbag->add('default', '5');
break;
case 'limit_comments_pending':
$propbag->add('type', 'string');
$propbag->add('name', PLUGIN_DASHBOARD_LIMIT_COMMENTS_PENDING);
$propbag->add('description', '');
$propbag->add('default', '5');
break;
case 'limit_future':
$propbag->add('type', 'string');
$propbag->add('name', PLUGIN_DASHBOARD_LIMIT_FUTURE);
$propbag->add('description', '');
$propbag->add('default', '5');
break;
case 'sequence':
$propbag->add('type', 'sequence');
$propbag->add('name', PLUGIN_DASHBOARD_SEQUENCE);
$propbag->add('description', PLUGIN_DASHBOARD_SEQUENCE_DESC);
$propbag->add('checkable', true);
$values = array(
'update' => array('display' => UPDATE),
'draft' => array('display' => DRAFT),
'comments' => array('display' => COMMENT),
'future' => array('display' => PLUGIN_DASHBOARD_FUTURE),
'comments_pending' => array('display' => PLUGIN_DASHBOARD_COMMENTS_PENDING)
);
$propbag->add('values', $values);
$propbag->add('default', 'update,draft,comments_pending,comments,future');
break;
default:
return false;
}
return true;
}
function generate_content(&$title) {
$title = PLUGIN_DASHBOARD_TITLE;
}
function showElementCommentlist($where) {
$summaryLength = 200;
$i = 0;
$comments = serendipity_fetchComments(null, null, '', true, 'NORMAL', $where);
if (!is_array($comments)) {
return;
}
echo '
';
foreach ($comments as $rs) {
$i++;
$comment = array(
'fullBody' => $rs['body'],
'summary' => serendipity_mb('substr', $rs['body'], 0, $summaryLength),
'status' => $rs['status'],
'type' => $rs['type'],
'id' => $rs['id'],
'title' => $rs['title'],
'timestamp' => $rs['timestamp'],
'referer' => $rs['referer'],
'url' => $rs['url'],
'ip' => $rs['ip'],
'entry_url' => serendipity_archiveURL($rs['entry_id'], $rs['title']),
'email' => $rs['email'],
'author' => (empty($rs['author']) ? ANONYMOUS : $rs['author']),
'entry_id' => $rs['entry_id']
);
$entrylink = serendipity_archiveURL($comment['entry_id'], 'comments', 'serendipityHTTPPath', true) . '#c' . $comment['id'];
if (strlen($comment['fullBody']) > strlen($comment['summary']) ) {
$comment['summary'] .= ' ...';
$comment['excerpt'] = true;
// When summary is not the full body, strip HTML tags from summary, as it might break and leave unclosed HTML.
$comment['fullBody'] = nl2br(htmlspecialchars($comment['fullBody']));
$comment['summary'] = nl2br(strip_tags($comment['summary']));
} else {
$comment['excerpt'] = false;
$comment['fullBody'] = $comment['summary'] = nl2br(htmlspecialchars($comment['fullBody']));
}
#serendipity_plugin_api::hook_event('backend_view_comment', $comment, '&serendipity[page]='. $page . $searchString);
$class = 'serendipity_admin_list_item_' . (($i % 2 == 0 ) ? 'even' : 'uneven');
if ($comment['status'] == 'pending' || $comment['status'] === 'confirm') {
$class .= ' serendipity_admin_comment_pending';
}
$header_class = ($comment['status'] == 'pending' || $comment['status'] === 'confirm' ? 'serendipityAdminMsgNote serendipity_admin_comment_pending_header' : '');
?>
';
}
function showElementEntrylist($filter = array(), $limit = 0) {
global $serendipity;
$filter_sql = implode(' AND ', $filter);
$orderby = 'timestamp DESC';
// Fetch the entries
$entries = serendipity_fetchEntries(
false,
false,
$limit,
true,
false,
$orderby,
$filter_sql
);
$rows = 0;
if (!is_array($entries)) {
return;
}
foreach ($entries as $entry) {
$rows++;
// Find out if the entry has been modified later than 30 minutes after creation
if ($entry['timestamp'] <= ($entry['last_modified'] - 60*30)) {
$lm = '';
} else {
$lm = '';
}
if (!$serendipity['showFutureEntries'] && $entry['timestamp'] >= serendipity_serverOffsetHour()) {
$entry_pre = ' ';
} else {
$entry_pre = '';
}
if (serendipity_db_bool($entry['properties']['ep_is_sticky'])) {
$entry_pre .= ' ' . STICKY_POSTINGS . ': ';
}
if (serendipity_db_bool($entry['isdraft'])) {
$entry_pre .= ' ' . DRAFT . ': ';
}
?>
|
|
' . htmlspecialchars($cat['category_name']) . '';
}
echo implode(', ', $cats);
}
$entry['link'] = serendipity_archiveURL($entry['id'], $entry['title'], 'serendipityHTTPPath', true, array('timestamp' => $entry['timestamp']));
$entry['preview_link'] = '?serendipity[noBanner]=true&serendipity[noSidebar]=true&serendipity[action]=admin&serendipity[adminModule]=entries&serendipity[adminAction]=preview&serendipity[id]=' . $entry['id'];
?>
|
= serendipity_serverOffsetHour())) { ?>
|
get_config('limit_draft');
if ($lim < 1) return;
echo '';
echo '
' . DRAFT . '
';
$this->showElementEntrylist(array("e.isdraft = 'true'"), $lim);
echo '';
}
function compareVersion($newV, $actV) {
$newV = explode('.', $newV);
$actV = explode('.', $actV);
$length = ( count($newV) < count($actV) ? count($newV) : count($actV) );
for($i=0; $i < $length; $i++){
if ($newV[$i] > $actV[$i]){
return 1;
}
}
return 0;
}
function CheckUpdate() {
global $serendipity;
$updateURL = 'http://svn.berlios.de/viewvc/serendipity/trunk/docs/RELEASE';
$file = fopen($updateURL, 'r');
if (!$file) {
echo "PLUGIN_DASHBOARD_ERROR_URL";
return;
}
while(!feof($file)){
$line = fgets($file);
$version=$this->get_config('update');
if(preg_match('/^' . $version . ':(.+$)/', $line, $match)){
$this->set_config('last_version', $match[1]);
$u_text = ' ';
if ($version == "stable"){
$url="http://prdownloads.sourceforge.net/php-blog/serendipity-" . $match[1] . ".zip";
}
else {
if (date('H') >= 23 && date('i') >=42){
$day = date("d");
}
else {
$day = date("d") - 1;
}
$url="http://www.s9y.org/snapshots/s9y_". date("Ym") . $day . "2342.tar.gz";
}
if($this->compareVersion($match[1], $serendipity['version'])){
print $this->showUpdateHeader();
$u_text .= PLUGIN_DASHBOARD_UPDATE_NOTIFIER . '
' . $match[1] . '';
$u_text .= '
';
print $u_text;
$this->set_config('update_text', $u_text);
}
}
}
}
function showElementComments() {
$lim = $this->get_config('limit_comments');
if ($lim < 1) return;
echo '';
}
function showElementCommentsPending() {
$lim = $this->get_config('limit_comments_pending');
if ($lim < 1) return;
echo '';
}
function showUpdateHeader() {
$header = '';
$header .= '
' . PLUGIN_DASHBOARD_UPD . '
';
return $header;
}
function showUpdateNotifier() {
global $serendipity;
if (($this->get_config('last_update') != date('Ymd'))){
$this->set_config('last_update', date('Ymd'));
}
else {
$nv = $this->get_config('last_version');
if($this->compareVersion($nv, $serendipity['version'])){
$eventData = '';
serendipity_plugin_api::hook_event('plugin_dashboard_updater', $eventData, $nv);
print $this->showUpdateHeader();
$update_text = $this->get_config('update_text');
print $update_text . $eventData;
print '';
}
return;
}
if ($this->get_config('update') == 'none') {
return;
}
$this->CheckUpdate();
echo '';
}
function showElementFuture() {
$lim = $this->get_config('limit_future');
if ($lim < 1) return;
echo '';
echo '
' . PLUGIN_DASHBOARD_FUTURE . '
';
$this->showElementEntrylist(array("e.isdraft != 'true' AND e.timestamp >= " . serendipity_serverOffsetHour()), $lim);
echo '';
}
function showElement($element) {
switch($element) {
case 'update':
$this->ShowUpdateNotifier();
break;
case 'draft':
$this->showElementDraft();
break;
case 'comments':
$this->showElementComments();
break;
case 'comments_pending':
$this->showElementCommentsPending();
break;
case 'future':
$this->showElementFuture();
break;
}
return true;
}
function event_hook($event, &$bag, &$eventData, $addData = null) {
$hooks = &$bag->get('event_hooks');
if (isset($hooks[$event])) {
switch($event) {
case 'backend_frontpage_display':
$elements = explode(',', $this->get_config('sequence'));
ob_start();
?>
showElement($element);
}
$dashboard = ob_get_contents();
ob_end_clean();
$eventData['more'] = $dashboard;
break;
case 'css_backend':
$filename = 'dashboard.css';
$tfile = serendipity_getTemplateFile($filename, 'serendipityPath');
if (!$tfile || $tfile == $filename) {
$tfile = dirname(__FILE__) . '/' . $filename;
}
echo file_get_contents($tfile);
break;
}
}
return true;
}
}
/* vim: set sts=4 ts=4 expandtab : */
' . COMMENT . '
'; $this->showElementcommentlist("AND status = 'approved'", $lim); echo '