2011-05-28 06:01:30 +02:00
< ? php
2016-06-19 22:04:34 +02:00
/**
* @ file include / event . php
* @ brief functions specific to event handling
*/
2011-05-28 06:01:30 +02:00
2015-05-15 21:10:43 +02:00
require_once ( 'include/bbcode.php' );
require_once ( 'include/map.php' );
2016-06-19 22:04:34 +02:00
require_once ( 'include/datetime.php' );
2011-05-28 06:01:30 +02:00
2015-10-17 09:41:58 +02:00
function format_event_html ( $ev , $simple = false ) {
2011-05-28 06:01:30 +02:00
if ( ! (( is_array ( $ev )) && count ( $ev )))
return '' ;
2011-07-01 08:27:16 +02:00
$bd_format = t ( 'l F d, Y \@ g:i A' ) ; // Friday January 18, 2011 @ 8 AM
2011-06-09 06:06:02 +02:00
2015-10-17 09:41:58 +02:00
$event_start = (( $ev [ 'adjust' ]) ? day_translate ( datetime_convert ( 'UTC' , date_default_timezone_get (),
$ev [ 'start' ] , $bd_format ))
: day_translate ( datetime_convert ( 'UTC' , 'UTC' ,
$ev [ 'start' ] , $bd_format )));
$event_end = (( $ev [ 'adjust' ]) ? day_translate ( datetime_convert ( 'UTC' , date_default_timezone_get (),
$ev [ 'finish' ] , $bd_format ))
: day_translate ( datetime_convert ( 'UTC' , 'UTC' ,
$ev [ 'finish' ] , $bd_format )));
if ( $simple ) {
$o = " <h3> " . bbcode ( $ev [ 'summary' ]) . " </h3> " ;
$o .= " <p> " . bbcode ( $ev [ 'desc' ]) . " </p> " ;
$o .= " <h4> " . t ( 'Starts:' ) . " </h4><p> " . $event_start . " </p> " ;
if ( ! $ev [ 'nofinish' ])
$o .= " <h4> " . t ( 'Finishes:' ) . " </h4><p> " . $event_end . " </p> " ;
if ( strlen ( $ev [ 'location' ]))
$o .= " <h4> " . t ( 'Location:' ) . " </h4><p> " . $ev [ 'location' ] . " </p> " ;
return $o ;
}
2011-06-15 06:22:52 +02:00
$o = '<div class="vevent">' . " \r \n " ;
2011-05-28 06:01:30 +02:00
2012-06-26 05:55:27 +02:00
$o .= '<p class="summary event-summary">' . bbcode ( $ev [ 'summary' ]) . '</p>' . " \r \n " ;
2011-06-15 06:22:52 +02:00
$o .= '<p class="description event-description">' . bbcode ( $ev [ 'desc' ]) . '</p>' . " \r \n " ;
2011-05-28 06:01:30 +02:00
2011-06-09 06:06:02 +02:00
$o .= '<p class="event-start">' . t ( 'Starts:' ) . ' <abbr class="dtstart" title="'
. datetime_convert ( 'UTC' , 'UTC' , $ev [ 'start' ], (( $ev [ 'adjust' ]) ? ATOM_TIME : 'Y-m-d\TH:i:s' ))
2015-10-17 09:41:58 +02:00
. '" >' . $event_start
2011-06-15 06:22:52 +02:00
. '</abbr></p>' . " \r \n " ;
2011-05-28 06:01:30 +02:00
2011-06-08 05:10:43 +02:00
if ( ! $ev [ 'nofinish' ])
2011-06-09 06:06:02 +02:00
$o .= '<p class="event-end" >' . t ( 'Finishes:' ) . ' <abbr class="dtend" title="'
. datetime_convert ( 'UTC' , 'UTC' , $ev [ 'finish' ], (( $ev [ 'adjust' ]) ? ATOM_TIME : 'Y-m-d\TH:i:s' ))
2015-10-17 09:41:58 +02:00
. '" >' . $event_end
2011-06-15 06:22:52 +02:00
. '</abbr></p>' . " \r \n " ;
2011-06-08 05:10:43 +02:00
2015-05-15 21:10:43 +02:00
if ( strlen ( $ev [ 'location' ])){
2015-10-16 23:50:34 +02:00
$o .= '<p class="event-location"> ' . t ( 'Location:' ) . ' <span class="location">'
. bbcode ( $ev [ 'location' ])
2011-06-15 06:22:52 +02:00
. '</span></p>' . " \r \n " ;
2015-10-16 23:50:34 +02:00
2016-01-30 05:12:27 +01:00
if ( strpos ( $ev [ 'location' ], " [map " ) !== False ) {
2015-05-15 21:10:43 +02:00
$map = generate_named_map ( $ev [ 'location' ]);
if ( $map !== $ev [ 'location' ]) $o .= $map ;
}
2015-10-16 23:50:34 +02:00
2015-05-15 21:10:43 +02:00
}
2011-05-28 06:01:30 +02:00
2011-06-15 06:22:52 +02:00
$o .= '</div>' . " \r \n " ;
2011-06-08 05:10:43 +02:00
return $o ;
}
2012-05-29 21:03:30 +02:00
/*
2011-06-09 06:06:02 +02:00
function parse_event ( $h ) {
require_once ( 'include/Scrape.php' );
require_once ( 'include/html2bbcode' );
$h = '<html><body>' . $h . '</body></html>' ;
$ret = array ();
2011-10-21 01:48:07 +02:00
try {
$dom = HTML5_Parser :: parse ( $h );
} catch ( DOMException $e ) {
logger ( 'parse_event: parse error: ' . $e );
}
2011-06-09 06:06:02 +02:00
if ( ! $dom )
return $ret ;
$items = $dom -> getElementsByTagName ( '*' );
foreach ( $items as $item ) {
if ( attribute_contains ( $item -> getAttribute ( 'class' ), 'vevent' )) {
$level2 = $item -> getElementsByTagName ( '*' );
foreach ( $level2 as $x ) {
if ( attribute_contains ( $x -> getAttribute ( 'class' ), 'dtstart' ) && $x -> getAttribute ( 'title' )) {
$ret [ 'start' ] = $x -> getAttribute ( 'title' );
if ( ! strpos ( $ret [ 'start' ], 'Z' ))
$ret [ 'adjust' ] = true ;
}
if ( attribute_contains ( $x -> getAttribute ( 'class' ), 'dtend' ) && $x -> getAttribute ( 'title' ))
$ret [ 'finish' ] = $x -> getAttribute ( 'title' );
if ( attribute_contains ( $x -> getAttribute ( 'class' ), 'description' ))
$ret [ 'desc' ] = $x -> textContent ;
if ( attribute_contains ( $x -> getAttribute ( 'class' ), 'location' ))
$ret [ 'location' ] = $x -> textContent ;
}
}
}
// sanitise
if (( x ( $ret , 'desc' )) && (( strpos ( $ret [ 'desc' ], '<' ) !== false ) || ( strpos ( $ret [ 'desc' ], '>' ) !== false ))) {
$config = HTMLPurifier_Config :: createDefault ();
$config -> set ( 'Cache.DefinitionImpl' , null );
$purifier = new HTMLPurifier ( $config );
$ret [ 'desc' ] = html2bbcode ( $purifier -> purify ( $ret [ 'desc' ]));
}
if (( x ( $ret , 'location' )) && (( strpos ( $ret [ 'location' ], '<' ) !== false ) || ( strpos ( $ret [ 'location' ], '>' ) !== false ))) {
$config = HTMLPurifier_Config :: createDefault ();
$config -> set ( 'Cache.DefinitionImpl' , null );
$purifier = new HTMLPurifier ( $config );
$ret [ 'location' ] = html2bbcode ( $purifier -> purify ( $ret [ 'location' ]));
}
if ( x ( $ret , 'start' ))
$ret [ 'start' ] = datetime_convert ( 'UTC' , 'UTC' , $ret [ 'start' ]);
if ( x ( $ret , 'finish' ))
$ret [ 'finish' ] = datetime_convert ( 'UTC' , 'UTC' , $ret [ 'finish' ]);
return $ret ;
}
2012-05-29 21:03:30 +02:00
*/
2011-06-09 06:06:02 +02:00
2011-06-10 01:24:29 +02:00
function format_event_bbcode ( $ev ) {
2011-06-09 06:06:02 +02:00
2011-06-10 01:24:29 +02:00
$o = '' ;
2011-06-09 06:06:02 +02:00
2012-06-26 05:55:27 +02:00
if ( $ev [ 'summary' ])
$o .= '[event-summary]' . $ev [ 'summary' ] . '[/event-summary]' ;
2011-06-10 01:24:29 +02:00
if ( $ev [ 'desc' ])
$o .= '[event-description]' . $ev [ 'desc' ] . '[/event-description]' ;
2011-06-09 06:06:02 +02:00
2011-06-10 01:24:29 +02:00
if ( $ev [ 'start' ])
$o .= '[event-start]' . $ev [ 'start' ] . '[/event-start]' ;
2011-06-09 06:06:02 +02:00
2011-06-10 05:02:48 +02:00
if (( $ev [ 'finish' ]) && ( ! $ev [ 'nofinish' ]))
2011-06-10 01:24:29 +02:00
$o .= '[event-finish]' . $ev [ 'finish' ] . '[/event-finish]' ;
2015-10-16 23:50:34 +02:00
2011-06-10 01:24:29 +02:00
if ( $ev [ 'location' ])
$o .= '[event-location]' . $ev [ 'location' ] . '[/event-location]' ;
2011-06-09 06:06:02 +02:00
2011-06-10 01:24:29 +02:00
if ( $ev [ 'adjust' ])
$o .= '[event-adjust]' . $ev [ 'adjust' ] . '[/event-adjust]' ;
2011-06-09 06:06:02 +02:00
2011-06-10 01:24:29 +02:00
return $o ;
}
function bbtovcal ( $s ) {
$o = '' ;
$ev = bbtoevent ( $s );
if ( $ev [ 'desc' ])
$o = format_event_html ( $ev );
return $o ;
}
function bbtoevent ( $s ) {
2011-06-09 06:06:02 +02:00
2011-06-10 01:24:29 +02:00
$ev = array ();
2011-06-09 06:06:02 +02:00
2012-06-26 05:55:27 +02:00
$match = '' ;
if ( preg_match ( " / \ [event \ -summary \ ](.*?) \ [ \ /event \ -summary \ ]/is " , $s , $match ))
$ev [ 'summary' ] = $match [ 1 ];
2011-06-10 01:24:29 +02:00
$match = '' ;
if ( preg_match ( " / \ [event \ -description \ ](.*?) \ [ \ /event \ -description \ ]/is " , $s , $match ))
$ev [ 'desc' ] = $match [ 1 ];
$match = '' ;
if ( preg_match ( " / \ [event \ -start \ ](.*?) \ [ \ /event \ -start \ ]/is " , $s , $match ))
$ev [ 'start' ] = $match [ 1 ];
$match = '' ;
if ( preg_match ( " / \ [event \ -finish \ ](.*?) \ [ \ /event \ -finish \ ]/is " , $s , $match ))
$ev [ 'finish' ] = $match [ 1 ];
$match = '' ;
if ( preg_match ( " / \ [event \ -location \ ](.*?) \ [ \ /event \ -location \ ]/is " , $s , $match ))
$ev [ 'location' ] = $match [ 1 ];
$match = '' ;
if ( preg_match ( " / \ [event \ -adjust \ ](.*?) \ [ \ /event \ -adjust \ ]/is " , $s , $match ))
$ev [ 'adjust' ] = $match [ 1 ];
2012-02-27 23:01:17 +01:00
$ev [ 'nofinish' ] = ((( x ( $ev , 'start' ) && $ev [ 'start' ]) && ( ! x ( $ev , 'finish' ) || ! $ev [ 'finish' ])) ? 1 : 0 );
2011-06-10 01:24:29 +02:00
return $ev ;
}
2011-06-09 06:06:02 +02:00
2011-06-08 05:10:43 +02:00
function sort_by_date ( $a ) {
usort ( $a , 'ev_compare' );
return $a ;
2011-06-06 08:10:07 +02:00
}
2011-06-08 05:10:43 +02:00
function ev_compare ( $a , $b ) {
2011-06-06 08:10:07 +02:00
2011-06-08 05:10:43 +02:00
$date_a = (( $a [ 'adjust' ]) ? datetime_convert ( 'UTC' , date_default_timezone_get (), $a [ 'start' ]) : $a [ 'start' ]);
$date_b = (( $b [ 'adjust' ]) ? datetime_convert ( 'UTC' , date_default_timezone_get (), $b [ 'start' ]) : $b [ 'start' ]);
2011-06-15 06:44:27 +02:00
if ( $date_a === $date_b )
return strcasecmp ( $a [ 'desc' ], $b [ 'desc' ]);
2015-10-16 23:50:34 +02:00
2011-06-08 05:10:43 +02:00
return strcmp ( $date_a , $date_b );
2011-06-14 04:06:49 +02:00
}
2015-10-17 01:25:25 +02:00
function event_delete ( $event_id ) {
if ( $event_id == 0 )
return ;
2011-06-14 04:06:49 +02:00
2015-10-17 01:25:25 +02:00
q ( " DELETE FROM `event` WHERE `id` = %d " , intval ( $event_id ));
logger ( " Deleted event " . $event_id , LOGGER_DEBUG );
}
2011-06-14 04:06:49 +02:00
function event_store ( $arr ) {
require_once ( 'include/datetime.php' );
require_once ( 'include/items.php' );
require_once ( 'include/bbcode.php' );
$a = get_app ();
$arr [ 'created' ] = (( $arr [ 'created' ]) ? $arr [ 'created' ] : datetime_convert ());
2011-06-15 04:48:37 +02:00
$arr [ 'edited' ] = (( $arr [ 'edited' ]) ? $arr [ 'edited' ] : datetime_convert ());
2014-03-11 23:52:32 +01:00
$arr [ 'type' ] = (( $arr [ 'type' ]) ? $arr [ 'type' ] : 'event' );
2011-06-15 04:48:37 +02:00
$arr [ 'cid' ] = (( intval ( $arr [ 'cid' ])) ? intval ( $arr [ 'cid' ]) : 0 );
$arr [ 'uri' ] = ( x ( $arr , 'uri' ) ? $arr [ 'uri' ] : item_new_uri ( $a -> get_hostname (), $arr [ 'uid' ]));
2011-07-27 11:21:55 +02:00
$arr [ 'private' ] = (( x ( $arr , 'private' )) ? intval ( $arr [ 'private' ]) : 0 );
2011-06-14 04:06:49 +02:00
if ( $arr [ 'cid' ])
$c = q ( " SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1 " ,
intval ( $arr [ 'cid' ]),
intval ( $arr [ 'uid' ])
);
else
$c = q ( " SELECT * FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1 " ,
intval ( $arr [ 'uid' ])
);
if ( count ( $c ))
$contact = $c [ 0 ];
2011-06-24 03:56:24 +02:00
// Existing event being modified
2011-06-14 04:06:49 +02:00
if ( $arr [ 'id' ]) {
2011-06-24 03:25:33 +02:00
// has the event actually changed?
$r = q ( " SELECT * FROM `event` WHERE `id` = %d AND `uid` = %d LIMIT 1 " ,
intval ( $arr [ 'id' ]),
intval ( $arr [ 'uid' ])
);
if (( ! count ( $r )) || ( $r [ 0 ][ 'edited' ] === $arr [ 'edited' ])) {
2011-06-24 03:56:24 +02:00
// Nothing has changed. Grab the item id to return.
2011-06-24 03:25:33 +02:00
$r = q ( " SELECT * FROM `item` WHERE `event-id` = %d AND `uid` = %d LIMIT 1 " ,
intval ( $arr [ 'id' ]),
intval ( $arr [ 'uid' ])
);
return (( count ( $r )) ? $r [ 0 ][ 'id' ] : 0 );
}
2011-06-24 03:56:24 +02:00
// The event changed. Update it.
2011-06-24 03:25:33 +02:00
2011-06-14 04:06:49 +02:00
$r = q ( " UPDATE `event` SET
`edited` = '%s' ,
`start` = '%s' ,
`finish` = '%s' ,
2012-06-26 05:55:27 +02:00
`summary` = '%s' ,
2011-06-14 04:06:49 +02:00
`desc` = '%s' ,
`location` = '%s' ,
`type` = '%s' ,
`adjust` = % d ,
`nofinish` = % d ,
2014-03-11 23:52:32 +01:00
WHERE `id` = % d AND `uid` = % d " ,
2011-06-14 04:06:49 +02:00
dbesc ( $arr [ 'edited' ]),
dbesc ( $arr [ 'start' ]),
dbesc ( $arr [ 'finish' ]),
2012-06-26 05:55:27 +02:00
dbesc ( $arr [ 'summary' ]),
2011-06-14 04:06:49 +02:00
dbesc ( $arr [ 'desc' ]),
dbesc ( $arr [ 'location' ]),
dbesc ( $arr [ 'type' ]),
intval ( $arr [ 'adjust' ]),
intval ( $arr [ 'nofinish' ]),
intval ( $arr [ 'id' ]),
intval ( $arr [ 'uid' ])
);
$r = q ( " SELECT * FROM `item` WHERE `event-id` = %d AND `uid` = %d LIMIT 1 " ,
intval ( $arr [ 'id' ]),
intval ( $arr [ 'uid' ])
);
2011-06-15 04:48:37 +02:00
if ( count ( $r )) {
$object = '<object><type>' . xmlify ( ACTIVITY_OBJ_EVENT ) . '</type><title></title><id>' . xmlify ( $arr [ 'uri' ]) . '</id>' ;
$object .= '<content>' . xmlify ( format_event_bbcode ( $arr )) . '</content>' ;
$object .= '</object>' . " \n " ;
2016-05-22 18:16:47 +02:00
q ( " UPDATE `item` SET `body` = '%s', `object` = '%s', `edited` = '%s' WHERE `id` = %d AND `uid` = %d " ,
2011-06-15 04:48:37 +02:00
dbesc ( format_event_bbcode ( $arr )),
dbesc ( $object ),
2011-06-24 03:56:24 +02:00
dbesc ( $arr [ 'edited' ]),
2011-06-15 04:48:37 +02:00
intval ( $r [ 0 ][ 'id' ]),
intval ( $arr [ 'uid' ])
);
2012-05-29 21:03:30 +02:00
$item_id = $r [ 0 ][ 'id' ];
2016-05-22 18:16:47 +02:00
} else
2012-05-29 21:03:30 +02:00
$item_id = 0 ;
call_hooks ( " event_updated " , $arr [ 'id' ]);
return $item_id ;
2011-06-14 04:06:49 +02:00
}
else {
2015-10-16 23:50:34 +02:00
// New event. Store it.
2011-06-24 03:56:24 +02:00
2012-06-26 05:55:27 +02:00
$r = q ( " INSERT INTO `event` ( `uid`,`cid`,`uri`,`created`,`edited`,`start`,`finish`,`summary`, `desc`,`location`,`type`,
2011-06-14 04:06:49 +02:00
`adjust` , `nofinish` , `allow_cid` , `allow_gid` , `deny_cid` , `deny_gid` )
2012-06-26 05:55:27 +02:00
VALUES ( % d , % d , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' , % d , % d , '%s' , '%s' , '%s' , '%s' ) " ,
2011-06-14 04:06:49 +02:00
intval ( $arr [ 'uid' ]),
intval ( $arr [ 'cid' ]),
2011-06-14 05:42:37 +02:00
dbesc ( $arr [ 'uri' ]),
2011-06-14 04:06:49 +02:00
dbesc ( $arr [ 'created' ]),
dbesc ( $arr [ 'edited' ]),
dbesc ( $arr [ 'start' ]),
dbesc ( $arr [ 'finish' ]),
2012-06-26 05:55:27 +02:00
dbesc ( $arr [ 'summary' ]),
2011-06-14 04:06:49 +02:00
dbesc ( $arr [ 'desc' ]),
dbesc ( $arr [ 'location' ]),
dbesc ( $arr [ 'type' ]),
intval ( $arr [ 'adjust' ]),
intval ( $arr [ 'nofinish' ]),
dbesc ( $arr [ 'allow_cid' ]),
dbesc ( $arr [ 'allow_gid' ]),
dbesc ( $arr [ 'deny_cid' ]),
dbesc ( $arr [ 'deny_gid' ])
);
$r = q ( " SELECT * FROM `event` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 " ,
2011-06-15 04:48:37 +02:00
dbesc ( $arr [ 'uri' ]),
2011-06-14 04:06:49 +02:00
intval ( $arr [ 'uid' ])
);
if ( count ( $r ))
$event = $r [ 0 ];
$item_arr = array ();
$item_arr [ 'uid' ] = $arr [ 'uid' ];
$item_arr [ 'contact-id' ] = $arr [ 'cid' ];
2011-06-15 04:48:37 +02:00
$item_arr [ 'uri' ] = $arr [ 'uri' ];
$item_arr [ 'parent-uri' ] = $arr [ 'uri' ];
2015-10-16 23:50:34 +02:00
$item_arr [ 'guid' ] = $arr [ 'guid' ];
2011-06-14 04:06:49 +02:00
$item_arr [ 'type' ] = 'activity' ;
2011-06-17 03:11:00 +02:00
$item_arr [ 'wall' ] = (( $arr [ 'cid' ]) ? 0 : 1 );
2011-06-14 04:06:49 +02:00
$item_arr [ 'contact-id' ] = $contact [ 'id' ];
$item_arr [ 'owner-name' ] = $contact [ 'name' ];
$item_arr [ 'owner-link' ] = $contact [ 'url' ];
$item_arr [ 'owner-avatar' ] = $contact [ 'thumb' ];
$item_arr [ 'author-name' ] = $contact [ 'name' ];
$item_arr [ 'author-link' ] = $contact [ 'url' ];
$item_arr [ 'author-avatar' ] = $contact [ 'thumb' ];
$item_arr [ 'title' ] = '' ;
2011-07-27 07:40:11 +02:00
$item_arr [ 'allow_cid' ] = $arr [ 'allow_cid' ];
$item_arr [ 'allow_gid' ] = $arr [ 'allow_gid' ];
$item_arr [ 'deny_cid' ] = $arr [ 'deny_cid' ];
$item_arr [ 'deny_gid' ] = $arr [ 'deny_gid' ];
2011-07-27 11:21:55 +02:00
$item_arr [ 'private' ] = $arr [ 'private' ];
2011-06-14 04:06:49 +02:00
$item_arr [ 'last-child' ] = 1 ;
$item_arr [ 'visible' ] = 1 ;
$item_arr [ 'verb' ] = ACTIVITY_POST ;
$item_arr [ 'object-type' ] = ACTIVITY_OBJ_EVENT ;
2011-10-17 23:52:03 +02:00
$item_arr [ 'origin' ] = (( intval ( $arr [ 'cid' ]) == 0 ) ? 1 : 0 );
2011-06-14 04:06:49 +02:00
$item_arr [ 'body' ] = format_event_bbcode ( $event );
2012-05-29 21:03:30 +02:00
$item_arr [ 'object' ] = '<object><type>' . xmlify ( ACTIVITY_OBJ_EVENT ) . '</type><title></title><id>' . xmlify ( $arr [ 'uri' ]) . '</id>' ;
2011-06-14 04:06:49 +02:00
$item_arr [ 'object' ] .= '<content>' . xmlify ( format_event_bbcode ( $event )) . '</content>' ;
$item_arr [ 'object' ] .= '</object>' . " \n " ;
$item_id = item_store ( $item_arr );
$r = q ( " SELECT * FROM `user` WHERE `uid` = %d LIMIT 1 " ,
intval ( $arr [ 'uid' ])
);
2014-07-22 00:36:20 +02:00
//if(count($r))
// $plink = $a->get_baseurl() . '/display/' . $r[0]['nickname'] . '/' . $item_id;
2011-06-14 04:06:49 +02:00
if ( $item_id ) {
2014-07-22 00:36:20 +02:00
//q("UPDATE `item` SET `plink` = '%s', `event-id` = %d WHERE `uid` = %d AND `id` = %d",
// dbesc($plink),
// intval($event['id']),
// intval($arr['uid']),
// intval($item_id)
//);
q ( " UPDATE `item` SET `event-id` = %d WHERE `uid` = %d AND `id` = %d " ,
2011-06-14 04:06:49 +02:00
intval ( $event [ 'id' ]),
intval ( $arr [ 'uid' ]),
intval ( $item_id )
);
}
2011-06-15 04:48:37 +02:00
2012-05-29 21:03:30 +02:00
call_hooks ( " event_created " , $event [ 'id' ]);
2011-06-14 04:06:49 +02:00
return $item_id ;
}
}
2016-06-19 22:04:34 +02:00
function get_event_strings () {
// First day of the week (0 = Sunday)
$firstDay = get_pconfig ( local_user (), 'system' , 'first_day_of_week' );
if ( $firstDay === false ) $firstDay = 0 ;
$i18n = array (
" firstDay " => $firstDay ,
" Sun " => t ( " Sun " ),
" Mon " => t ( " Mon " ),
" Tue " => t ( " Tue " ),
" Wed " => t ( " Wed " ),
" Thu " => t ( " Thu " ),
" Fri " => t ( " Fri " ),
" Sat " => t ( " Sat " ),
" Sunday " => t ( " Sunday " ),
" Monday " => t ( " Monday " ),
" Tuesday " => t ( " Tuesday " ),
" Wednesday " => t ( " Wednesday " ),
" Thursday " => t ( " Thursday " ),
" Friday " => t ( " Friday " ),
" Saturday " => t ( " Saturday " ),
" Jan " => t ( " Jan " ),
" Feb " => t ( " Feb " ),
" Mar " => t ( " Mar " ),
" Apr " => t ( " Apr " ),
" May " => t ( " May " ),
" Jun " => t ( " Jun " ),
" Jul " => t ( " Jul " ),
" Aug " => t ( " Aug " ),
" Sep " => t ( " Sept " ),
" Oct " => t ( " Oct " ),
" Nov " => t ( " Nov " ),
" Dec " => t ( " Dec " ),
" January " => t ( " January " ),
" February " => t ( " February " ),
" March " => t ( " March " ),
" April " => t ( " April " ),
" May " => t ( " May " ),
" June " => t ( " June " ),
" July " => t ( " July " ),
" August " => t ( " August " ),
" September " => t ( " September " ),
" October " => t ( " October " ),
" November " => t ( " November " ),
" December " => t ( " December " ),
" today " => t ( " today " ),
" month " => t ( " month " ),
" week " => t ( " week " ),
" day " => t ( " day " ),
);
return $i18n ;
}
/**
* @ brief Get an event by its event ID
*
* @ param type $owner_uid The User ID of the owner of the event
* @ param type $event_params An assoziative array with
* int 'event_id' => The ID of the event in the event table
* @ param type $sql_extra
* @ return array Query result
*/
function event_by_id ( $owner_uid = 0 , $event_params , $sql_extra = '' ) {
// ownly allow events if there is a valid owner_id
if ( $owner_uid == 0 )
return ;
// query for the event by event id
$r = q ( " SELECT `event`.*, `item`.`id` AS `itemid`,`item`.`plink`,
`item` . `author-name` , `item` . `author-avatar` , `item` . `author-link` FROM `event`
LEFT JOIN `item` ON `item` . `event-id` = `event` . `id` AND `item` . `uid` = `event` . `uid`
WHERE `event` . `uid` = % d AND `event` . `id` = % d $sql_extra " ,
intval ( $owner_uid ),
intval ( $event_params [ " event_id " ])
);
if ( count ( $r ))
return $r ;
}
/**
* @ brief Get all events in a specific timeframe
*
* @ param int $owner_uid The User ID of the owner of the events
* @ param array $event_params An assoziative array with
* int 'ignored' =>
* string 'start' => Start time of the timeframe
* string 'finish' => Finish time of the timeframe
* string 'adjust_start' =>
* string 'adjust_start' =>
*
* @ param string $sql_extra Additional sql conditions ( e . g . permission request )
* @ return array Query results
*/
function events_by_date ( $owner_uid = 0 , $event_params , $sql_extra = '' ) {
// ownly allow events if there is a valid owner_id
if ( $owner_uid == 0 )
return ;
// query for the event by date
$r = q ( " SELECT `event`.*, `item`.`id` AS `itemid`,`item`.`plink`,
`item` . `author-name` , `item` . `author-avatar` , `item` . `author-link` FROM `event`
LEFT JOIN `item` ON `item` . `event-id` = `event` . `id` AND `item` . `uid` = `event` . `uid`
WHERE `event` . `uid` = % d AND event . ignore = % d
AND (( `adjust` = 0 AND ( `finish` >= '%s' OR ( nofinish AND start >= '%s' )) AND `start` <= '%s' )
OR ( `adjust` = 1 AND ( `finish` >= '%s' OR ( nofinish AND start >= '%s' )) AND `start` <= '%s' ))
$sql_extra " ,
intval ( $owner_uid ),
intval ( $event_params [ " ignored " ]),
dbesc ( $event_params [ " start " ]),
dbesc ( $event_params [ " start " ]),
dbesc ( $event_params [ " finish " ]),
dbesc ( $event_params [ " adjust_start " ]),
dbesc ( $event_params [ " adjust_start " ]),
dbesc ( $event_params [ " adjust_finish " ])
);
if ( count ( $r ))
return $r ;
}
/**
* @ brief Convert an array query results in an arry which could be used by the events template
*
* @ param array $arr Event query array
* @ return array Event array for the template
*/
function process_events ( $arr ) {
$events = array ();
$last_date = '' ;
$fmt = t ( 'l, F j' );
if ( count ( $arr )) {
foreach ( $arr as $rr ) {
$j = (( $rr [ 'adjust' ]) ? datetime_convert ( 'UTC' , date_default_timezone_get (), $rr [ 'start' ], 'j' ) : datetime_convert ( 'UTC' , 'UTC' , $rr [ 'start' ], 'j' ));
$d = (( $rr [ 'adjust' ]) ? datetime_convert ( 'UTC' , date_default_timezone_get (), $rr [ 'start' ], $fmt ) : datetime_convert ( 'UTC' , 'UTC' , $rr [ 'start' ], $fmt ));
$d = day_translate ( $d );
$start = (( $rr [ 'adjust' ]) ? datetime_convert ( 'UTC' , date_default_timezone_get (), $rr [ 'start' ], 'c' ) : datetime_convert ( 'UTC' , 'UTC' , $rr [ 'start' ], 'c' ));
if ( $rr [ 'nofinish' ]){
$end = null ;
} else {
$end = (( $rr [ 'adjust' ]) ? datetime_convert ( 'UTC' , date_default_timezone_get (), $rr [ 'finish' ], 'c' ) : datetime_convert ( 'UTC' , 'UTC' , $rr [ 'finish' ], 'c' ));
}
$is_first = ( $d !== $last_date );
$last_date = $d ;
$edit = (( ! $rr [ 'cid' ]) ? array ( App :: get_baseurl () . '/events/event/' . $rr [ 'id' ], t ( 'Edit event' ), '' , '' ) : null );
$title = strip_tags ( html_entity_decode ( bbcode ( $rr [ 'summary' ]), ENT_QUOTES , 'UTF-8' ));
if ( ! $title ) {
list ( $title , $_trash ) = explode ( " <br " , bbcode ( $rr [ 'desc' ]), 2 );
$title = strip_tags ( html_entity_decode ( $title , ENT_QUOTES , 'UTF-8' ));
}
$html = format_event_html ( $rr );
$rr [ 'desc' ] = bbcode ( $rr [ 'desc' ]);
$rr [ 'location' ] = bbcode ( $rr [ 'location' ]);
$events [] = array (
'id' => $rr [ 'id' ],
'start' => $start ,
'end' => $end ,
'allDay' => false ,
'title' => $title ,
'j' => $j ,
'd' => $d ,
'is_first' => $is_first ,
'item' => $rr ,
'html' => $html ,
'plink' => array ( $rr [ 'plink' ], t ( 'link to source' ), '' , '' ),
);
}
}
return $events ;
}
2016-06-20 23:31:49 +02:00
/**
* @ brief Format event to export format ( ical / csv )
*
* @ param array $events Query result for events
* @ param string $format The output format ( ical / csv )
* @ param string $timezone The timezone of the user ( not implemented yet )
*
* @ return string Content according to selected export format
*/
function event_format_export ( $events , $format = 'ical' , $timezone ) {
if ( ! (( is_array ( $events )) && count ( $events )))
return ;
switch ( $format ) {
// format the exported data as a CSV file
case " csv " :
header ( " Content-type: text/csv " );
$o = '"Subject", "Start Date", "Start Time", "Description", "End Date", "End Time", "Location"' . PHP_EOL ;
foreach ( $events as $event ) {
/// @todo the time / date entries don't include any information about the
// timezone the event is scheduled in :-/
$tmp1 = strtotime ( $event [ 'start' ]);
$tmp2 = strtotime ( $event [ 'finish' ]);
$time_format = " %H:%M:%S " ;
$date_format = " %Y-%m-%d " ;
$o .= '"' . $event [ 'summary' ] . '", "' . strftime ( $date_format , $tmp1 ) .
'", "' . strftime ( $time_format , $tmp1 ) . '", "' . $event [ 'desc' ] .
'", "' . strftime ( $date_format , $tmp2 ) .
'", "' . strftime ( $time_format , $tmp2 ) .
'", "' . $event [ 'location' ] . '"' . PHP_EOL ;
}
break ;
// format the exported data as a ics file
case " ical " :
header ( " Content-type: text/ics " );
$o = 'BEGIN:VCALENDAR' . PHP_EOL
. 'VERSION:2.0' . PHP_EOL
. 'PRODID:-//friendica calendar export//0.1//EN' . PHP_EOL ;
/// @todo include timezone informations in cases were the time is not in UTC
// see http://tools.ietf.org/html/rfc2445#section-4.8.3
// . 'BEGIN:VTIMEZONE' . PHP_EOL
// . 'TZID:' . $timezone . PHP_EOL
// . 'END:VTIMEZONE' . PHP_EOL;
// TODO instead of PHP_EOL CRLF should be used for long entries
// but test your solution against http://icalvalid.cloudapp.net/
// also long lines SHOULD be split at 75 characters length
foreach ( $events as $event ) {
if ( $event [ 'adjust' ] == 1 ) {
$UTC = 'Z' ;
} else {
$UTC = '' ;
}
$o .= 'BEGIN:VEVENT' . PHP_EOL ;
if ( $event [ start ]) {
$tmp = strtotime ( $event [ 'start' ]);
$dtformat = " %Y%m%dT%H%M%S " . $UTC ;
$o .= 'DTSTART:' . strftime ( $dtformat , $tmp ) . PHP_EOL ;
}
if ( $event [ 'finish' ]) {
$tmp = strtotime ( $event [ 'finish' ]);
$dtformat = " %Y%m%dT%H%M%S " . $UTC ;
$o .= 'DTEND:' . strftime ( $dtformat , $tmp ) . PHP_EOL ;
}
if ( $event [ 'summary' ])
$tmp = $event [ 'summary' ];
$tmp = str_replace ( PHP_EOL , PHP_EOL . ' ' , $tmp );
$tmp = addcslashes ( $tmp , ',;' );
$o .= 'SUMMARY:' . $tmp . PHP_EOL ;
if ( $event [ 'desc' ])
$tmp = $event [ 'desc' ];
$tmp = str_replace ( PHP_EOL , PHP_EOL . ' ' , $tmp );
$tmp = addcslashes ( $tmp , ',;' );
$o .= 'DESCRIPTION:' . $tmp . PHP_EOL ;
if ( $event [ 'location' ]) {
$tmp = $event [ 'location' ];
$tmp = str_replace ( PHP_EOL , PHP_EOL . ' ' , $tmp );
$tmp = addcslashes ( $tmp , ',;' );
$o .= 'LOCATION:' . $tmp . PHP_EOL ;
}
$o .= 'END:VEVENT' . PHP_EOL ;
$o .= PHP_EOL ;
}
$o .= 'END:VCALENDAR' . PHP_EOL ;
break ;
}
return $o ;
}
/**
* @ brief Get all events for a user ID
*
* The query for events is done permission sensitive
* If the user is the owner of the calendar he / she
* will get all of his / her available events .
* If the user is only a visitor only the public events will
* be available
*
* @ param int $uid The user ID
* @ param int $sql_extra Additional sql conditions for permission
*
* @ return array Query results
*/
function events_by_uid ( $uid = 0 , $sql_extra = '' ) {
if ( $uid == 0 )
return ;
// The permission condition if no condition was transmitted
if ( $sql_extra == '' )
$sql_extra = " AND `allow_cid` = '' AND `allow_gid` = '' " ;
// does the user who requests happen to be the owner of the events
// requested? then show all of your events, otherwise only those that
// don't have limitations set in allow_cid and allow_gid
if ( local_user () == $uid ) {
$r = q ( " SELECT `start`, `finish`, `adjust`, `summary`, `desc`, `location`
FROM `event` WHERE `uid` = % d AND `cid` = 0 " ,
intval ( $uid )
);
} else {
$r = q ( " SELECT `start`, `finish`, `adjust`, `summary`, `desc`, `location`FROM `event`
WHERE `uid` = % d AND `cid` = 0 $sql_extra " ,
intval ( $uid )
);
}
if ( count ( $r ))
return $r ;
}
/**
*
* @ param int $uid The user ID
* @ param string $format Output format ( ical / csv )
* @ return array With the results
* bool 'success' => True if the processing was successful
* string 'format' => The output format
* string 'extension' => The file extension of the output format
* string 'content' => The formatted output content
*
* @ todo Respect authenticated users with events_by_uid ()
*/
function event_export ( $uid , $format = 'ical' ) {
$process = false ;
// we are allowed to show events
// get the timezone the user is in
$r = q ( " SELECT `timezone` FROM `user` WHERE `uid` = %d LIMIT 1 " , intval ( $uid ));
if ( count ( $r ))
$timezone = $r [ 0 ][ 'timezone' ];
// get all events which are owned by a uid (respects permissions);
$events = events_by_uid ( $uid );
// we have the events that are available for the requestor
// now format the output according to the requested format
if ( count ( $events ))
$res = event_format_export ( $events , $format , $timezone );
// If there are results the precess was successfull
if ( x ( $res ))
$process = true ;
// get the file extension for the format
switch ( $format ) {
case " ical " :
$file_ext = " ics " ;
break ;
case " csv " :
$file_ext = " csv " ;
break ;
default :
$file_ext = " " ;
}
$arr = array (
'success' => $process ,
'format' => $format ,
'extension' => $file_ext ,
'content' => $res ,
);
return $arr ;
}
/**
* @ brief Get the events widget
*
* @ return string Formated html of the evens widget
*/
function widget_events () {
$a = get_app ();
$owner_uid = $a -> data [ 'user' ][ 'uid' ];
// $a->data is only available if the profile page is visited. If the visited page is not part
// of the profile page it should be the personal /events page. So we can use $a->user
$user = ( $a -> data [ 'user' ][ 'nickname' ] ? $a -> data [ 'user' ][ 'nickname' ] : $a -> user [ 'nickname' ]);
2016-06-22 13:50:47 +02:00
// a little bit tricky permission testing because we have to respect many cases
if ( ! ( local_user ()) && ! ( $owner_uid ) // not the private events page (we don't get the $owner_uid for /events)
|| ( intval ( $owner_uid ) && local_user () !== $owner_uid && ! ( feature_enabled ( $owner_uid , " export_calendar " ))) // cal logged in user (test permission at foreign profile page)
|| ( ! ( local_user ()) && ! ( feature_enabled ( $owner_uid , " export_calendar " ))) // if cal && not logged in && feature is not enabled
) {
2016-06-20 23:31:49 +02:00
return ;
2016-06-22 13:50:47 +02:00
}
2016-06-20 23:31:49 +02:00
return replace_macros ( get_markup_template ( " events_aside.tpl " ), array (
'$etitle' => t ( " Export " ),
'$export_ical' => t ( " Export calendar as ical " ),
'$export_csv' => t ( " Export calendar as csv " ),
'$user' => $user
));
}