2011-06-03 16:52:57 +02:00
< ? php
2013-11-25 21:04:58 +01:00
function admin_import_title () {
return _ ( " Pentabarf import " );
}
2011-06-03 16:52:57 +02:00
function admin_import () {
2012-12-26 14:02:27 +01:00
global $rooms_import ;
global $user ;
$html = " " ;
2014-03-26 20:04:11 +01:00
2012-12-26 14:02:27 +01:00
$step = " input " ;
2014-03-26 20:04:11 +01:00
if ( isset ( $_REQUEST [ 'step' ]))
2012-12-26 14:02:27 +01:00
$step = $_REQUEST [ 'step' ];
2014-03-26 20:04:11 +01:00
2012-12-26 14:02:27 +01:00
$html .= '<p>' ;
$html .= $step == " input " ? '<b>1. Input</b>' : '1. Input' ;
$html .= ' » ' ;
$html .= $step == " check " ? '<b>2. Validate</b>' : '2. Validate' ;
$html .= ' » ' ;
$html .= $step == " import " ? '<b>3. Import</b>' : '3. Import' ;
$html .= '</p>' ;
2014-03-26 20:04:11 +01:00
2012-12-26 14:02:27 +01:00
$import_file = '../import/import_' . $user [ 'UID' ] . '.xml' ;
2014-03-26 20:04:11 +01:00
2012-12-26 14:02:27 +01:00
switch ( $step ) {
2014-03-26 20:04:11 +01:00
case " input " :
2012-12-26 14:02:27 +01:00
$ok = false ;
if ( $test_handle = fopen ( '../import/tmp' , 'w' )) {
fclose ( $test_handle );
unlink ( '../import/tmp' );
} else {
2013-12-09 17:52:43 +01:00
error ( " Webserver has no write-permission on import directory. " );
2012-12-26 14:02:27 +01:00
}
2014-03-26 20:04:11 +01:00
if ( isset ( $_REQUEST [ 'submit' ])) {
2012-12-26 14:02:27 +01:00
$ok = true ;
2014-03-26 20:04:11 +01:00
if ( isset ( $_FILES [ 'xcal_file' ]) && ( $_FILES [ 'xcal_file' ][ 'error' ] == 0 )) {
2012-12-26 14:02:27 +01:00
if ( move_uploaded_file ( $_FILES [ 'xcal_file' ][ 'tmp_name' ], $import_file )) {
libxml_use_internal_errors ( true );
if ( simplexml_load_file ( $import_file ) === false ) {
$ok = false ;
2013-12-09 17:52:43 +01:00
error ( " No valid xml/xcal file provided. " );
2012-12-26 14:02:27 +01:00
unlink ( $import_file );
}
} else {
$ok = false ;
2013-12-09 17:52:43 +01:00
error ( " File upload went wrong. " );
2012-12-26 14:02:27 +01:00
}
} else {
$ok = false ;
2013-12-09 17:52:43 +01:00
error ( " Please provide some data. " );
2012-12-26 14:02:27 +01:00
}
}
2014-03-26 20:04:11 +01:00
2012-12-26 14:02:27 +01:00
if ( $ok )
2012-12-30 18:27:45 +01:00
redirect ( page_link_to ( 'admin_import' ) . " &step=check " );
2014-03-26 20:04:11 +01:00
else {
$html .= form ( array (
form_info ( '' , _ ( " This import will create/update/delete rooms and shifts by given FRAB-export file. The needed file format is xcal. " )),
form_file ( 'xcal_file' , _ ( " xcal-File (.xcal) " )),
form_submit ( 'submit' , _ ( " Import " ))
2012-12-26 14:02:27 +01:00
));
2014-03-26 20:04:11 +01:00
}
2012-12-26 14:02:27 +01:00
break ;
2014-03-26 20:04:11 +01:00
case " check " :
if ( ! file_exists ( $import_file ))
2012-12-30 18:27:45 +01:00
redirect ( page_link_to ( 'admin_import' ));
2014-03-26 20:04:11 +01:00
list ( $rooms_new , $rooms_deleted ) = prepare_rooms ( $import_file );
list ( $events_new , $events_updated , $events_deleted ) = prepare_events ( $import_file );
$html .= form ( array (
'<h3>' . _ ( " Rooms to create " ) . '</h3>' ,
table ( _ ( " Name " ), $rooms_new ),
'<h3>' . _ ( " Rooms to delete " ) . '</h3>' ,
table ( _ ( " Name " ), $rooms_deleted ),
'<h3>' . _ ( " Shifts to create " ) . '</h3>' ,
table ( array (
'day' => _ ( " Day " ),
'start' => _ ( " Start " ),
'end' => _ ( " End " ),
'name' => _ ( " Name " ),
'room' => _ ( " Room " )
), shifts_printable ( $events_new )),
'<h3>' . _ ( " Shifts to update " ) . '</h3>' ,
table ( array (
'day' => _ ( " Day " ),
'start' => _ ( " Start " ),
'end' => _ ( " End " ),
'name' => _ ( " Name " ),
'room' => _ ( " Room " )
), shifts_printable ( $events_updated )),
'<h3>' . _ ( " Shifts to delete " ) . '</h3>' ,
table ( array (
'day' => _ ( " Day " ),
'start' => _ ( " Start " ),
'end' => _ ( " End " ),
'name' => _ ( " Name " ),
'room' => _ ( " Room " )
), shifts_printable ( $events_deleted )),
form_submit ( 'submit' , _ ( " Import " ))
), page_link_to ( 'admin_import' ) . '&step=import' );
2012-12-26 14:02:27 +01:00
break ;
2014-03-26 20:04:11 +01:00
case " import " :
if ( ! file_exists ( $import_file ))
2012-12-30 18:27:45 +01:00
redirect ( page_link_to ( 'admin_import' ));
2014-03-26 20:04:11 +01:00
list ( $rooms_new , $rooms_deleted ) = prepare_rooms ( $import_file );
2012-12-26 14:02:27 +01:00
foreach ( $rooms_new as $room ) {
sql_query ( " INSERT INTO `Room` SET `Name`=' " . sql_escape ( $room ) . " ', `FromPentabarf`='Y', `Show`='Y' " );
$rooms_import [ trim ( $room )] = sql_id ();
}
foreach ( $rooms_deleted as $room )
sql_query ( " DELETE FROM `Room` WHERE `Name`=' " . sql_escape ( $room ) . " ' LIMIT 1 " );
2014-03-26 20:04:11 +01:00
list ( $events_new , $events_updated , $events_deleted ) = prepare_events ( $import_file );
2012-12-26 14:02:27 +01:00
foreach ( $events_new as $event )
2014-03-26 20:04:11 +01:00
sql_query ( " INSERT INTO `Shifts` SET `name`=' " . sql_escape ( $event [ 'name' ]) . " ', `start`= " . sql_escape ( $event [ 'start' ]) . " , `end`= " . sql_escape ( $event [ 'end' ]) . " , `RID`= " . sql_escape ( $event [ 'RID' ]) . " , `PSID`= " . sql_escape ( $event [ 'PSID' ]) . " , `URL`=' " . sql_escape ( $event [ 'URL' ]) . " ' " );
2012-12-26 14:02:27 +01:00
foreach ( $events_updated as $event )
2014-03-26 20:04:11 +01:00
sql_query ( " UPDATE `Shifts` SET `name`=' " . sql_escape ( $event [ 'name' ]) . " ', `start`= " . sql_escape ( $event [ 'start' ]) . " , `end`= " . sql_escape ( $event [ 'end' ]) . " , `RID`= " . sql_escape ( $event [ 'RID' ]) . " , `PSID`= " . sql_escape ( $event [ 'PSID' ]) . " , `URL`=' " . sql_escape ( $event [ 'URL' ]) . " ' WHERE `PSID`= " . sql_escape ( $event [ 'PSID' ]) . " LIMIT 1 " );
2012-12-26 14:02:27 +01:00
foreach ( $events_deleted as $event )
2014-03-26 20:04:11 +01:00
sql_query ( " DELETE FROM `Shifts` WHERE `PSID`= " . sql_escape ( $event [ 'PSID' ]) . " LIMIT 1 " );
2012-12-26 14:02:27 +01:00
engelsystem_log ( " Pentabarf import done " );
2014-03-26 20:04:11 +01:00
2012-12-26 14:02:27 +01:00
unlink ( $import_file );
2014-03-26 20:04:11 +01:00
$html .= success ( _ ( " It's done! " ), true );
2012-12-26 14:02:27 +01:00
break ;
2014-03-26 20:04:11 +01:00
default :
redirect ( page_link_to ( 'admin_import' ));
2012-12-26 14:02:27 +01:00
}
2014-03-26 20:04:11 +01:00
2012-12-26 14:02:27 +01:00
return $html ;
2011-06-03 16:52:57 +02:00
}
2011-07-12 16:03:07 +02:00
function prepare_rooms ( $file ) {
2012-12-26 14:02:27 +01:00
global $rooms_import ;
$data = read_xml ( $file );
2014-03-26 20:04:11 +01:00
2012-12-26 14:02:27 +01:00
// Load rooms from db for compare with input
$rooms = sql_select ( " SELECT * FROM `Room` WHERE `FromPentabarf`='Y' " );
2014-03-26 20:04:11 +01:00
$rooms_db = array ();
$rooms_import = array ();
2012-12-26 14:02:27 +01:00
foreach ( $rooms as $room ) {
2014-03-26 20:04:11 +01:00
$rooms_db [] = ( string ) $room [ 'Name' ];
2012-12-26 14:02:27 +01:00
$rooms_import [ $room [ 'Name' ]] = $room [ 'RID' ];
}
2014-03-26 20:04:11 +01:00
2012-12-26 14:02:27 +01:00
$events = $data -> vcalendar -> vevent ;
2014-03-26 20:04:11 +01:00
$rooms_pb = array ();
2012-12-26 14:02:27 +01:00
foreach ( $events as $event ) {
2014-03-26 20:04:11 +01:00
$rooms_pb [] = ( string ) $event -> location ;
if ( ! isset ( $rooms_import [ trim ( $event -> location )]))
2012-12-26 14:02:27 +01:00
$rooms_import [ trim ( $event -> location )] = trim ( $event -> location );
}
$rooms_pb = array_unique ( $rooms_pb );
2014-03-26 20:04:11 +01:00
2012-12-26 14:02:27 +01:00
$rooms_new = array_diff ( $rooms_pb , $rooms_db );
$rooms_deleted = array_diff ( $rooms_db , $rooms_pb );
2014-03-26 20:04:11 +01:00
return array (
$rooms_new ,
$rooms_deleted
2012-12-26 14:02:27 +01:00
);
2011-07-11 20:40:27 +02:00
}
2011-07-11 21:58:06 +02:00
2011-07-12 16:03:07 +02:00
function prepare_events ( $file ) {
2012-12-26 14:02:27 +01:00
global $rooms_import ;
$data = read_xml ( $file );
2014-03-26 20:04:11 +01:00
2012-12-26 14:02:27 +01:00
$rooms = sql_select ( " SELECT * FROM `Room` " );
2014-03-26 20:04:11 +01:00
$rooms_db = array ();
2012-12-26 14:02:27 +01:00
foreach ( $rooms as $room )
$rooms_db [ $room [ 'Name' ]] = $room [ 'RID' ];
2014-03-26 20:04:11 +01:00
2012-12-26 14:02:27 +01:00
$events = $data -> vcalendar -> vevent ;
2014-03-26 20:04:11 +01:00
$shifts_pb = array ();
2012-12-26 14:02:27 +01:00
foreach ( $events as $event ) {
$event_pb = $event -> children ( " http://pentabarf.org " );
2014-03-26 20:04:11 +01:00
$event_id = trim ( $event_pb -> {
2012-12-26 14:02:27 +01:00
'event-id' });
2014-03-26 20:04:11 +01:00
$shifts_pb [ $event_id ] = array (
'start' => DateTime :: createFromFormat ( " Ymd \T His " , $event -> dtstart ) -> getTimestamp (),
'end' => DateTime :: createFromFormat ( " Ymd \T His " , $event -> dtend ) -> getTimestamp (),
2012-12-26 14:02:27 +01:00
'RID' => $rooms_import [ trim ( $event -> location )],
'name' => trim ( $event -> summary ),
'URL' => trim ( $event -> url ),
2014-03-26 20:04:11 +01:00
'PSID' => $event_id
);
2012-12-26 14:02:27 +01:00
}
2014-03-26 20:04:11 +01:00
2012-12-26 14:02:27 +01:00
$shifts = sql_select ( " SELECT * FROM `Shifts` WHERE `PSID` IS NOT NULL ORDER BY `start` " );
2014-03-26 20:04:11 +01:00
$shifts_db = array ();
2012-12-26 14:02:27 +01:00
foreach ( $shifts as $shift )
$shifts_db [ $shift [ 'PSID' ]] = $shift ;
2014-03-26 20:04:11 +01:00
$shifts_new = array ();
$shifts_updated = array ();
2012-12-26 14:02:27 +01:00
foreach ( $shifts_pb as $shift )
2014-03-26 20:04:11 +01:00
if ( ! isset ( $shifts_db [ $shift [ 'PSID' ]]))
$shifts_new [] = $shift ;
else {
$tmp = $shifts_db [ $shift [ 'PSID' ]];
if ( $shift [ 'name' ] != $tmp [ 'name' ] || $shift [ 'start' ] != $tmp [ 'start' ] || $shift [ 'end' ] != $tmp [ 'end' ] || $shift [ 'RID' ] != $tmp [ 'RID' ] || $shift [ 'URL' ] != $tmp [ 'URL' ])
$shifts_updated [] = $shift ;
}
$shifts_deleted = array ();
2012-12-26 14:02:27 +01:00
foreach ( $shifts_db as $shift )
2014-03-26 20:04:11 +01:00
if ( ! isset ( $shifts_pb [ $shift [ 'PSID' ]]))
$shifts_deleted [] = $shift ;
return array (
$shifts_new ,
$shifts_updated ,
$shifts_deleted
2012-12-26 14:02:27 +01:00
);
2011-07-11 21:58:06 +02:00
}
2011-07-12 16:03:07 +02:00
function read_xml ( $file ) {
2012-12-26 14:02:27 +01:00
global $xml_import ;
2014-03-26 20:04:11 +01:00
if ( ! isset ( $xml_import ))
2012-12-26 14:02:27 +01:00
$xml_import = simplexml_load_file ( $file );
return $xml_import ;
2011-07-11 21:58:06 +02:00
}
function shifts_printable ( $shifts ) {
2012-12-26 14:02:27 +01:00
global $rooms_import ;
$rooms = array_flip ( $rooms_import );
2014-03-26 20:04:11 +01:00
2012-12-26 14:02:27 +01:00
uasort ( $shifts , 'shift_sort' );
2014-03-26 20:04:11 +01:00
$shifts_printable = array ();
2012-12-26 14:02:27 +01:00
foreach ( $shifts as $shift )
2014-03-26 20:04:11 +01:00
$shifts_printable [] = array (
'day' => date ( " l, Y-m-d " , $shift [ 'start' ]),
'start' => date ( " H:i " , $shift [ 'start' ]),
'name' => shorten ( $shift [ 'name' ]),
'end' => date ( " H:i " , $shift [ 'end' ]),
'room' => $rooms [ $shift [ 'RID' ]]
2012-12-26 14:02:27 +01:00
);
return $shifts_printable ;
2011-07-11 21:58:06 +02:00
}
function shift_sort ( $a , $b ) {
2014-03-26 20:04:11 +01:00
return ( $a [ 'start' ] < $b [ 'start' ]) ? - 1 : 1 ;
2011-07-11 21:58:06 +02:00
}
2011-06-03 16:52:57 +02:00
?>