requireManagerLogin() ->setPageTitle(WT_I18N::translate('Changes')); require WT_ROOT.'includes/functions/functions_edit.php'; $statuses=array( '' =>'', 'accepted'=>/* I18N: the status of an edit accepted/rejected/pending */ WT_I18N::translate('accepted'), 'rejected'=>/* I18N: the status of an edit accepted/rejected/pending */ WT_I18N::translate('rejected'), 'pending' =>/* I18N: the status of an edit accepted/rejected/pending */ WT_I18N::translate('pending' ), ); $earliest=WT_DB::prepare("SELECT DATE(MIN(change_time)) FROM `##change`")->execute(array())->fetchOne(); $latest =WT_DB::prepare("SELECT DATE(MAX(change_time)) FROM `##change`")->execute(array())->fetchOne(); // Filtering $action=safe_GET('action'); $from =safe_GET('from', '\d\d\d\d-\d\d-\d\d', $earliest); $to =safe_GET('to', '\d\d\d\d-\d\d-\d\d', $latest); $type =safe_GET('type', array_keys($statuses)); $oldged=safe_GET('oldged'); $newged=safe_GET('newged'); $xref =safe_GET('xref'); $user =safe_GET('user'); if (WT_USER_IS_ADMIN) { // Administrators can see all logs $gedc=safe_GET('gedc'); } else { // Managers can only see logs relating to this gedcom $gedc=WT_GEDCOM; } $query=array(); $args =array(); if ($from) { $query[]='change_time>=?'; $args []=$from; } if ($to) { $query[]='change_timeexecute($args); break; case 'export': Zend_Session::writeClose(); header('Content-Type: text/csv'); header('Content-Disposition: attachment; filename="webtrees-changes.csv"'); $rows=WT_DB::prepare($SELECT1.$WHERE.' ORDER BY change_id')->execute($args)->fetchAll(); foreach ($rows as $row) { $row->old_gedcom = str_replace('"', '""', $row->old_gedcom); $row->old_gedcom = str_replace("\n", '""', $row->old_gedcom); $row->new_gedcom = str_replace('"', '""', $row->new_gedcom); $row->new_gedcom = str_replace("\n", '""', $row->new_gedcom); echo '"', $row->change_time, '",', '"', $row->status, '",', '"', $row->xref, '",', '"', $row->old_gedcom, '",', '"', $row->new_gedcom, '",', '"', str_replace('"', '""', $row->user_name), '",', '"', str_replace('"', '""', $row->gedcom_name), '"', "\n"; } exit; case 'load_json': Zend_Session::writeClose(); $iDisplayStart =(int)safe_GET('iDisplayStart'); $iDisplayLength=(int)safe_GET('iDisplayLength'); set_user_setting(WT_USER_ID, 'admin_site_change_page_size', $iDisplayLength); if ($iDisplayLength>0) { $LIMIT=" LIMIT " . $iDisplayStart . ',' . $iDisplayLength; } else { $LIMIT=""; } $iSortingCols=safe_GET('iSortingCols'); if ($iSortingCols) { $ORDER_BY=' ORDER BY '; for ($i=0; $i<$iSortingCols; ++$i) { // Datatables numbers columns 0, 1, 2, ... // MySQL numbers columns 1, 2, 3, ... switch (safe_GET('sSortDir_'.$i)) { case 'asc': if ((int)safe_GET('iSortCol_'.$i)==0) { $ORDER_BY.='change_id ASC '; // column 0 is "timestamp", using change_id gives the correct order for events in the same second } else { $ORDER_BY.=(1+(int)safe_GET('iSortCol_'.$i)).' ASC '; } break; case 'desc': if ((int)safe_GET('iSortCol_'.$i)==0) { $ORDER_BY.='change_id DESC '; } else { $ORDER_BY.=(1+(int)safe_GET('iSortCol_'.$i)).' DESC '; } break; } if ($i<$iSortingCols-1) { $ORDER_BY.=','; } } } else { $ORDER_BY='1 DESC'; } // This becomes a JSON list, not array, so need to fetch with numeric keys. $aaData=WT_DB::prepare($SELECT1.$WHERE.$ORDER_BY.$LIMIT)->execute($args)->fetchAll(PDO::FETCH_NUM); foreach ($aaData as &$row) { $row[1]=WT_I18N::translate($row[1]); $row[2]=''.$row[2].''; $row[3]='
'.htmlspecialchars($row[3]).'
'; $row[4]='
'.htmlspecialchars($row[4]).'
'; } // Total filtered/unfiltered rows $iTotalDisplayRecords=WT_DB::prepare("SELECT FOUND_ROWS()")->fetchColumn(); $iTotalRecords=WT_DB::prepare($SELECT2.$WHERE)->execute($args)->fetchColumn(); header('Content-type: application/json'); echo json_encode(array( // See http://www.datatables.net/usage/server-side 'sEcho' =>(int)safe_GET('sEcho'), 'iTotalRecords' =>$iTotalRecords, 'iTotalDisplayRecords'=>$iTotalDisplayRecords, 'aaData' =>$aaData )); exit; } $controller ->pageHeader() ->addExternalJavascript(WT_JQUERY_DATATABLES_URL) ->addInlineJavascript(' var oTable=jQuery("#log_list").dataTable( { "sDom": \'<"H"pf<"dt-clear">irl>t<"F"pl>\', "bProcessing": true, "bServerSide": true, "sAjaxSource": "'.WT_SERVER_NAME.WT_SCRIPT_PATH.WT_SCRIPT_NAME.'?action=load_json&from='.$from.'&to='.$to.'&type='.$type.'&oldged='.rawurlencode($oldged).'&newged='.rawurlencode($newged).'&xref='.rawurlencode($xref).'&user='.rawurlencode($user).'&gedc='.rawurlencode($gedc).'", '.WT_I18N::datatablesI18N(array(10,20,50,100,500,1000,-1)).', "bJQueryUI": true, "bAutoWidth":false, "aaSorting": [[ 0, "desc" ]], "iDisplayLength": '.get_user_setting(WT_USER_ID, 'admin_site_change_page_size', 10).', "sPaginationType": "full_numbers", "aoColumns": [ /* Timestamp */ {}, /* Status */ {}, /* Record */ {}, /* Old data */ {"sClass":"raw_gedcom"}, /* New data */ {"sClass":"raw_gedcom"}, /* User */ {}, /* Family tree */ {} ] }); '); $url= WT_SCRIPT_NAME.'?from='.rawurlencode($from). '&to='.rawurlencode($to). '&type='.rawurlencode($type). '&oldged='.rawurlencode($oldged). '&newged='.rawurlencode($newged). '&xref='.rawurlencode($xref). '&user='.rawurlencode($user). '&gedc='.rawurlencode($gedc); $users_array=array_combine(get_all_users(), get_all_users()); uksort($users_array, 'strnatcasecmp'); echo '
', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '
', // I18N: %s are both user-input date fields WT_I18N::translate('From %s to %s', '', ''), '
', WT_I18N::translate('Status'), '
', select_edit_control('type', $statuses, null, $type, ''), '
', WT_I18N::translate('Record'), '
', '
', WT_I18N::translate('Old data'), '
', '
', WT_I18N::translate('New data'), '
', '
', WT_I18N::translate('User'), '
', select_edit_control('user', $users_array, '', $user, ''), '
', WT_I18N::translate('Family tree'), '
', select_edit_control('gedc', WT_Tree::getNameList(), '', $gedc, WT_USER_IS_ADMIN ? '' : 'disabled'), '
', '', '', '', '
', '
'; if ($action) { echo '
', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '
', WT_I18N::translate('Timestamp'), '', WT_I18N::translate('Status'), '', WT_I18N::translate('Record'), '', WT_I18N::translate('Old data'), '', WT_I18N::translate('New data'), '', WT_I18N::translate('User'), '', WT_I18N::translate('Family tree'), '
'; }