diff --git a/etemplate/doc/etemplate.html b/etemplate/doc/etemplate.html index cb9f933dfb..5a6ea2489b 100644 --- a/etemplate/doc/etemplate.html +++ b/etemplate/doc/etemplate.html @@ -14,7 +14,7 @@ body { background-color: white; color: black; }

eTemplate - Templates and Dialog-Editor for phpGroupware

-

by Ralf Becker RalfBecker@outdoor-training.de

+

by Ralf Becker RalfBecker AT outdoor-training DOT de

A developers tutorial how to write an application with the new eTemplates.
It is also an introduction how to write a phpgw- and setup(3)-compatible app.


@@ -146,7 +146,7 @@ Create the file /et_media/index.php with the following content:

/**************************************************************************\ * phpGroupWare - eTemplates - Tutoria Example - a simple MediaDB * * http://www.phpgroupware.org * -* Written by Ralf Becker <RalfBecker@outdoor-training.de> * +* Written by Ralf Becker <RalfBecker AT outdoor-training DOT de> * * -------------------------------------------- * * 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 * @@ -472,7 +472,7 @@ a new version automaticaly.

docu of setup3 in the doc-dir of the setup app. -

That's it - please contact me if you have further questions or comments about the tutorial

+

That's it - please contact me if you have further questions or comments about the tutorial

diff --git a/etemplate/doc/referenz.html b/etemplate/doc/referenz.html index 139c3189ec..b06440837b 100644 --- a/etemplate/doc/referenz.html +++ b/etemplate/doc/referenz.html @@ -14,7 +14,7 @@ body { background-color: white; color: black; }

eTemplate-Referenz - Templates and Dialog-Editor for phpGroupware

-

by Ralf Becker RalfBecker@outdoor-training.de

+

by Ralf Becker RalfBecker AT outdoor-training DOT de

A referenz documentation about the new eTemplates and the syntax and parameters of the several widgets.


@@ -213,6 +213,8 @@ implement only a subset of XUL. Here are the main differences:

This attribute controls certain aspects of the different widgets. It's meaning and xml / xul-values are document with the widgets. + If the options-string starts with a '@' it is replaced by the value of the content-array at this + index (with the '@'-removed). @@ -659,16 +661,22 @@ implement only a subset of XUL. Here are the main differences:

-$content[$id] = array(		// I = value set by the app, 0 = value on return / output, 
+$content[$id] = array(		// I = value set by the app, 0 = value on return / output
 	'get_rows'     =>	// I  method/callback to request the data for the rows eg. 'notes.bo.get_rows'
 	'filter_label' =>	// I  label for filter    (optional)
 	'filter_help'  =>	// I  help-msg for filter (optional)
+	'no_filter'    => True	// I  disable the 1. filter
 	'no_filter2'   => True	// I  disable the 2. filter (params are the same as for filter)
+	'no_cat'       => True	// I  disable the cat-selectbox
 	'template'     =>	// I  template to use for the rows, if not set via options
+	'header_left'  =>	// I  template to show left of the range-value, left-aligned (optional)
+	'header_right' =>	// I  template to show right of the range-value, right-aligned (optional)
+	'bottom_too'   => True	// I  show the nextmatch-line (arrows, filters, search, ...) again after the rows
 	'start'        =>	// IO position in list
 	'cat_id'       =>	// IO category, if not 'no_cat' => True
 	'search'       =>	// IO search pattern
 	'filter'       =>	// IO filter, if not 'no_filter' => True
+	'filter2'      =>	// IO filter2, if not 'no_filter2' => True
 	'rows'         =>	//  O content set by callback
 	'total'        =>	//  O the total number of entries
 );
@@ -742,7 +750,41 @@ function index($content = 0)
 
+ + LinkWidgets + + <link type="link-to" id="name"/>

+ <link type="link-list" id="name"/>

+ <link type="link-string" id="name"/>

+ + no + link-to

link-list

link-string + + These widget are the UI-part of the link-class ({bo|so}link) in InfoLog and maybe the API soon.

+ link-to
+ Widget to make a links to other entries of link-aware apps and to attach files.

+ link-list
+ Widget to shows the links to an entry and a Unlink Button for each link.

+ Note: Both Widgets can be used on the same template with the same name. They share + the content of that variable, which contains just the id of the entry in the current app.

+ + link-string
+ Comma-separated list of link-titles with a link to its view-method, value is like the return + of bolink::get_links(). + + +

One remark about cross-site-scripting

+The following eTemplate Widgets are parsing its content before displaying through htmlentities() to +correctly display the content and to gard against malecious data (like scripts etc.): + +This is done in most cases by the underlaying html-class and not direct in eTemplate.


@@ -751,9 +793,10 @@ function index($content = 0) eTemplates to define the UI of the new widget and are stored in the eTemplate's inc-dir or the inc-dir of a phpGroupWare application. The editor and the etemplate-class autoload the existing extensions.

-I will made more documentation about the interface availible soon. +I will made more documentation about the interface availible soon. For now have a look for the source +of the existing extensions. -

please contact me if you have further questions or comments about the eTemplates

+

please contact me if you have further questions or comments about the eTemplates

diff --git a/etemplate/inc/class.link_widget.inc.php b/etemplate/inc/class.link_widget.inc.php index f91e1c337e..3e8b39f2bf 100644 --- a/etemplate/inc/class.link_widget.inc.php +++ b/etemplate/inc/class.link_widget.inc.php @@ -15,10 +15,11 @@ /*! @class link_widget @author ralfbecker - @abstract link-to: widget that enable you to make a link to an other entry of a link-aware app - @abstract link-list: widget that shows the links to an entry and a Unlink Button for each entry + @abstract link-to: Widget to create links to an other entries of link-aware apps + @abstract link-list: Widget to shows the links to an entry and a Unlink Button for each link + @abstract link-string: comma-separated list of link-titles with a link to its view method, value is like get_links() @discussion This widget is independent of the UI as it only uses etemplate-widgets and has therefor no - @discussion render-function. + render-function. */ class link_widget { @@ -27,8 +28,9 @@ 'post_process' => True ); var $human_name = array( // this are the names for the editor - 'link-to' => 'LinkTo', - 'link-list' => 'LinkList' + 'link-to' => 'LinkTo', + 'link-list' => 'LinkList', + 'link-string' => 'LinkString' ); var $debug = False; @@ -39,6 +41,24 @@ function pre_process($name,&$value,&$cell,&$readonlys,&$extension_data,&$tmpl) { + if ($cell['type'] == 'link-string') + { + $str = ''; + if (is_array($value)) + { + foreach ($value as $link) + { + $str .= ($str !== '' ? ', ' : '') . $tmpl->html->a_href( + htmlentities($this->link->title($link['app'],$link['id'])), + $this->link->view($link['app'],$link['id'],$link)); + } + } + $cell['type'] = 'html'; + $cell['readonly'] = True; // is allways readonly + $value = $str; + + return True; + } if (!is_array($value)) { $value = array( diff --git a/etemplate/inc/class.nextmatch_widget.inc.php b/etemplate/inc/class.nextmatch_widget.inc.php index 9aa773f668..ef55750e98 100644 --- a/etemplate/inc/class.nextmatch_widget.inc.php +++ b/etemplate/inc/class.nextmatch_widget.inc.php @@ -70,9 +70,19 @@ ($value['no_filter'] || !$value['filter'] || $value['filter'] == 'none') && ($value['no_filter2'] || !$value['filter2'] || $value['filter2'] == 'none')) { // disable whole nextmatch line if no scrolling necessary - $cell['size'] = $cell['name'].'[rows]'; - $cell['obj'] = &$value['template']; - $cell['name'] = $value['template']->name; + if ($value['header_left'] || $value['header_right']) + { + $nextmatch = new etemplate('etemplate.nextmatch_widget.header_only'); + $cell['size'] = $cell['name']; + $cell['obj'] = &$nextmatch; + $cell['name'] = $nextmatch->name; + } + else + { + $cell['size'] = $cell['name'].'[rows]'; + $cell['obj'] = &$value['template']; + $cell['name'] = $value['template']->name; + } } else { @@ -107,6 +117,8 @@ // save values in persistent extension_data to be able use it in post_process $extension_data = $value; + + $value['bottom'] = $value; // copy the values for the bottom-bar return False; // NO extra Label } @@ -120,6 +132,26 @@ $loop = False; $value['start'] = $old_value['start']; // need to be set, to be reported back + if (is_array($value['bottom'])) // we have a second bottom-bar + { + $inputs = array('search','cat_id','filter','filter2'); + foreach($inputs as $name) + { + if (isset($value['bottom'][$name]) && $value['bottom'][$name] != $old_value[$name]) + { + $value[$name] = $value['bottom'][$name]; + } + } + $buttons = array('start_search','first','left','right','last'); + foreach($buttons as $name) + { + if (isset($value['bottom'][$name]) && $value['bottom'][$name]) + { + $value[$name] = $value['bottom'][$name]; + } + } + unset($value['bottom']); + } if ($value['start_search'] || isset($value['cat_id']) && $value['cat_id'] != $old_value['cat_id'] || $old_value['filter'] != '' && isset($value['filter']) && $value['filter'] != $old_value['filter'] || diff --git a/etemplate/inc/class.uietemplate.inc.php b/etemplate/inc/class.uietemplate.inc.php index a6b44d516c..32401a14ea 100644 --- a/etemplate/inc/class.uietemplate.inc.php +++ b/etemplate/inc/class.uietemplate.inc.php @@ -500,8 +500,14 @@ $ext_type = $type; $extra_label = $this->extensionPreProcess($ext_type,$form_name,$value,$cell,$readonlys[$name]); + $readonly = $readonly || $cell['readonly']; // might be set be extension $this->set_array($content,$name,$value); } + $cell_options = $cell['size']; + if ($cell_options[0] == '@') + { + $cell_options = $this->get_array($content,substr($cell_options,1)); + } $label = $this->expand_name($cell['label'],$show_c,$show_row,$content['.c'],$content['.row'],$content); $help = $cell['help']; if ($help[0] == '@') @@ -535,7 +541,7 @@ case 'label': // size: [[b]old][[i]talic][,link] if (is_array($value)) break; - list($style,$extra_link) = explode(',',$cell['size']); + list($style,$extra_link) = explode(',',$cell_options); $value = strlen($value) > 1 && !$cell['no_lang'] ? lang($value) : $value; $value = nl2br(htmlentities($value)); if ($value != '' && strstr($style,'b')) $value = $this->html->bold($value); @@ -543,15 +549,15 @@ $html .= $value; break; case 'html': - $extra_link = $cell['size']; + $extra_link = $cell_options; $html .= $value; break; case 'int': // size: [min][,[max][,len]] case 'float': - list($min,$max,$cell['size']) = explode(',',$cell['size']); - if ($cell['size'] == '') + list($min,$max,$cell_options) = explode(',',$cell_options); + if ($cell_options == '') { - $cell['size'] = $cell['type'] == 'int' ? 5 : 8; + $cell_options = $cell['type'] == 'int' ? 5 : 8; } // fall-through case 'text': // size: [length][,maxLength] @@ -562,20 +568,20 @@ else { $html .= $this->html->input($form_name,$value,'', - $options.$this->html->formatOptions($cell['size'],'SIZE,MAXLENGTH')); + $options.$this->html->formatOptions($cell_options,'SIZE,MAXLENGTH')); $GLOBALS['phpgw_info']['etemplate']['to_process'][$form_name] = $cell['type']; } break; case 'textarea': // Multiline Text Input, size: [rows][,cols] $html .= $this->html->textarea($form_name,$value, - $options.$this->html->formatOptions($cell['size'],'ROWS,COLS')); + $options.$this->html->formatOptions($cell_options,'ROWS,COLS')); if (!$readonly) $GLOBALS['phpgw_info']['etemplate']['to_process'][$form_name] = $cell['type']; break; case 'checkbox': - if (!empty($cell['size'])) + if (!empty($cell_options)) { - list($true_val,$false_val,$ro_true,$ro_false) = explode(',',$cell['size']); + list($true_val,$false_val,$ro_true,$ro_false) = explode(',',$cell_options); $value = $value == $true_val; } else @@ -596,12 +602,12 @@ $html .= $this->html->input($form_name,'1','CHECKBOX',$options); $GLOBALS['phpgw_info']['etemplate']['to_process'][$form_name] = array( 'type' => $cell['type'], - 'values' => $cell['size'] + 'values' => $cell_options ); } break; case 'radio': // size: value if checked - $set_val = $this->expand_name($cell['size'],$show_c,$show_row,$content['.c'],$content['.row'],$content); + $set_val = $this->expand_name($cell_options,$show_c,$show_row,$content['.c'],$content['.row'],$content); if ($value == $set_val) { @@ -635,7 +641,7 @@ } else { - list($img,$ro_img) = explode(',',$cell['size']); + list($img,$ro_img) = explode(',',$cell_options); if (!empty($img)) { $options .= ' TITLE="'.(strlen($label)<=1||$cell['no_lang']?$label:lang($label)).'"'; @@ -649,7 +655,7 @@ $GLOBALS['phpgw_info']['etemplate']['to_process'][$form_name] = $cell['type']; break; case 'hrule': - $html .= $this->html->hr($cell['size']); + $html .= $this->html->hr($cell_options); break; case 'template': // size: index in content-array (if not full content is past further on) if (is_object($cell['name'])) @@ -680,7 +686,7 @@ { echo "

show_cell::template(tpl=$this->name,name=$cell[name]): $obj_read

\n"; } - if ($this->autorepeat_idx($cell,$show_c,$show_row,$idx,$idx_cname) || $cell['size'] != '') + if ($this->autorepeat_idx($cell,$show_c,$show_row,$idx,$idx_cname) || $cell_options != '') { if ($span == '' && isset($content[$idx]['span'])) { // this allows a colspan in autorepeated cells like the editor @@ -706,7 +712,7 @@ break; case 'select': // size:[linesOnMultiselect] $sels = array(); - list($multiple) = explode(',',$cell['size']); + list($multiple) = explode(',',$cell_options); if (!empty($multiple) && 0+$multiple <= 0) { $sels[''] = $multiple < 0 ? lang('all') : lang($multiple); @@ -760,7 +766,7 @@ $image = $this->html->image(substr($this->name,0,strpos($this->name,'.')), $image,strlen($label) > 1 && !$cell['no_lang'] ? lang($label) : $label,'BORDER="0"'); $html .= $image; - $extra_link = $cell['size']; + $extra_link = $cell_options; $extra_label = False; break; case 'file': @@ -776,7 +782,7 @@ $box_row = 1; $box_col = 'A'; $box_anz = 0; - for ($n = 1; $n <= $cell['size']; ++$n) + for ($n = 1; $n <= $cell_options; ++$n) { $h = $this->show_cell($cell[$n],$content,$sel_options,$readonlys,$cname,$show_c,$show_row,$nul); if ($h != '' && $h != ' ') @@ -804,14 +810,14 @@ if ($box_anz > 1) // a single cell is NOT placed into a table { $html = "\n\n\n\n". - $this->html->table($rows,$this->html->formatOptions($cell['size'],',CELLPADDING,CELLSPACING'). - ($cell['align'] ? ' WIDTH="100%"' : '')). // alignment only works if table has full width + $this->html->table($rows,$this->html->formatOptions($cell_options,',CELLPADDING,CELLSPACING'). + ($cell['align'] && $type == 'vbox' ? ' WIDTH="100%"' : '')). // alignment only works if table has full width "\n\n\n\n"; } break; case 'deck': - for ($n = 1; $n <= $cell['size'] && (empty($value) || $value != $cell[$n]['name']); ++$n) ; - if ($n > $cell['size']) + for ($n = 1; $n <= $cell_options && (empty($value) || $value != $cell[$n]['name']); ++$n) ; + if ($n > $cell_options) { $value = $cell[1]['name']; } @@ -823,10 +829,10 @@ { $s_height = "height: $s_height".(substr($s_height,-1) != '%' ? 'px' : '').';'; } - for ($n = 1; $n <= $cell['size']; ++$n) + for ($n = 1; $n <= $cell_options; ++$n) { $h = $this->show_cell($cell[$n],$content,$sel_options,$readonlys,$cname,$show_c,$show_row,$nul); - $vis = !empty($value) && $value == $cell['size'][$n]['name'] || $n == 1 && $first ? 'visible' : 'hidden'; + $vis = !empty($value) && $value == $cell_options[$n]['name'] || $n == 1 && $first ? 'visible' : 'hidden'; list (,$cl) = explode(',',$cell[$n]['span']); $html .= $this->html->div($h,$this->html->formatOptions(array( $cl.($cl ? ' ':'').'tab_body', diff --git a/etemplate/setup/etemplates.inc.php b/etemplate/setup/etemplates.inc.php index e388244ace..cb114fbd46 100644 --- a/etemplate/setup/etemplates.inc.php +++ b/etemplate/setup/etemplates.inc.php @@ -1,5 +1,5 @@ 'etemplate.tab_widget','template' => '','lang' = $templ_data[] = array('name' => 'etemplate.link_widget.search','template' => '','lang' => '','group' => '0','version' => '0.9.15.003','data' => 'a:3:{i:0;a:2:{s:2:\"c1\";s:6:\"row_on\";s:2:\"c2\";s:7:\"row_off\";}i:1;a:4:{s:1:\"A\";a:5:{s:4:\"type\";s:6:\"select\";s:5:\"label\";s:6:\"Search\";s:7:\"no_lang\";s:1:\"1\";s:4:\"name\";s:3:\"app\";s:4:\"help\";s:26:\"Select an App to search in\";}s:1:\"B\";a:4:{s:4:\"type\";s:4:\"text\";s:4:\"size\";s:2:\"25\";s:4:\"name\";s:5:\"query\";s:4:\"help\";s:22:\"Enter a search pattern\";}s:1:\"C\";a:4:{s:4:\"type\";s:6:\"button\";s:5:\"label\";s:6:\"Search\";s:4:\"name\";s:6:\"search\";s:4:\"help\";s:30:\"Click here to start the search\";}s:1:\"D\";a:4:{s:4:\"type\";s:5:\"label\";s:4:\"span\";s:10:\",error_msg\";s:5:\"label\";s:29:\"Nothing found - try again !!!\";s:4:\"name\";s:3:\"msg\";}}i:2;a:4:{s:1:\"A\";a:2:{s:4:\"type\";s:5:\"label\";s:5:\"label\";s:11:\"attach file\";}s:1:\"B\";a:3:{s:4:\"type\";s:4:\"file\";s:4:\"name\";s:4:\"file\";s:4:\"help\";s:69:\"Enter filename to upload and attach, use [Browse...] to search for it\";}s:1:\"C\";a:4:{s:4:\"type\";s:6:\"button\";s:5:\"label\";s:6:\"Upload\";s:4:\"name\";s:6:\"upload\";s:4:\"help\";s:29:\"Click here to upload the file\";}s:1:\"D\";a:1:{s:4:\"type\";s:5:\"label\";}}}','size' => '','style' => '.error_msg { font-style: italic; color: red; }','modified' => '1054320872',); +$templ_data[] = array('name' => 'etemplate.nextmatch_widget','template' => '','lang' => '','group' => '0','version' => '0.9.15.007','data' => 'a:5:{i:0;a:3:{s:1:\"A\";s:3:\"40%\";s:1:\"C\";s:3:\"40%\";s:2:\"h4\";s:13:\",!@bottom_too\";}i:1;a:3:{s:1:\"A\";a:2:{s:4:\"type\";s:8:\"template\";s:4:\"name\";s:12:\"@header_left\";}s:1:\"B\";a:5:{s:4:\"type\";s:4:\"hbox\";s:4:\"size\";s:1:\"2\";s:5:\"align\";s:6:\"center\";i:1;a:4:{s:4:\"type\";s:5:\"label\";s:5:\"label\";s:7:\"showing\";s:7:\"no_lang\";s:1:\"1\";s:4:\"name\";s:5:\"range\";}i:2;a:4:{s:4:\"type\";s:5:\"label\";s:5:\"label\";s:2:\"of\";s:7:\"no_lang\";s:1:\"1\";s:4:\"name\";s:5:\"total\";}}s:1:\"C\";a:3:{s:4:\"type\";s:8:\"template\";s:5:\"align\";s:5:\"right\";s:4:\"name\";s:13:\"@header_right\";}}i:2;a:3:{s:1:\"A\";a:4:{s:4:\"type\";s:8:\"template\";s:4:\"span\";s:3:\"all\";s:5:\"align\";s:6:\"center\";s:4:\"name\";s:33:\"etemplate.nextmatch_widget.nm_row\";}s:1:\"B\";a:2:{s:4:\"type\";s:5:\"label\";s:8:\"onchange\";s:1:\"1\";}s:1:\"C\";a:1:{s:4:\"type\";s:5:\"label\";}}i:3;a:3:{s:1:\"A\";a:5:{s:4:\"type\";s:8:\"template\";s:4:\"size\";s:4:\"rows\";s:4:\"span\";s:3:\"all\";s:5:\"align\";s:6:\"center\";s:4:\"name\";s:9:\"@template\";}s:1:\"B\";a:1:{s:4:\"type\";s:5:\"label\";}s:1:\"C\";a:1:{s:4:\"type\";s:5:\"label\";}}i:4;a:3:{s:1:\"A\";a:5:{s:4:\"type\";s:8:\"template\";s:4:\"size\";s:6:\"bottom\";s:4:\"span\";s:3:\"all\";s:5:\"align\";s:6:\"center\";s:4:\"name\";s:33:\"etemplate.nextmatch_widget.nm_row\";}s:1:\"B\";a:1:{s:4:\"type\";s:5:\"label\";}s:1:\"C\";a:1:{s:4:\"type\";s:5:\"label\";}}}','size' => '100%','style' => '','modified' => '1056897420',); + +$templ_data[] = array('name' => 'etemplate.nextmatch_widget.header_only','template' => '','lang' => '','group' => '0','version' => '0.9.15.001','data' => 'a:3:{i:0;a:2:{s:1:\"A\";s:3:\"50%\";s:1:\"B\";s:3:\"50%\";}i:1;a:2:{s:1:\"A\";a:2:{s:4:\"type\";s:8:\"template\";s:4:\"name\";s:12:\"@header_left\";}s:1:\"B\";a:3:{s:4:\"type\";s:8:\"template\";s:5:\"align\";s:5:\"right\";s:4:\"name\";s:13:\"@header_right\";}}i:2;a:2:{s:1:\"A\";a:5:{s:4:\"type\";s:8:\"template\";s:4:\"size\";s:4:\"rows\";s:4:\"span\";s:3:\"all\";s:5:\"align\";s:6:\"center\";s:4:\"name\";s:9:\"@template\";}s:1:\"B\";a:1:{s:4:\"type\";s:5:\"label\";}}}','size' => '100%','style' => '','modified' => '1056877177',); + diff --git a/etemplate/setup/phpgw_de.lang b/etemplate/setup/phpgw_de.lang index 412b477903..aa99cf56e5 100644 --- a/etemplate/setup/phpgw_de.lang +++ b/etemplate/setup/phpgw_de.lang @@ -1,6 +1,6 @@ +%1 disabled etemplate de %1 deaktiviert %1 etemplates deleted etemplate de %1 eTemplates gelöscht %1 etemplates found etemplate de %1 eTemplates gefunden -%1 disabled etemplate de %1 deaktiviert %1 needed etemplate de %1 benötigt %1 notranslation etemplate de %1 nicht übersetzen %1 onchange etemplate de %1 onChange @@ -22,7 +22,7 @@ border etemplate de Rand border-line-thickness for the table-tag etemplate de Randbreite (border) für die Tabelle can have special sql-value null etemplate de darf speziellen SQL Wert NULL annehmen cancel etemplate de Abbruch -category etemplate de Kategori +category etemplate de Kategorie cellpadding for the table-tag etemplate de Innenabstand (cellpadding) der Tabelle cells etemplate de Zellen cellspacing for the table-tag etemplate de Zellenabstand (cellspacing) der Tabelle @@ -51,6 +51,7 @@ db-tools etemplate de DB-Tools deck etemplate de Deck (intern) default etemplate de Vorgabe delete etemplate de Löschen +delete a single entry by passing the id. etemplate de delete all selected etemplates, without further inquiry etemplate de löscht ALLE ausgewählten eTemplates OHNE weitere Rückfrage delete column etemplate de Spalte löschen delete this etemplate etemplate de dieses eTemplate löschen @@ -132,7 +133,8 @@ last etemplate de Letzte left etemplate de Links length for char+varchar, precisions int: 2, 4, 8 and float: 4, 8 etemplate de Länge für char+varchar, Genauigkeit für int: 2, 4, 8 und float: 4, 8 link etemplate de Verknüpfung -linklist etemplate de ListeVerknüpfungen +linklist etemplate de VerknüpfungListe +linkstring etemplate de VerküpfungZeichenkette linkto etemplate de VerküpfungZu load this template into the editor etemplate de lädt diese Template zum Bearbeiten minute etemplate de Minute @@ -147,6 +149,7 @@ new search etemplate de Neue Suche new table created etemplate de Neue Tabelle erzeugt newer version '%1' exists !!! etemplate de Neuere Version '%1' existiert !!! nextmatch etemplate de Nextmatch +no file etemplate de keine Datei no filename given or selected via browse... etemplate de kein Dateiname angegeben oder mit [Browse...] ausgewählt nothing found - try again !!! etemplate de Nichts gefunden - nochmal versuchen !!! nullable etemplate de Nullable @@ -165,6 +168,8 @@ primary key etemplate de Primary Key primary key for the table, gets automaticaly indexed etemplate de Hauptindex (Primary Key) der Tabelle, wird automatisch indiziert radiobutton etemplate de Radioknopf read etemplate de Lesen +read a list of entries. etemplate de Liest eine Liste von Einträgen. +read a single entry by passing the id and fieldlist. etemplate de Liste einen einzelnen Eintrag durch übergabe seiner Id und Feldliste. read etemplate from database (for the keys above) etemplate de ließt ein eTemplate aus der Datenbank (für die Schlüssel darüber) remove row (can not be undone!!!) etemplate de löscht eine Zeile (NICHT rückgängig zu machen) remove this link (not the entry itself) etemplate de entfernt diese Verknüpfung (nicht den Eintrag selbst) @@ -231,6 +236,7 @@ type of the column etemplate de Typ der Spalte type of the field (select label if field should be empty) etemplate de Type des Feldes (Beschriftung auswählen wenn Feld leer sein soll) unique etemplate de Unique unlink etemplate de Lösen +update a single entry by passing the fields. etemplate de Aktualisert einen einzelnen Eintrag über seine Felder. update from version '%1' to etemplate de Update von Version '%1' auf upload etemplate de Hochladen value etemplate de Wert diff --git a/etemplate/setup/phpgw_en.lang b/etemplate/setup/phpgw_en.lang index 313e470b2e..69895716e2 100644 --- a/etemplate/setup/phpgw_en.lang +++ b/etemplate/setup/phpgw_en.lang @@ -1,6 +1,6 @@ +%1 disabled etemplate en %1 disabled %1 etemplates deleted etemplate en %1 eTemplates deleted %1 etemplates found etemplate en %1 eTemplates found -%1 disabled etemplate en %1 disabled %1 needed etemplate en %1 needed %1 notranslation etemplate en %1 NoTranslation %1 onchange etemplate en %1 onChange @@ -134,6 +134,7 @@ left etemplate en Left length for char+varchar, precisions int: 2, 4, 8 and float: 4, 8 etemplate en length for char+varchar, precisions int: 2, 4, 8 and float: 4, 8 link etemplate en Link linklist etemplate en LinkList +linkstring etemplate en LinkString linkto etemplate en LinkTo load this template into the editor etemplate en load this template into the editor minute etemplate en Minute