mirror of
https://github.com/EGroupware/egroupware.git
synced 2024-12-23 15:18:58 +01:00
545 lines
13 KiB
PHP
545 lines
13 KiB
PHP
<?php
|
|
/**************************************************************************\
|
|
* eGroupWare - html *
|
|
* http://www.egroupware.org *
|
|
* Written by Jerry Westrick <jerry@westrick.com> *
|
|
* -------------------------------------------- *
|
|
* This program is free software; you can redistribute it and/or modify it *
|
|
* under the terms of the GNU General Public License as published by the *
|
|
* Free Software Foundation; either version 2 of the License, or (at your *
|
|
* option) any later version. *
|
|
\**************************************************************************/
|
|
|
|
/* $Id$ */
|
|
|
|
class html_tables
|
|
{
|
|
function hash_table($rows,$head='',$obj, $frtn)
|
|
{
|
|
$start = $_POST['start'] ? $_POST['start'] : $_GET['start'];
|
|
|
|
$html = '';
|
|
$edittable = $head['_edittable'];
|
|
if(isset($edittable))
|
|
{
|
|
if($edittable)
|
|
{
|
|
// Generate the customization table...
|
|
return $this->edit_table($rows,$head,$obj,$frtn);
|
|
}
|
|
else
|
|
{
|
|
#$html .= '<form method="post" action="'
|
|
# . $GLOBALS['egw']->link('/index.php')
|
|
# . '">' . "\n";
|
|
$bo =& CreateObject('admin.bolog',True);
|
|
if(!isset($start))
|
|
{
|
|
$start = 0;
|
|
}
|
|
$num_rows = $GLOBALS['egw_info']['user']['preferences']['common']['maxmatchs'];
|
|
$stop = $start + $num_rows;
|
|
if($stop > count($rows))
|
|
{
|
|
$stop = count($rows);
|
|
}
|
|
$nextmatchs =& CreateObject('phpgwapi.nextmatchs');
|
|
$total_records = $bo->get_no_errors();
|
|
$left = $nextmatchs->left('/index.php',$start,$total_records,'menuaction=admin.uilog.list_log');
|
|
$right = $nextmatchs->right('/index.php',$start,$total_records,'menuaction=admin.uilog.list_log');
|
|
$hits = $nextmatchs->show_hits($total_records,$start);
|
|
|
|
$html .= '<table width="98%"><tr>';
|
|
$html .= $left;
|
|
$html .= '<td align="right"> ' . $hits . ' </td>';
|
|
$html .= '<td align="left"> <a href=' . $GLOBALS['egw']->link('/index.php','menuaction=admin.uilog.list_log&editable=true') .'> ' . lang('Edit Table format') . '</a></td>';
|
|
$html .= $right;
|
|
$html .= '</tr></table>';
|
|
}
|
|
}
|
|
|
|
if($head == '')
|
|
{
|
|
$frow = $rows[0];
|
|
$cnam = $this->arr_keys($frow);
|
|
while(list(,$fn)=each($cnam))
|
|
{
|
|
$head[$fn] = array();
|
|
}
|
|
}
|
|
|
|
if(@is_null($head['_cols']))
|
|
{
|
|
$cols = $this->arr_keys($rows[0]);
|
|
}
|
|
else
|
|
{
|
|
$cols = $head['_cols'];
|
|
}
|
|
|
|
// Build Header Row...
|
|
|
|
// First Get the layout arrays...
|
|
$layout = $head['#layout'];
|
|
if(!is_array($layout))
|
|
{
|
|
$layout = $this->arr_keys($cols);
|
|
}
|
|
|
|
// printlist, a list of all columns in a logical row,
|
|
// with Row/ColSpawn values, in print order...
|
|
|
|
$printlist = $this->make_printlist($layout,$cols);
|
|
|
|
// $table contains data for header row....
|
|
$table = $this->make_tblhead($printlist,$head);
|
|
|
|
// get GroupBy
|
|
$groupby = $head['_groupby'];
|
|
$supres = $head['_supres'];
|
|
$lastgroup = '';
|
|
|
|
// build actual Rows...
|
|
$rparms = array();
|
|
$mrow = $stop;
|
|
for($rno=0;$rno<$mrow;$rno++)
|
|
{
|
|
// Build GroupKey
|
|
if(isset($groupby))
|
|
{
|
|
$gkey = '';
|
|
reset($groupby);
|
|
while(list($gname,)=each($groupby))
|
|
{
|
|
$gkey .= $rows[$rno][$gname]['value'];
|
|
}
|
|
$rows[$rno]['#gkey'] = $gkey;
|
|
}
|
|
|
|
reset($printlist);
|
|
while(list($pc,$pcol)=each($printlist))
|
|
{
|
|
$cname = $pcol['#name'];
|
|
$cparms = $this->arr_merge($head[$cname],$pcol,array('bgcolor'=>'#FFFFFF'),$rows[$rno][$cname]);
|
|
$rows[$rno][$cname] = $cparms;
|
|
}
|
|
}
|
|
|
|
// Grouping Suppression
|
|
|
|
if(isset($groupby))
|
|
{
|
|
$grno = $start;
|
|
$gkey = $rows[$start]['#gkey'];
|
|
for($rno=$start+1;$rno<$stop;$rno++)
|
|
{
|
|
$rowspan = 1;
|
|
$rkey = $rows[$rno]['#gkey'];
|
|
|
|
while( $gkey == $rkey)
|
|
{
|
|
//echo "<p>grno:$grno ($gkey) rno:$rno ($rkey) are equal</p>";
|
|
$rowspan = $rowspan + 1;
|
|
$row = $rows[$rno];
|
|
|
|
for($pc=0;$pc<count($row);$pc++)
|
|
{
|
|
$c = $row[$cols[$pc]];
|
|
$cno = $c['#colno'];
|
|
$cname = $c['#name'];
|
|
|
|
if($supres[$cname])
|
|
{
|
|
$rows[$rno][$cname]['#supres']='yes';
|
|
$rows[$rno][$cname]['value']='  ';
|
|
$rows[$grno][$cname]['rowspan']=$printlist[$cno]['rowspan']*$rowspan;
|
|
}
|
|
}
|
|
$rno++;
|
|
$rkey = $rows[$rno]['#gkey'];
|
|
}
|
|
//echo "<p>grno:$grno ($gkey) rno:$rno ($rkey) are not equal</p>";
|
|
$grno=$rno;
|
|
$gkey=$rkey;
|
|
}
|
|
}
|
|
/*
|
|
** Now Generate the Html For the Table Header
|
|
*/
|
|
//print_r($table);
|
|
|
|
$html .= $this->html_head($head,$table,$printlist);
|
|
/*
|
|
** Now (finally) Generate the Html For the Table
|
|
*/
|
|
//print_r($rows);
|
|
for($rno=$start;$rno<$stop;$rno++)
|
|
{
|
|
// let user have a hack at the row...
|
|
$row = $obj->$frtn($rno,$rows[$rno]);
|
|
// $row = $rows[$rno];
|
|
|
|
// $rp = $this->makeparms($row[$rno]['#row_parms']);
|
|
$rp = '';
|
|
$gkey = $row['#gkey'];
|
|
// $html .= "\t<tr $rp> <comment $gkey>\n";
|
|
$html .= "\t<tr $rp> \n";
|
|
reset($printlist);
|
|
while(list($pc,$pcol)=each($printlist))
|
|
{
|
|
$cname = $pcol['#name'];
|
|
|
|
$cp = $this->makeparms($row[$cname]);
|
|
if($row[$cname]['#supres'] != 'yes')
|
|
{
|
|
$html .= "\t\t<td $cp>".$row[$cname]['value']."</td>\n";
|
|
}
|
|
if($pcol['#eor']=='1')
|
|
{
|
|
$html .= "\t</tr>\n"; // \t<tr $rp>\n
|
|
}
|
|
}
|
|
}
|
|
$html .= "</table>\n";
|
|
#$html .= "</form>";
|
|
return $html;
|
|
}
|
|
|
|
function makeparms($parmlist)
|
|
{
|
|
$html = '';
|
|
$comma = ' ';
|
|
if(!is_array($parmlist))
|
|
{
|
|
return '';
|
|
}
|
|
reset($parmlist);
|
|
while(list($pname,$pvalue)=each($parmlist))
|
|
{
|
|
switch($pname)
|
|
{
|
|
case 'value':
|
|
break;
|
|
case 'colspan':
|
|
case 'rowspan':
|
|
if($pvalue != 1)
|
|
{
|
|
$html .= $comma . $pname . '="' . $pvalue . '"';
|
|
#$comma = ', ';
|
|
$comma = ' ';
|
|
};
|
|
break;
|
|
default:
|
|
if(substr($pname,0,1) != '#')
|
|
{
|
|
$html .= $comma . $pname . '="' . $pvalue . '"';
|
|
#$comma = ', ';
|
|
$comma = ' ';
|
|
}
|
|
}
|
|
}
|
|
return $html;
|
|
}
|
|
|
|
function edit_table($rows,$head='',$obj, $frtn)
|
|
{
|
|
$nocols = $_POST['nocols'];
|
|
$noflds = $_POST['noflds'];
|
|
$norows = $_POST['norows'];
|
|
$layout = $_POST['layout'];
|
|
$_cols = $_POST['_cols'];
|
|
|
|
$html = '';
|
|
$html .= '<form method="post" action="'
|
|
. $GLOBALS['egw']->link('/index.php','menuaction=admin.uilog.list_log&editable=true')
|
|
. '">' . "\n";
|
|
|
|
$params = $head['_table_parms'];
|
|
$frow = $rows[0];
|
|
$cnam = $this->arr_keys($frow);
|
|
if($head == '')
|
|
{
|
|
while(list(,$fn)=each($cnam))
|
|
{
|
|
$head[$fn] = array();
|
|
}
|
|
}
|
|
|
|
if(isset($_cols))
|
|
{
|
|
$cols = $_cols;
|
|
}
|
|
else
|
|
{
|
|
if(@is_null($head['_cols']))
|
|
{
|
|
$cols = $this->arr_keys($rows[0]);
|
|
}
|
|
else
|
|
{
|
|
$cols = $head['_cols'];
|
|
}
|
|
}
|
|
|
|
if(!isset($noflds))
|
|
{
|
|
$noflds = count($cols);
|
|
}
|
|
if(!isset($layout))
|
|
{
|
|
$layout = $head['#layout'];
|
|
}
|
|
if(!isset($norows))
|
|
{
|
|
$norows = count($layout);
|
|
}
|
|
if(!isset($nocols))
|
|
{
|
|
$nocols = count($layout[0]);
|
|
}
|
|
// Table Excmple
|
|
|
|
// Build Header Row...
|
|
$html .= "<h2>Table Size</h2>";
|
|
// $html .= "<p>";
|
|
$html .= "Rows: ";
|
|
$html .= "<input type=\"input\" name=\"norows\" value=\"$norows\">";
|
|
$html .= "Columns: ";
|
|
$html .= "<input type=\"input\" name=\"nocols\" value=\"$nocols\">";
|
|
$html .= "Fields: ";
|
|
$html .= "<input type=\"input\" name=\"noflds\" value=\"$noflds\">";
|
|
// $html .= "\t<tr> ";
|
|
|
|
// Column Defintions...
|
|
$html .= "<h2>Column Definition</h2>";
|
|
$html .= "<table width=\"98%\" bgcolor=\"#000000\">\n";
|
|
$f = array();
|
|
for($fno=0;$fno<$noflds;$fno++)
|
|
{
|
|
$f[]=$fno;
|
|
}
|
|
// Column Headings
|
|
$html .= "\t<tr bgcolor=\"#D3DCFF\">\n";
|
|
for($cno=0;$cno<$nocols;$cno++)
|
|
{
|
|
$html .= "\t\t<td align=\"center\">$cno</td>\n";
|
|
}
|
|
$html .= "\t</tr >\n";
|
|
for($rno=0;$rno<$norows;$rno++)
|
|
{
|
|
$html .= "\t<tr bgcolor=\"#D3DCFF\">\n";
|
|
for($cno=0;$cno<$nocols;$cno++)
|
|
{
|
|
$c = $layout[$rno][$cno];
|
|
$tname = "layout[$rno][]";
|
|
$t = $this->DropDown($f,$tname,$c);
|
|
$html .= "\t\t<td align=\"center\">$t</td>\n";
|
|
}
|
|
$html .= "\t</tr >\n";
|
|
}
|
|
$html .= "</table>\n";
|
|
$html .= "<p>\n";
|
|
|
|
// Header of Table...
|
|
$printlist = $this->make_printlist($layout,$cols);
|
|
$table = $this->make_tblhead($printlist,$head);
|
|
$html .= $this->html_head($head,$table,$printlist);
|
|
$html .= "</table>\n";
|
|
|
|
$html .= "<input type=\"submit\" name=\"submit\" value=\"Update\">";
|
|
//Field Definitions
|
|
$html .= "<h2>Field Definitions</h2>";
|
|
$html .= "<table width=\"98%\" bgcolor=\"#D3DCFF\">\n";
|
|
$html .= "\t\t<td width=\"2%\" align=\"center\">No</td>\n";
|
|
$html .= "\t\t<td width=\"2%\" align=\"center\">Del</td>\n";
|
|
$html .= "\t\t<td width=\"5%\">Field</td>\n";
|
|
$html .= "\t\t<td>Value</td>\n";
|
|
$html .= "\t</tr>\n";
|
|
|
|
// Add Table Rows...
|
|
reset($cols);
|
|
// while(list($cno,$name) = each($cols))
|
|
for($fno=0;$fno<$noflds;$fno++)
|
|
{
|
|
$name = $cols[$fno];
|
|
$values = $head[$name];
|
|
$title = $values['title'];
|
|
if($title == '')
|
|
{
|
|
$title = $name;
|
|
}
|
|
$html .= "\t</tr>\n";
|
|
$html .= "\t\t<td bgcolor=\"#FFFFFF\">$fno</td>\n";
|
|
$html .= "\t\t<td bgcolor=\"#FFFFFF\"><input type=\"checkbox\" name=\"_delcol[]\" value=\"$fno\"></td>\n";
|
|
$html .= "\t\t<td bgcolor=\"#FFFFFF\">".$this->dropdown($cnam,'_cols[]',$name)."</td>\n";
|
|
$value = $rows[0][$name]['value'];
|
|
$html .= "\t\t<td bgcolor=\"#FFFFFF\">$value</td>\n";
|
|
$html .= "\t</tr>\n";
|
|
}
|
|
$html .= "</table>\n";
|
|
$html .= "<input type=\"submit\" name=\"modifytable\" value=\"Save Changes\">";
|
|
$html .= "</form>";
|
|
return $html;
|
|
}
|
|
|
|
function dropdown($opts,$name='',$sel='')
|
|
{
|
|
$items = $opts;
|
|
$html = '<select ';
|
|
if($name != '')
|
|
{
|
|
$html .= 'name="'.$name.'"';
|
|
}
|
|
$html .= ">\n";
|
|
|
|
while(list(,$itm)=each($opts))
|
|
{
|
|
$html .= '<option value="'.$itm.'" ';
|
|
if($itm == $sel)
|
|
{
|
|
$html .= 'selected ';
|
|
}
|
|
$html .= '>'.$itm."</option>\n";
|
|
}
|
|
$html .= "</select>\n";
|
|
return $html;
|
|
}
|
|
|
|
function make_printlist($layout,$cols)
|
|
{
|
|
// Build Printlist... (Col and Row Spans...)
|
|
$tlayout = $layout;
|
|
$printlist = array();
|
|
$mrows = count($tlayout);
|
|
$mcols = count($tlayout[0]);
|
|
for($pr=0;$pr<$mrows;$pr++)
|
|
{
|
|
for($pc=0;$pc<$mcols;$pc++)
|
|
{
|
|
if(isset($tlayout[$pr][$pc]))
|
|
{
|
|
$cno = $tlayout[$pr][$pc];
|
|
$cname = $cols[$cno];
|
|
$colspan=1;
|
|
$rowspan=1;
|
|
while(($pr + $rowspan < $mrows) && ($tlayout[$pr + $rowspan][$pc] == $cno))
|
|
{
|
|
unset($tlayout[$pr + $rowspan][$pc]);
|
|
$rowspan++;
|
|
}
|
|
while(($pc + $colspan < $mcols) && ($tlayout[$pr][$pc+$colspan] == $cno))
|
|
{
|
|
unset($tlayout[$pr][$pc+$colspan]);
|
|
$colspan++;
|
|
}
|
|
if($colspan > 1 && $rowspan > 1)
|
|
{
|
|
for($r=$pr+1;$r<$pr+$rowspan;$r++)
|
|
{
|
|
for($c=$pc+1;$c<$pc+$colspan;$c++)
|
|
{
|
|
unset($tlayout[$r][$c]);
|
|
}
|
|
}
|
|
}
|
|
$printlist[] = array(
|
|
'#name' =>$cname,
|
|
'rowspan' =>$rowspan,
|
|
'colspan' =>$colspan,
|
|
'valign' =>'top',
|
|
'#colno' =>$cno,
|
|
'#eor' =>0
|
|
);
|
|
}
|
|
}
|
|
$printlist[count($printlist)-1]['#eor'] = '1';
|
|
}
|
|
return $printlist;
|
|
}
|
|
|
|
function make_tblhead($printlist,$head)
|
|
{
|
|
// Build Title Row
|
|
$table = array();
|
|
reset($printlist);
|
|
while(list($pc,$pcol)=each($printlist))
|
|
{
|
|
$cname = $pcol['#name'];
|
|
$values = $head[$cname];
|
|
$title = $values['#title'];
|
|
if($title == '')
|
|
{
|
|
$title = $cname;
|
|
}
|
|
$cparms = $this->arr_merge($values['#parms_hdr'],$pcol);
|
|
$cparms['value']=$title;
|
|
$table[0][$pc] = $cparms;
|
|
}
|
|
return $table;
|
|
}
|
|
|
|
function html_head($head,$table,$printlist)
|
|
{
|
|
$html = '';
|
|
$tparams = $this->makeparms($head['#table_parms']);
|
|
$html .= "<table $tparams>\n";
|
|
$rp = $this->makeparms($head['#head_parms']);
|
|
// $html .= "\t<tr $rp> <comment header>\n";
|
|
$html .= "\t<tr $rp> \n";
|
|
|
|
$row = $table[0];
|
|
reset($row);
|
|
$intr = true;
|
|
while(list(,$col)=each($row))
|
|
{
|
|
if(!$intr)
|
|
{
|
|
$html .= "\t<tr $rp>\n";
|
|
$intr = true;
|
|
}
|
|
$cname = $col['#name'];
|
|
$cp = $this->makeparms($col);
|
|
$html .= "\t\t<td $cp>".$col['value']."</td>\n";
|
|
if($col['#eor']=='1')
|
|
{
|
|
$html .= "\t</tr>\n";
|
|
$intr = false;
|
|
}
|
|
}
|
|
return $html;
|
|
}
|
|
|
|
function arr_merge($a1='',$a2='',$a3='',$a4='',$a5='',$a6='',$a7='',$a8='')
|
|
{
|
|
$out = array();
|
|
$test = array($a1,$a2,$a3,$a4,$a5,$a6,$a7,$a8);
|
|
while(list(,$val) = each($test))
|
|
{
|
|
if(is_array($val))
|
|
{
|
|
$out += $val;
|
|
}
|
|
}
|
|
return $out;
|
|
}
|
|
|
|
function arr_keys($fields,$array=True)
|
|
{
|
|
@reset($fields);
|
|
while(list($key,$val) = @each($fields))
|
|
{
|
|
$fkeys .= $key . ',';
|
|
}
|
|
$fkeys = substr($fkeys,0,-1);
|
|
if($array)
|
|
{
|
|
$ex = explode(',',$fkeys);
|
|
return $ex;
|
|
}
|
|
else
|
|
{
|
|
return $fkeys;
|
|
}
|
|
}
|
|
}
|