www/public_html/lib/plugins/anewssystem/action.php

235 lines
12 KiB
PHP

<?php
/******************************************************************************
**
** action script related to anewssystem
** Action to display the archive page
*/
/******************************************************************************
** must run within Dokuwiki
**/
if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../../').'/');
if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
require_once(DOKU_PLUGIN.'action.php');
/******************************************************************************/
class action_plugin_anewssystem extends DokuWiki_Action_Plugin {
var $parameter = "";
/**
* return some info
*/
function getInfo(){
return array(
'author' => 'Taggic',
'email' => 'Taggic@t-online.de',
'date' => '2016-06-02',
'name' => 'News archive page (action plugin component)',
'desc' => 'to show the News aechive alone on a page.',
'url' => 'http://www.dokuwiki.org/plugin:anewssystem',
);
}
/******************************************************************************
** Register its handlers with the dokuwiki's event controller
*/
function register(Doku_Event_Handler $controller) {
$controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, '_handle_act', array());
$controller->register_hook('TPL_ACT_UNKNOWN', 'BEFORE', $this, 'output', array());
}
/******************************************************************************
** Handle the action
*/
function _handle_act(&$event, $param) {
if($event->data !== 'shownewsarchive') { return; }
$event->preventDefault(); // https://www.dokuwiki.org/devel:events#event_object
return true;
}
/******************************************************************************
** Generate output
*/
function output(&$event, $param) {
if($event->data !== 'shownewsarchive') { return; }
global $ID;
$target = $this->getConf('news_datafile');
$targetpage = htmlspecialchars(trim($target));
$prefix = 'anss';
$del = 'anss_del';
$cut_prefx = 'news_input_';
$allnewsdata1 = $this->getConf('news_output');
$allnewsdata = wl( (isset($allnewsdata1) ? $allnewsdata1 : 'news:newsdata') );
$i = strripos($allnewsdata, ":");
$news_root = substr($allnewsdata, 0, $i);
// necessary for the back link of a show one article per page (SOAPP)
if(stripos($_GET['archive'],'archive')!== false) $ans_conf['param'] = $_GET['archive'];
$_GET['archive']="";
// 1. read template (plugins/anewssystem/template.php)
$template = file_get_contents(DOKU_PLUGIN.'anewssystem/tpl/newstemplate.txt');
/*------- add news action part -----------------------------------------*/
$post_prefix = $_POST["xs-".$prefix];
$delete_record = $_POST["anss_del_record"];
$delete_anchor = $_POST["anss_del_anchor"];
// date ... consider all news of a defined month of a year (mm.yyyy, empty per default)
// qty ... limits the number of news headlines starting with most recent (either integer or all, default:all)
// tag ... consider all news where news article owns the given tag string (empty per default) tag delimiter is "|"
// style ... css style string as used in HTML (except quotation marks) for the outer element div
// class ... css style for usecase toc, page or box
// ho ... headlinesonly will list the news headlines without timestamp and author (on/off, default: off)
// check if page ID was called with tag filter
// $tmp .= ','.$_GET['tag']; // this will overrule the page syntax setting
if(strlen($tmp)<2) {
// strip parameter to get set of add parameter
$tmp = substr($ans_conf['param'],strlen('allnews'));
}
$split_array = explode(',',$tmp); // one or multiple tag filters: $prefs[1] ... [n]
$archive_options = array();
// split parameter into array with key and data
foreach ($split_array as $item) {
list($key, $value) = split("=",trim($item),2);
$archive_options = $archive_options + array($key => $value);
}
if(($archive_options['qty']=='') || ($archive_options['qty']<1)) $archive_options['qty'] = 'all';
if(array_key_exists('class',$archive_options) === false) $archive_options['class'] = 'page';
if(array_key_exists('ho',$archive_options) === false) $archive_options['ho'] = 'off';
$page = wl( (isset($targetpage) ? $targetpage : 'news:newsdata') );
// load raw news file (e.g. news:newsdata.txt)
$av = 0;
$oldrecord = rawWiki($targetpage);
// split the news articles
$newsitems = explode("======",$oldrecord);
$info = array();
// get the headline level from config
$yh_level = $this->getConf('yh_level');
$mh_level = $this->getConf('mh_level');
$h_level = $this->getConf('h_level');
// 1. read news file (e.g. news:newsdata.txt)
foreach($newsitems as $article) {
// split news block into line items
$article_array = explode("\n * ",$article);
unset($article_array[0]);
// 2. create output
// split line items into key and data
$aFlag = false; // flag: start date value exists and start is not in future
foreach ($article_array as $item) {
list($key, $value) = split(":",trim($item),2);
$tag_flag = false;
if($key=='anchor') {
$anchor = trim($value);
}
elseif(($key=='start') && strtotime(trim($value)) < time()) {
$value = date($this->getConf('d_format'), strtotime($value));
$news_date = '<span class="news_date_a"> ('. $value;
// get month and year to compare with $archive_options['date']
if(isset($archive_options['date']) && ($archive_options['date'] !== date('m.Y',strtotime($value)))) break;
$aFlag = true;
}
// head has to be before the link in the template !
elseif($key=='head'){
$news_head = trim($value);
}
elseif($key=='subtitle'){
$news_subtitle = '<br /><span class="news_subtitle">'.trim($value).'</span>'.NL;
}
elseif($key=='link'){
$news_head = '<a href="'.$value.'" id="'.$value.'" name="'.$value.'">'. trim($news_head) .'</a>'.NL;
}
elseif($key=='author'){
$news_date .= ', '. $value;
}
elseif(($key=='tags') && (isset($archive_options['tag']) !== false)) {
// echo $value.'<br />';
$tags = explode(',',$value);
foreach($tags as $tag) {
if(($tag!==false) && (stripos($archive_options['tag'],trim($tag))!==false)){
$tag_flag = true;
break;
}
}
}
}
$news_date .= ')</span>'.NL;
if((isset($archive_options['tag']) === false) || (strlen($archive_options['tag']) <2)) $tag_flag = true;
if (($aFlag === true) && ($tag_flag === true)) {
//stop adding older news articles if quantity is reached
// echo intval($archive_options['qty']).' >= '.$qty.'<br>';
$qty++;
if(($qty > intval($archive_options['qty'])) && ($archive_options['qty']!=='all')) break;
// list all news stories as headline linked to the story itself
$elt = explode(",",$news_date);
$elt[0] = trim(strip_tags(str_replace('(','',$elt[0])));
$elt[0] = date('F,Y',strtotime($elt[0]));
list($new_month,$new_year) = explode(',',$elt[0]);
// idea is that all stories are created one after the other
// and the order within newsdata is according the start date
// manipulation of Start/Perishing date possible but not expected
// !!! There is no sort algorithm for year and month implemented !!!
// to do such would lead into re-development of the plugin
if(($old_year !== $new_year) && (($archive_options['class']==='page') || ($archive_options['ho']==='off'))) {
if(trim($old_year) !== '') $close_ytag = "</li></ul>".NL;
$output .= $close_ytag.'<ul><li class="level1"><div class="li">'.$new_year.'</div><ul class="n_box">';
$old_year = $new_year;
}
if(($old_month !== $new_month) && (($archive_options['class']==='page') || ($archive_options['ho']==='off'))) {
if(trim($old_month) !== '') $close_mtag = "</li></ul>".NL;
$output .= $close_mtag.'<ul><li class="level2"><div class="li">'.$new_month.'</div>';
$old_month = $new_month;
}
if($archive_options['ho']==='on') $news_date='';
else $news_date .= '<br />';
if(($archive_options['tag']!==false) && ($archive_options['tag']!=='off') && ($archive_options['class']=='page')) $output .= '<div class="archive_item">'.trim($news_date).$news_head.$news_subtitle.'</div>'.NL;
else $output .= '<ul><li class="level3"><div class="li">'.trim($news_date).$news_head.'</div></li></ul>'.NL;
$close_ytag = "";
$close_mtag = "";
$anchor = "";
$news_date = "";
$news_head = "";
$news_subtitle = "";
$tags = "";
}
}
$blink_id = "news_items";
$img_ID = "img_archive__toc";
$archive_lnkTitle = $this->getConf('lnk_newsarchive');
if($archive_lnkTitle=='') $archive_lnkTitle = "News Archive";
$backlink = '<a href="javascript:history.back(-1)">'.$this->getLang('lnk_back').'</a>';
$backlink .= '<span class="anss_sep"> &nbsp;|&nbsp;</span>
<a href="'.DOKU_URL.'doku.php?id='.$this->getConf('news_output').'">'.$this->getLang('allnews').' &raquo;</a>';
$output = '<div class="backlinkDiv" style="font-size:.85em;">'.$backlink.'</div><br />'.NL.
'<div class="archive_section" id="news_archive_head" style="'.$archive_options['style'].'">
<div id="news_items">
'.$output.'
</div>
</div>'.NL.
'<div class="backlinkDiv" style="font-size:.85em;">'.$backlink.'</div><br />'.NL;
echo $output;
$event->preventDefault();
}
/******************************************************************************/
}