restrictAccess(Auth::isManager()) ->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 = WT_Filter::get('action'); $from = WT_Filter::get('from', '\d\d\d\d-\d\d-\d\d', $earliest); $to = WT_Filter::get('to', '\d\d\d\d-\d\d-\d\d', $latest); $type = WT_Filter::get('type', 'accepted|rejected|pending'); $oldged = WT_Filter::get('oldged'); $newged = WT_Filter::get('newged'); $xref = WT_Filter::get('xref', WT_REGEX_XREF); $user = WT_Filter::get('user'); $search = WT_Filter::get('search'); $search = isset($search['value']) ? $search['value'] : null; if (Auth::isAdmin()) { // Administrators can see all logs $gedc = WT_Filter::get('gedc'); } else { // Managers can only see logs relating to this gedcom $gedc = WT_GEDCOM; } $query=array(); $args =array(); if ($search) { $query[] = "(old_gedcom LIKE CONCAT('%', ?, '%') OR new_gedcom LIKE CONCAT('%', ?, '%'))"; $args [] = $search; $args [] = $search; } 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(); $start = WT_Filter::getInteger('start'); $length = WT_Filter::getInteger('length'); $search = WT_Filter::get('search'); $search = $search['value']; Auth::user()->setPreference('admin_site_change_page_size', $length); if ($length>0) { $LIMIT = " LIMIT " . $start . ',' . $length; } else { $LIMIT = ""; } $order = WT_Filter::get('order'); if ($order) { $ORDER_BY = ' ORDER BY '; for ($i = 0; $i < count($order); ++$i) { if ($i > 0) { $ORDER_BY.=','; } // Datatables numbers columns 0, 1, 2, ... // MySQL numbers columns 1, 2, 3, ... switch ($order[$i]['dir']) { case 'asc': if (WT_Filter::getInteger('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 + $order[$i]['column']) . ' ASC '; } break; case 'desc': if (WT_Filter::getInteger('iSortCol_'.$i)==0) { $ORDER_BY .= 'change_id DESC '; } else { $ORDER_BY .= (1 + $order[$i]['column']) . ' DESC '; } break; } } } else { $ORDER_BY = 'ORDER BY 1 DESC'; } // This becomes a JSON list, not array, so need to fetch with numeric keys. $data=WT_DB::prepare($SELECT1.$WHERE.$ORDER_BY.$LIMIT)->execute($args)->fetchAll(PDO::FETCH_NUM); foreach ($data as &$datum) { $datum[1] = WT_I18N::translate($datum[1]); $datum[2] = '' . $datum[2] . ''; $datum[3] = '
' . WT_Filter::escapeHtml($datum[3]) . '
'; $datum[4] = '
' . WT_Filter::escapeHtml($datum[4]) . '
'; } // Total filtered/unfiltered rows $recordsFiltered = WT_DB::prepare("SELECT FOUND_ROWS()")->fetchOne(); $recordsTotal = WT_DB::prepare($SELECT2.$WHERE)->execute($args)->fetchOne(); header('Content-type: application/json'); echo json_encode(array( // See http://www.datatables.net/usage/server-side 'draw' => WT_Filter::getInteger('draw'), // Always an integer 'recordsTotal' => $recordsTotal, 'recordsFiltered' => $recordsFiltered, 'data' => $data )); exit; } $controller ->pageHeader() ->addExternalJavascript(WT_JQUERY_DATATABLES_URL) ->addInlineJavascript(' jQuery("#log_list").dataTable( { "dom": \'<"H"pf<"dt-clear">irl>t<"F"pl>\', "processing": true, "serverSide": true, "ajax": "'.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)) . ', jQueryUI: true, autoWidth: false, sorting: [[ 0, "desc" ]], pageLength: ' . Auth::user()->getPreference('admin_site_change_page_size', 10) . ', pagingType: "full_numbers", columns: [ /* Timestamp */ { }, /* Status */ { }, /* Record */ { }, /* Old data */ { class: "raw_gedcom", sortable: false }, /* New data */ { class: "raw_gedcom", sortable: false }, /* 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(); foreach (User::all() as $tmp_user) { $users_array[$tmp_user->getUserName()] = $tmp_user->getUserName(); } 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, Auth::isAdmin() ? '' : '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'), '
'; }