diff options
-rw-r--r-- | php/lib/list.php | 391 |
1 files changed, 391 insertions, 0 deletions
diff --git a/php/lib/list.php b/php/lib/list.php new file mode 100644 index 0000000..5deb5e9 --- /dev/null +++ b/php/lib/list.php @@ -0,0 +1,391 @@ +<?php +/** + * List functions for lists of values. + * @package mirror + * @subpackage lib + * @author Mike Morgan <mike.morgan@oregonstate.edu> + * + * Usage example: + * <code> + * $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); + * </code> + * + * Accompanying CSS for table output: + * <code> + * .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; + * } + * </code> + + * Accompanying JavaScript for select all / inverse: + * <code> + * <script type="text/javascript"> + * //<!-- + * function selectAll(formObj,invert) + * { + * for (var i=0;i < formObj.elements.length;i++) + * { + * fldObj = formObj.elements[i]; + * if (fldObj.type == 'checkbox') + * { + * if (invert==1) + * { + * fldObj.checked = (fldObj.checked) ? false : true; + * } + * else + * { + * fldObj.checked = true; + * } + * } + * } + * } + * //--> + * </script> + * </code> + */ + +/** + * 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".'<table class="list">'; + show_headers($headers,$type,$sortable); + echo "\n".'<tbody>'; + foreach ($list as $row) + { + show_row($headers,$row,$type,$count++,$selected); + } + echo "\n".'</tbody>'; + echo "\n".'</table>'; + if ($type=='checkbox') + { +echo <<<js +<script type="text/javascript"> +//<!-- +function list_select(formObj,invert) +{ + for (var i=0;i < formObj.elements.length;i++) + { + fldObj = formObj.elements[i]; + if (fldObj.type == 'checkbox') + { + if (invert==1) + { + fldObj.checked = (fldObj.checked) ? false : true; + } + else + { + fldObj.checked = true; + } + } + } +} +//--> +</script> +js; + echo "\n".'<p><input type="button" name="selectall" onclick="list_select(this.form,0);" class="button2" value="Select All"/> <input type="button" name="selectall" onclick="list_select(this.form,1);" class="button2" value="Invert"/></p>'; + } + if ($type=='radio'||$type='checkbox-small') + { + echo '<br />'; + } + if (is_array($actions)&&$type!='simple') + { + if (count($actions) == 1) { + $actions = array_values($actions); + echo '<p>'; + form_submit('submit','submit','button1',$actions[0].' »'); + echo '</p>'; + } else { + echo '<p>'; + echo '<label for="action">With selected: </label>'; + form_select('action','action','text2',$actions,''); + form_submit('submit','submit','button1','Go »'); + echo '</p>'; + } + } + } + elseif ( !is_array($headers) ) + { + echo "\n".'<h1>FIX HEADERS ARRAY</h1>'; + } + else + { + echo "\n".'<p>No records found.</p>'; + } +} + +/** + * 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".'<thead><tr>'; + $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".'<th> </th>'; + 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".'<th><a '.$a_class.'href="'.$_SERVER['PHP_SELF'].'?'.implode('&',$querystring).'">'.$title.'</a></th>'; + unset($qs); + unset($querystring); + } + else + { + echo "\n".'<th>'.$title.'</th>'; + } + $count++; + } + echo "\n".'</tr></thead>'; +} + +/** + * 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".'<tr'.$tr_class.'>'; + 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".'<td>'; + form_checkbox($idname.'[]',$id,null,$row[$index],(is_array($selected) && in_array($row[$index], $selected))); + echo "\n".'</td>'; + } + elseif ($type=='radio') + { + echo "\n".'<td>'; + form_radio($idname,$id,null,$row[$index], ($row[$index] == $selected)); + echo "\n".'</td>'; + } + } + else + { + echo ($type=='simple')?"\n".'<td>'.$row[$index].'</td>':"\n".'<td><label for="'.$id.'">'.$row[$index].'</label></td>'; + } + $count++; + } + echo "\n".'</tr>'; +} + +/** + * 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. + * <ul> + * <li>name will be used to retrieve an _array_ from $_POST of the same name</li> + * <li>the form will be an include, with $posts[col_name] as the default for all values</li> + * <li>try to keep your query simple (no crazy sorting, etc.) -- we're talking one record at a time here anyway</li> + * </ul> + * Example: + * <code> + * list_edit_ids('course_id','../forms/course.php','SELECT * FROM fic_courses','1'); + * </code> + * @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".'<div class="record">'; + $record=form_array_fix_dates($dates,$datetimes,2,$record); + foreach ($record as $key=>$val) + { + $posts[$key]=clean_out($val); + } + include($form); + echo "\n".'<div class="record-submit">'; + form_submit('submit', '', 'button1'); + echo "\n".'</div>'; + echo "\n".'</div>'; + } + form_end(); + } + else + { + echo '<p>You must select a record. <a href="javascript:history.back();">Go back</a>.</p>'; + } +} + +/** + * 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); + } +} +?> |