big performance improvment by using references (droped php3 compatibility)

This commit is contained in:
Ralf Becker 2002-09-27 16:17:39 +00:00
parent abfa5b6785
commit ed81de3f86
8 changed files with 180 additions and 79 deletions

View File

@ -269,13 +269,13 @@
$this->data[$row][$col][$attr] = $val;
++$n;
}
if ($cell['type'] == 'template' && (is_object($cell['name']) || $cell['name'][0] != '@'))
if ($cell['type'] == 'template' && (is_object($cell['obj']) || $cell['name'][0] != '@'))
{
if (!is_object($cell['name']))
if (!is_object($cell['obj']))
{
$this->data[$row][$col]['name'] = CreateObject('etemplate.etemplate',$cell['name']);
$this->data[$row][$col]['obj'] = CreateObject('etemplate.etemplate',$cell['name']);
}
$n += $this->data[$row][$col]['name']->set_cell_attribute($name,$attr,$val);
$n += $this->data[$row][$col]['obj']->set_cell_attribute($name,$attr,$val);
}
}
}
@ -297,15 +297,15 @@
/*!
@function loadExtension
@syntax loadExtension( $name,$ui='' )
@syntax loadExtension( $type )
@author ralfbecker
@abstact trys to load the Extension / Widget-class from the app or etemplate
@param $name name of the extension, the classname should be class.${name}_widget.inc.php
@discussion the $name might be "$name.$app" to give a app-name (default is the current app,or template-name)
*/
function loadExtension($name,&$parent,$ui='html')
function loadExtension($type)
{
list($class,$app) = explode('.',$name);
list($class,$app) = explode('.',$type);
$class .= '_widget';
if ($app == '')
@ -322,19 +322,71 @@
}
if (!file_exists(PHPGW_SERVER_ROOT."/$app/inc/class.$class.inc.php"))
{
return $this->extension[$name] = False;
return $GLOBALS['phpgw_info']['etemplate']['extension'][$type] = False;
}
$this->extension[$name] = CreateObject($app.'.'.$class,$ui);
$GLOBALS['phpgw_info']['etemplate']['extension'][$type] = CreateObject($app.'.'.$class,$ui='html');
if(floor(phpversion()) >= 4)
{
$this->extension[$name]->et = &$parent;
return $GLOBALS['phpgw_info']['etemplate']['extension'][$type]->human_name;
}
else
function haveExtension($type,$function='')
/*
@function haveExtension
@syntax haveExtension($type)
@abstract checks if extension is loaded and load it if it isnt
*/
{
$this->extension[$name]->et = $parent;
return ($GLOBALS['phpgw_info']['etemplate']['extension'][$type] || $this->loadExtension($type,$ui)) &&
($function == '' || $GLOBALS['phpgw_info']['etemplate']['extension'][$type]->public_functions[$function]);
}
return $this->extension[$name];
function extensionPreProcess(&$cell,&$value,&$readonlys)
/*
@function extensionPreProcess
@syntax extensionPreProcess(&$cell,&$value,&$readonlys)
@param &$cell table-cell on which the extension operates
@param &$value value of the extensions content(-array)
@param &$readonlys value of the extensions readonly-setting(-array)
@abstract executes the pre_process-function of the extension $cell[]type]
*/
{
if (!$this->haveExtension($type = $cell['type']))
{
return False;
}
return $GLOBALS['phpgw_info']['etemplate']['extension'][$type]->pre_process($cell,$value,
$GLOBALS['phpgw_info']['etemplate']['extension_data'][$type][$cell['name']],$readonlys,$this);
}
function extensionPostProcess(&$cell,&$value)
/*
@function extensionPostProcess
@syntax extensionPostProcess(&$cell,&$value)
@abstract executes the post_process-function of the extension $cell[type]
*/
{
if (!$this->haveExtension($type = $cell['type'],'post_process'))
{
return False;
}
return $GLOBALS['phpgw_info']['etemplate']['extension'][$type]->post_process($cell,$value,
$GLOBALS['phpgw_info']['etemplate']['extension_data'][$type][$cell['name']],
$GLOBALS['phpgw_info']['etemplate']['loop'],$this);
}
function extensionRender(&$cell,$form_name,&$value,$readonly)
/*
@function extensionRender
@syntax extensionRender(&$cell,$form_name,&$value,$readonly)
@abstract executes the render-function of the extension $cell[type]
*/
{
if (!$this->haveExtension($type = $cell['type'],'render'))
{
return False;
}
return $GLOBALS['phpgw_info']['etemplate']['extension'][$name]->render($cell,$form_name,$value,$readonly,
$GLOBALS['phpgw_info']['etemplate']['extension_data'][$type][$cell['name']],$this);
}
/*!
@ -375,16 +427,16 @@
//echo "set_array: $code = '$val'\n";
}
function get_array(&$arr,$idx)
function &get_array(&$arr,$idx)
{
if (ereg('^([^[]*)(\\[.*\\])$',$idx,$regs)) // idx contains array-index
{
eval($code = str_replace(']',"']",str_replace('[',"['",'$val = $arr['.$regs[1].']'.$regs[2].';')));
eval($code = str_replace(']',"']",str_replace('[',"['",'$val = &$arr['.$regs[1].']'.$regs[2].';')));
//echo "get_array: $code = '$val'\n";
}
else
{
$val = $arr[$idx];
$val = &$arr[$idx];
}
return $val;
}

View File

@ -27,7 +27,7 @@
);
var $human_name = 'Date'; // this is the name for the editor
function date_widget($ui)
function date_widget($ui='')
{
switch($ui)
{
@ -44,7 +44,7 @@
return 0;
}
function pre_process(&$cell,&$value,&$extension_data,&$readonlys)
function pre_process(&$cell,&$value,&$extension_data,&$readonlys,&$tmpl)
{
if ($cell['size'] != '')
{
@ -67,14 +67,17 @@
return True; // extra Label is ok
}
function render($cell,$form_name,$value,$readonly)
function render(&$cell,$form_name,&$value,$readonly,&$extension_data,&$tmpl)
{
$func = 'render_'.$this->ui;
return $this->$func($cell,$form_name,$value,$readonly);
if (!method_exists($this,$func))
return False;
return $this->$func($cell,$form_name,$value,$readonly,$tmpl);
}
function post_process(&$cell,&$value,&$extension_data,&$loop)
function post_process(&$cell,&$value,&$extension_data,&$loop,&$tmpl)
{
if (!isset($value))
{
@ -117,12 +120,12 @@
return True;
}
function render_html($cell,$form_name,$value,$readonly)
function render_html($cell,$form_name,$value,$readonly,&$tmpl)
{
if ($readonly)
{
return $GLOBALS['phpgw']->common->dateformatorder($value[0],$value[1],$value[2],True);
}
return $this->et->sbox->getDate($form_name.'[Y]',$form_name.'[m]',$form_name.'[d]',$value,$options);
return $tmpl->sbox->getDate($form_name.'[Y]',$form_name.'[m]',$form_name.'[d]',$value,$options);
}
}

View File

@ -30,7 +30,7 @@
{
}
function pre_process(&$cell,&$value,&$extension_data,&$readonlys)
function pre_process(&$cell,&$value,&$extension_data,&$readonlys,&$tmpl)
{
if ($cell['size'] != '')
{
@ -69,7 +69,7 @@
return True; // extra Label is ok
}
function post_process(&$cell,&$value,&$extension_data,&$loop)
function post_process(&$cell,&$value,&$extension_data,&$loop,&$tmpl)
{
if (!isset($value))
{

View File

@ -592,6 +592,7 @@
function show($post_vars='')
{
echo "this->etemplate->data = "; _debug_array($this->etemplate->data);
if ($this->debug)
{
echo "<p>etemplate.editor.show: content="; _debug_array($post_vars);
@ -641,7 +642,7 @@
}
else
{
$show->data[$show->rows]['A']['name'] = $this->etemplate;
$show->data[$show->rows]['A']['obj'] = &$this->etemplate;
$vals = $post_vars['vals'];
$olds = $post_vars['olds'];
@ -673,7 +674,7 @@
if (ereg('class\\.([a-zA-Z0-9_]*)_widget.inc.php',$file,$regs) &&
($ext = $this->etemplate->loadExtension($regs[1].'.'.$app,$this->etemplate)))
{
$extensions[$regs[1]] = $ext->human_name;
$extensions[$regs[1]] = $ext;
}
}
return $extensions;

View File

@ -25,7 +25,7 @@
'pre_process' => True,
'post_process' => True
);
var $human_name = 'Nextmatch Widget'; // this is the name for the editor
var $human_name = 'Nextmatch'; // this is the name for the editor
function nextmatch_widget($ui)
{
@ -42,7 +42,7 @@
$total = $value['total'] = $obj->$method($value,$value['rows'],$readonlys['rows']);
if ($value['start'] > $total)
{
$value['start'] = 0;
$extension_data['start'] = $value['start'] = 0;
$total = $obj->$method($value,$value['rows'],$readonlys['rows']);
}
$extension_data['total'] = $total;
@ -54,6 +54,7 @@
$value['template'] = new etemplate($value['template'],$tmpl->as_array());
$nextmatch = new etemplate('etemplate.nextmatch_widget');
if ($value['no_cat'])
{
$nextmatch->disable_cells('cat_id');
@ -77,7 +78,8 @@
$cell['type'] = 'template';
$cell['size'] = $cell['name'];
$cell['name'] = $nextmatch;
$cell['obj'] = &$nextmatch;
$cell['name'] = $nextmatch->name;
$cell['label'] = $cell['help'] = '';
return False; // NO extra Label

View File

@ -180,7 +180,7 @@
$this->init($name,$template,$lang,$group,$version);
if ($this->debug == 1 || $this->debug == $this->name)
{
echo "<p>soetemplate::read('$this->name','$this->template','$this->lang','$this->version')</p>\n";
echo "<p>soetemplate::read('$this->name','$this->template','$this->lang',$this->group,'$this->version')</p>\n";
}
if ($GLOBALS['phpgw_info']['server']['eTemplate-source'] == 'files' && $this->readfile())
{
@ -438,6 +438,14 @@
*/
function save($name='',$template='.',$lang='.',$group='',$version='.')
{
if (is_array($name))
{
$template = $name['template'];
$lang = $name['lang'];
$group = $name['group'];
$version = $name['version'];
$name = $name['name'];
}
if ($name != '')
{
$this->name = $name;
@ -462,6 +470,10 @@
{
return False;
}
if ($this->debug > 0 || $this->debug == $this->name)
{
echo "<p>soetemplate::save('$this->name','$this->template','$this->lang',$this->group,'$this->version')</p>\n";
}
$this->delete(); // so we have always a new insert
if ($this->name[0] != '.') // correct up old messed up templates
@ -717,7 +729,7 @@
if ($time = @filemtime($path))
{
$templ = new etemplate(".$app",'','##');
$templ = new soetemplate(".$app",'','##');
if ($templ->lang != '##' || $templ->data[0] < $time) // need to import
{
$ret = $this->import_dump($app);

View File

@ -51,11 +51,13 @@
{
// save selected tab in persistent extension_data to use it in post_process
$extension_data = $selected_tab = $name;
$tcell['name'] = $tab_active;
$tcell['obj'] = &$tab_active;
$tcell['name'] = $tab_active->name;
}
else
{
$tcell['name'] = $tab;
$tcell['obj'] = &$tab;
$tcell['name'] = $tab->name;
}
$tcell['type'] = 'template';
$tcell['size'] = "_tab_widget[$name]";
@ -73,7 +75,8 @@
if (!isset($selected_tab))
{
$tab_row['A']['name'] = $tab_active;
$tab_row['A']['obj'] = &$tab_active;
$tcell['name'] = $tab_active->name;
$extension_data = $selected_tab = $names[0];
}
$tabs->data[1] = $tab_row;
@ -82,12 +85,14 @@
$tabs->size = ',,,,0';
$tab_widget = new etemplate('etemplate.tab_widget');
$tab_widget->set_cell_attribute('@tabs','name',$tabs);
$tab_widget->set_cell_attribute('@body','name',
$tmpl->tpls_in_file > 1 ? new etemplate($selected_tab,$tmpl->as_array()) : $selected_tab);
$tab_widget->set_cell_attribute('@tabs','obj',$tabs);
if ($tmpl->tpls_in_file > 1)
$tab_widget->set_cell_attribute('@body','obj',new etemplate($selected_tab,$tmpl->as_array()));
else
$tab_widget->set_cell_attribute('@body','name',$selected_tab);
$cell['type'] = 'template';
$cell['name'] = $tab_widget;
$cell['obj'] = &$tab_widget;
$cell['label'] = $cell['help'] = '';
return False; // NO extra Label

View File

@ -33,7 +33,6 @@
var $debug; // 1=calls to show and process_show, 2=content after process_show,
// 3=calls to show_cell and process_show_cell, or template-name or cell-type
var $html,$sbox; // instance of html / sbox2-class
var $loop = 0; // set by process_show if an other Exec-ProcessExec loop is needed
/*!
@function etemplate
@ -215,7 +214,7 @@
reset($this->data);
if (isset($this->data[0]))
{
list($nul,$width) = each($this->data);
list(,$width) = each($this->data);
}
else
{
@ -223,11 +222,8 @@
}
for ($r = 0; $row = 1+$r /*list($row,$cols) = each($this->data)*/; ++$r)
{
$old_cols = $cols; $old_class = $class; $old_height = $height;
if (!(list($nul,$cols) = each($this->data))) // no further row
if (!(list($r_key) = each($this->data))) // no further row
{
$cols = $old_cols; $class = $old_class; $height = $old_height;
list($nul,$cell) = each($cols); reset($cols);
if (!($this->autorepeat_idx($cols['A'],0,$r,$idx,$idx_cname) && $idx_cname) &&
!($this->autorepeat_idx($cols['B'],1,$r,$idx,$idx_cname) && $idx_cname) ||
!$this->isset_array($content,$idx))
@ -237,22 +233,26 @@
}
else
{
$height = $this->data[0]["h$row"];
$class = $this->data[0]["c$row"];
$cols = &$this->data[$r_key];
$height = &$this->data[0]["h$row"];
$class = &$this->data[0]["c$row"];
}
reset ($cols);
$row_data = array();
for ($c = 0; True /*list($col,$cell) = each($cols)*/; ++$c)
{
$old_cell = $cell;
if (!(list($nul,$cell) = each($cols))) // no further cols
if (!(list($c_key) = each($cols))) // no further cols
{
$cell = $old_cell;
if (!$this->autorepeat_idx($cell,$c,$r,$idx,$idx_cname,True) ||
!$this->isset_array($content,$idx))
{
break; // no auto-col-repeat
}
}
else
{
$cell = &$cols[$c_key];
}
$col = $this->num2chrs($c);
$row_data[$col] = $this->show_cell($cell,$content,$sel_options,$readonlys,$cname,
$c,$r,$span);
@ -317,7 +317,7 @@
}
list($span) = explode(',',$cell['span']); // evtl. overriten later for type template
if ($cell['name'][0] == '@')
if ($cell['name'][0] == '@' && $cell['type'] != 'template')
{
$cell['name'] = $this->get_array($content,substr($cell['name'],1));
}
@ -353,12 +353,11 @@
}
$extra_label = True;
if (!$this->types[$cell['type']] &&
(isset($this->extension[$cell['type']]) || $this->loadExtension($cell['type'],$this)))
if (!$this->types[$cell['type']] && $this->haveExtension($cell['type']))
{
$extra_label = $this->extension[$cell['type']]->pre_process($cell,$value,
$GLOBALS['phpgw_info']['etemplate']['extension_data'][$cell['type']][$cell['name']],
$readonlys[$name],$this);
$type = $cell['type'];
$extra_label = $this->extensionPreProcess($cell,$value,$readonlys[$name]);
//echo "<p>$type::pre_process"; _debug_array($cell);
if (strstr($name,'|'))
{
$content = $this->complete_array_merge($content,$value);
@ -468,6 +467,34 @@
$html .= $this->html->hr($cell['size']);
break;
case 'template': // size: index in content-array (if not full content is past further on)
if (is_object($cell['name']))
{
$cell['obj'] = &$cell['name'];
unset($cell['name']);
$cell['name'] = 'was Object';
echo "<p>Object in Name in tpl '$this->name': "; _debug_array($this->data);
}
$obj_read = 'already loaded';
if (!is_object($cell['obj']))
{
if ($cell['name'][0] == '@')
{
$cell['obj'] = $this->get_array($content,substr($cell['name'],1));
$obj_read = is_object($cell['obj']) ? 'obj from content' : 'obj read, obj-name from content';
if (!is_object($cell['obj']))
{
$cell['obj'] = new etemplate($cell['obj'],$this->as_array());
}
}
else
{ $obj_read = 'obj read';
$cell['obj'] = new etemplate($cell['name'],$this->as_array());
}
}
if ($this->debug >= 3 || $this->debug == $cell['type'])
{
echo "<p>show_cell::template(tpl=$this->name,name=$cell[name]): $obj_read</p>\n";
}
if ($this->autorepeat_idx($cell,$show_c,$show_row,$idx,$idx_cname) || $cell['size'] != '')
{
if ($span == '' && isset($content[$idx]['span']))
@ -490,8 +517,7 @@
{
$readonlys['__ALL__'] = True;
}
$templ = is_object($cell['name']) ? $cell['name'] : new etemplate($cell['name'],$this->as_array());
$html .= $templ->show($content,$sel_options,$readonlys,$cname,$show_c,$show_row);
$html .= $cell['obj']->show($content,$sel_options,$readonlys,$cname,$show_c,$show_row);
break;
case 'select': // size:[linesOnMultiselect]
if (isset($sel_options[$name]))
@ -548,13 +574,13 @@
"enctype=\"multipart/form-data\" onSubmit=\"set_element2(this,'$path','$form_name')\"";
break;
default:
if (!isset($this->extension[$cell['type']]))
if ($this->haveExtension($cell['type']))
{
$html .= "<i>unknown type '$cell[type]'</i>";
$html .= $this->extensionRender($cell,$form_name,$value,$readonly);
}
else
{
$html .= $this->extension[$cell['type']]->render($cell,$form_name,$value,$readonly);
$html .= "<i>unknown type '$cell[type]'</i>";
}
break;
}
@ -613,11 +639,9 @@
}
for ($r = 0; True /*list($row,$cols) = each($this->data)*/; ++$r)
{
$old_cols = $cols;
if (!(list($nul,$cols) = each($this->data))) // no further row
if (!(list($r_key) = each($this->data))) // no further row
{
$cols = $old_cols;
list($nul,$cell) = each($cols); reset($cols);
//list($nul,$cell) = each($cols); reset($cols);
if ((!$this->autorepeat_idx($cols['A'],0,$r,$idx,$idx_cname) ||
$idx_cname == '' || !$this->isset_array($content,$idx)) &&
(!$this->autorepeat_idx($cols['B'],1,$r,$idx,$idx_cname) ||
@ -626,13 +650,18 @@
break; // no auto-row-repeat
}
}
else
{
$cols = &$this->data[$r_key];
}
$row = 1+$r;
reset($cols);
for ($c = 0; True /*list($col,$cell) = each($cols)*/; ++$c)
{
$old_cell = $cell;
if (!(list($nul,$cell) = each($cols))) // no further cols
//$old_cell = $cell;
if (!(list($c_key/*,$cell*/) = each($cols))) // no further cols
{
$cell = $old_cell;
//$cell = $old_cell;
if (!$this->autorepeat_idx($cell,$c,$r,$idx,$idx_cname,True) ||
$idx_cname == '' || !$this->isset_array($content,$idx))
{
@ -641,6 +670,7 @@
}
else
{
$cell = &$cols[$c_key];
$this->autorepeat_idx($cell,$c,$r,$idx,$idx_cname,True); // get idx_cname
}
$col = $this->num2chrs($c);
@ -741,16 +771,13 @@
echo "'$value'</p>\n";
}
}
if ((isset($this->extension[$cell['type']]) || $this->loadExtension($cell['type'],$this)) &&
isset($this->extension[$cell['type']]->public_functions['post_process']))
if ($this->haveExtension($cell['type'],'post_process'))
{
if ($this->debug > 1 || $this->debug && $this->debug == $this->name)
{
echo "<p>value for $cell[type]::post_process: "; _debug_array($value);
}
$this->extension[$cell['type']]->post_process($cell,$value,
$GLOBALS['phpgw_info']['etemplate']['extension_data'][$cell['type']][$cell['name']],
$GLOBALS['phpgw_info']['etemplate']['loop'],$this);
$this->extensionPostProcess($cell,$value);
if ($this->debug > 1 || $this->debug && $this->debug == $this->name)
{
@ -788,13 +815,12 @@
}
break;
case 'template':
$templ = is_object($cell['name']) ? $cell['name'] : new etemplate($cell['name'],$this->as_array());
$templ->process_show($value,$readonlys);
if ($templ->loop)
if (!is_object($cell['obj']))
{
$this->loop = True;
//echo "<p>".$this->name.": loop set in process_show(".$templ->name.")</p>\n";
$cell['obj'] = new etemplate($cell['name'],$this->as_array());
}
//$templ = is_object($cell['name']) ? $cell['name'] : new etemplate($cell['name'],$this->as_array());
$cell['obj']->process_show($value,$readonlys);
break;
case 'select':
case 'select-cat':