Wiki source for CalendarLinkAction


Show raw source

=====Calendar Link Action=====

>>==See also:==
Documentation: CalendarLinkActionInfo.>>This is the development page for the Calendar Link action. The code still needs some cleanup.::c::
%%(php)
<?php
/**
* Displays a link to a calendar entry based on parameter or current calendar entry
*
* @package Actions
* @subpackage Date and Time
* @name calendarlink
*
* @authors {@link http://wikkawiki.org/MasinAlDujaili Masin Al-Dujaili}
* @version 0.2
* @since Wikka 1.1.6.2
*
* @input string $calendarname optional: prefix for the calendar pages to be created - Must be a CamelCase word;
* default: WikiName from the user if logged on, else it's checked if the action sits on a calendar page
* @input string $link optional: one of the following keywords: 'next', 'prev', 'following'
* default: 'today'
* 'next': only available if action sits on a calendar page. Returns the entry in the future relative to the current entry.
* 'prev': only available if action sits on a calendar page. Returns the entry in the past relative to the current entry.
* 'following': Returns the next entry in the future relative to the current date.
* 'latest': Returns the last entry before the current date.
* 'today': Returns the entry at the calculated date. If no date or offset is given, then it will result to the current date.
* @input int $date optional: a date in the form yyyymmdd
* If $link is given, $link will be calculated depending to the corresponding date
* @input int $offset optional: a number of days to offset
* If $date is given, the calculated entry will be $date + $offset. If $date is not given, the current date
* will be used. If $link is given, it will be calculated using this calculated date
* Example: {{calendarlink calendarname="MyCalendar" link="following" date="20070605" offset="60"}}
* The action will then link to the calendar entry following August 4th, 2007. Without link="following", the
* action will create a link to MyCalendar20070804 itself, appending the /edit handler if the page does not
* exist.
*
* @output Link according to selection in parameter 'link'
*/

// l10n strings
define('LAST_ENTRY','Letzter Eintrag');
define('FIRST_ENTRY','Erster Eintrag');

// format string for locale-specific month (%B) + 4-digit year (%Y) used for caption and title attributes
// NOTE: monthname is locale-specific but order of month and year may need to be switched: hence the double quotes!
define ('USER_NAME',$this->GetUserName());
define ('BASE_URL',$this->config['base_url']); # i18n

define ('REGEX_CAMEL_WORD','([A-ZÄÖÜ]+[a-zßäöü]+[A-Z0-9ÄÖÜ][A-Za-z0-9ÄÖÜßäöü]*)');
define ('REGEX_CAL_DATE', '([0-9]{8,8})');
define ('REGEX_CAL_ENTRY', REGEX_CAMEL_WORD.REGEX_CAL_ENTRY);
// ***** END CONSTANTS section *****

// Get name of calendar to work with
$current_page = $this->GetPageTag();
if($this->getUser()) // Initialize $calendarname with current user's name if logged in
{
$cal_name = $this->getUser();
}
else // use current page tag
{
$cal_name = $current_page;
}

if(isset($vars['calendarname'])) // Check for parameter calendarname
{
$cal_name = $vars['calendarname'];
}
elseif(preg_match(REGEX_CAL_DATE,$current_page,$cal_date)) // Check if current page is a calendar entry and use the corresponding calendar.
{
// echo 'currentpage='.$current_page; // debug
// print_r($cal_date); // debug
$cal_name = substr($current_page,0,strpos($current_page, $cal_date[0]));
}
else // don't change prior init
{
$cal_name = $cal_name;
} // END of getting calendar name

// Get link mode and convert to lower case
if(isset($vars['link'])) $mode = $vars['link'];
else $mode = 'today';
$mode=mb_strtolower($mode);
// END link mode acquisition

// check parameter date has been provided
if(isset($vars['date']) && preg_match(REGEX_CAL_DATE,$vars['date'],$cal_date))
{
$date = $cal_date[0];
}
else // it has not been provided so we will use today as date
{
$cal_date = getdate();
$date = sprintf("%4d%02d%02d",$cal_date['year'],$cal_date['mon'],$cal_date['mday']);
}

if(isset($vars['offset']))
{
$offset = $vars['offset'];
list($year, $mon, $mday) = sscanf($date, "%4d%02d%02d");
$cal_date = getdate(mktime(0,0,0,$mon, $mday+$offset, $year));
$date = sprintf("%4d%02d%02d",$cal_date['year'],$cal_date['mon'],$cal_date['mday']);
}

if($mode!='today') // we only need the list of calendar entries if we want some other day than (calculated) today
{
$result = $this->Query('SELECT tag FROM ' . $this->config['table_prefix'] . "pages WHERE tag REGEXP('^$cal_name\[0-9]{8,8}') AND latest = 'Y'");
if (mysql_num_rows($result)) while ($row = mysql_fetch_array($result)) $tags[] = $row['tag'];
}

if($mode=='following'||$mode=='latest'||$mode=='today')
{
// creating a virtual calendar entry to use the code for $link=='next' or $link=='prev' on this virtual entry
$entry = sprintf("%s%8d",$cal_name,$date); // picking the relative origin based on calculated date
$tags[] = $entry;
}
else
{
$entry = $this->GetPageTag(); // picking the relative origin based on current page assuming it is calendar page
}

sort($tags); //sorting tags -- in case of a virtual calendar entry this will be now be in order, else the calendar entries are just sorted
$key = array_search($entry,$tags); // getting position of our relative origin in the array

$date_found = FALSE;
if($mode=='next'||$mode=='following')
{
if($key<(count($tags)-1))
{
$target_date = $tags[$key+1];
$date_found = TRUE;
}
else
{
$target_date = LAST_ENTRY;
$date_found = FALSE;
}
}
elseif($mode=='prev'||$mode=='latest')
{
if($key>0)
{
$target_date = $tags[$key-1];
$date_found = TRUE;
}
else
{
$target_date = FIRST_ENTRY;
$date_found = FALSE;
}
}
elseif($mode=='today')
{
$target_date = $entry;
$date_found = TRUE;
}

if ($date_found)
{
echo $this->Link($target_date);
}
else
{
echo $target_date;
}
%%
----
CategoryDevelopmentActions
Valid XHTML :: Valid CSS: :: Powered by WikkaWiki