* * Usage example: * * $orderby=get_order(); * $query="SELECT * FROM fic_courses $orderby"; * $courses=db_get($query,MYSQL_ASSOC); * $headers=array( * 'course_id'=>'', * 'title'=>'Course Title', * 'date_start_course'=>'Start', * 'date_end_course'=>'End', * 'date_start_reg'=>'Reg Starts', * 'date_end_reg'=>'Reg Ends', * 'active'=>'Active?', * 'entry_date'=>'Created' * ); * show_list($courses,$headers); * * * Accompanying CSS for table output: * * .list * { * border:1px solid #999; * } * .list th * { * background:#eee; * border:1px solid #000; * font-weight:bold; * } * .list th a * { * display:block; * padding:0 14px; * } * .list th a:hover * { * background-color:#fff; * } * .row1 * { * background:#ddd; * } * .row2 * { * background:#ccc; * } * .row1:hover, .row2:hover * { * background-color:#fec; * } * .current-sort * { * background:#fda; * } * .sort-desc * { * background:#fec url(../img/up.gif) no-repeat right; * } * .sort-asc * { * background:#fec url(../img/down.gif) no-repeat right; * } * * Accompanying JavaScript for select all / inverse: * * * */ /** * Show a list of values, for forms. * @param array $list associative array * @param array $headers column name => column title (for table heads) * @param string $type checkbox, radio, simple * @param array $array actions to display in actions select list * @param string $form_id id of form holding list * @param bool $sortable whether or not to show sortable column headers (links in th's) * @param array|string $selected if type is checkbox, array otherwise string with one val */ function show_list($list,$headers,$type='checkbox',$actions=null,$form_id=null,$sortable=true,$selected=null) { if ( is_array($list) && count($list)>0 && is_array($headers) ) { if ( $type!='simple' && !empty($_GET['sort']) && !empty($_GET['order']) ) { form_hidden('sort',$_GET['sort']); form_hidden('order',$_GET['order']); } echo "\n".''; show_headers($headers,$type,$sortable); echo "\n".''; foreach ($list as $row) { show_row($headers,$row,$type,$count++,$selected); } echo "\n".''; echo "\n".'
'; if ($type=='checkbox') { echo << // js; echo "\n".'

'; } if ($type=='radio'||$type='checkbox-small') { echo '
'; } if (is_array($actions)&&$type!='simple') { if (count($actions) == 1) { $actions = array_values($actions); echo '

'; form_submit('submit','submit','button1',$actions[0].' »'); echo '

'; } else { echo '

'; echo ''; form_select('action','action','text2',$actions,''); form_submit('submit','submit','button1','Go »'); echo '

'; } } } elseif ( !is_array($headers) ) { echo "\n".'

FIX HEADERS ARRAY

'; } else { echo "\n".'

No records found.

'; } } /** * Show table headers. * @param array $headers column name => column title (for table heads) * @param string $type type of list that is being shown * @param bool $sortable whether or not to show sortable column headers (links in th's) */ function show_headers($headers,$type,$sortable=true) { echo "\n".''; $sort=$_GET['sort']; $order=get_order(); $count=0; foreach ($headers as $col=>$title) { if ( !empty($sort) && !empty($order) ) { if ($col==$sort && $order=='ASC') { $a_class=' class="sort-asc current-sort" '; } elseif ($col==$sort && $order=='DESC') { $a_class=' class="sort-desc current-sort" '; } else { $a_class=null; } } if ($type!='simple'&&$count==0) { echo "\n".' '; next; } elseif($sortable) { $qs = array(); foreach ($_GET as $qn=>$qv) { $qs[$qn] = $qv; } // existing query string variables $qs['sort'] = $col; // add/replace sort to query string $qs['order'] = $order; // add/replace order by to query string foreach ($qs as $qn=>$qv) { $querystring[] = $qn.'='.$qv; } // existing query string variables echo "\n".''.$title.''; unset($qs); unset($querystring); } else { echo "\n".''.$title.''; } $count++; } echo "\n".''; } /** * Show table data. * @param array $headers column name => column title (for knowing which ones to display) * @param array $row table row, assoc * @param string $type type of table, determines first column, which could be an input * @param array|string $selected selected items; if type is checkbox, array otherwise string with one val */ function show_row($headers,$row,$type,$num=null,$selected=null) { $indexes=array_keys($headers); $idname = $indexes[0]; $count=0; $tr_class=($num%2)?' class="row1" ':' class="row2" '; echo "\n".''; foreach ($indexes as $index) { $row[$index]=clean_out($row[$index]); if ($type!='simple'&&$count==0) { $id=preg_replace('/[^[:alnum:]]/', '', $index).$row[$index]; if ($type=='checkbox'||$type=='checkbox-small') { echo "\n".''; form_checkbox($idname.'[]',$id,null,$row[$index],(is_array($selected) && in_array($row[$index], $selected))); echo "\n".''; } elseif ($type=='radio') { echo "\n".''; form_radio($idname,$id,null,$row[$index], ($row[$index] == $selected)); echo "\n".''; } } else { echo ($type=='simple')?"\n".''.$row[$index].'':"\n".''; } $count++; } echo "\n".''; } /** * Determine current sort order. */ function get_order() { return ($_GET['order']=='ASC')?'DESC':'ASC'; } /** * Determine whether or not list is currently sorted. * @param string $method which http method to check for sort information * @return mixed cleaned orderby clause based on saved sort information or null if no orderby is set in the defined method */ function get_orderby($method='get') { if ( $method=='get' && !empty($_GET['sort']) && !empty($_GET['order']) ) { $sort=clean_in($_GET['sort']); $order=clean_in($_GET['order']); return " ORDER BY $sort $order "; } elseif ( $method=='post' && !empty($_POST['sort']) && !empty($_POST['order']) ) { $sort=clean_in($_POST['sort']); $order=clean_in($_POST['order']); return " ORDER BY $sort $order "; } elseif ( $method=='session' && !empty($_SESSION['sort']) && !empty($_SESSION['order']) ) { $sort=clean_in($_SESSION['sort']); $order=clean_in($_SESSION['order']); return " ORDER BY $sort $order "; } else return null; } /** * Parses $_POST for ids, shows edit forms for each id with populated data. * * Example: * * list_edit_ids('course_id','../forms/course.php','SELECT * FROM fic_courses','1'); * * @param string $name name of id field * @param string $form path to form to be used to items * @param string $q_front front half of query * @param string $q_where where statement * @param array $dates array of date field names, so they can be fixed for forms * @param array $datetimes array of datetime field names, so they can be fixed for forms */ function list_edit_ids($name,$form,$q_front,$q_where='1',$dates=null,$datetimes=null) { if ( !empty($_SESSION[$name]) && is_array($_SESSION[$name]) ) { $ids=implode(',',$_SESSION[$name]); $orderby=get_orderby('session'); $query=$q_front.' WHERE '.$q_where." AND $name IN($ids) ".$orderby; $records=db_get($query); form_start($name); foreach ($records as $record) { echo "\n".'
'; $record=form_array_fix_dates($dates,$datetimes,2,$record); foreach ($record as $key=>$val) { $posts[$key]=clean_out($val); } include($form); echo "\n".'
'; form_submit('submit', '', 'button1'); echo "\n".'
'; echo "\n".'
'; } form_end(); } else { echo '

You must select a record. Go back.

'; } } /** * Process a submitted list_edit_ids form. * @param array $name array of primary ids posted from the form, these are vital to the WHERE clause of the UPDATE statements. * @param string $table name of table being affected */ function list_update_ids($name,$table) { $keys=array_keys($_POST[$name]); foreach ($keys as $index) { foreach ($_POST as $key=>$val) { if ($key!='submit') { $posts[$index][$key]=$val[$index]; } } } foreach ($posts as $dataset) { $query=db_makeupdate($dataset,$table," WHERE $name='".$dataset[$name]."' "); db_query($query); } } ?>