From: <ral...@us...> - 2006-11-18 07:39:43
|
Author: ralfbecker Date: Sat Nov 18 08:38:09 2006 New Revision: 22855 URL: http://www.egroupware.org/viewvc?rev=3D3D22855&view=3D3Drev Log: fixed AND tested et_media Added: branches/1.2/etemplate/doc/et_media/inc/class.bo_et_media.inc.php - copied unchanged from r22854, trunk/etemplate/doc/et_media/inc/clas= =3D s=2Ebo_et_media.inc.php branches/1.2/etemplate/doc/et_media/inc/class.ui_et_media.inc.php - copied unchanged from r22854, trunk/etemplate/doc/et_media/inc/clas= =3D s=2Eui_et_media.inc.php Removed: branches/1.2/etemplate/doc/et_media/inc/class.et_media.inc.php Modified: branches/1.2/etemplate/doc/et_media/index.php branches/1.2/etemplate/doc/et_media/setup/setup.inc.php branches/1.2/etemplate/doc/etemplate.html Modified: branches/1.2/etemplate/doc/et_media/index.php URL: http://www.egroupware.org/viewvc/branches/1.2/etemplate/doc/et_media/i= =3D ndex.php?rev=3D3D22855&r1=3D3D22854&r2=3D3D22855&view=3D3Ddiff =3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D= =3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D =3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D= =3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D =3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D= =3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D =3D3D=3D3D=3D3D --- branches/1.2/etemplate/doc/et_media/index.php (original) +++ branches/1.2/etemplate/doc/et_media/index.php Sat Nov 18 08:38:09 2006 @@ -1,24 +1,22 @@ <?php - /************************************************************************= =3D **\ - * eGroupWare - eTemplates - Example App et_media = =3D * - * http://www.egroupware.org = =3D * - * Written by Ralf Becker <Ral...@ou...> = =3D * - * -------------------------------------------- = =3D * - * This program is free software; you can redistribute it and/or modify i= =3D t * - * under the terms of the GNU General Public License as published by the = =3D * - * Free Software Foundation; either version 2 of the License, or (at your= =3D * - * option) any later version. = =3D * - \************************************************************************= =3D **/ +/** + * eGroupWare editable Templates - Example media database (et_media) + * + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU Gener= =3D al Public License + * @package etemplate + * @subpackage et_media + * @link http://www.egroupware.org + * @author Ralf Becker <Ral...@ou...> + * @version $Id$ + */ =3D - /* $Id$ */ +$GLOBALS['egw_info'] =3D3D array( + 'flags' =3D3D> array( + 'currentapp' =3D3D> 'et_media', + 'noheader' =3D3D> True, + 'nonavbar' =3D3D> True, + ), +); +include('../header.inc.php'); =3D - $GLOBALS['egw_info'] =3D3D array( - 'flags' =3D3D> array( - 'currentapp' =3D3D> 'et_media', - 'noheader' =3D3D> True, - 'nonavbar' =3D3D> True, - ), - ); - include('../header.inc.php'); - - $GLOBALS['egw']->redirect_link('/index.php','menuaction=3D3Det_media.et_m= ed=3D ia.edit'); +$GLOBALS['egw']->redirect_link('/index.php','menuaction=3D3Det_media.ui_et= _m=3D edia.edit'); Modified: branches/1.2/etemplate/doc/et_media/setup/setup.inc.php URL: http://www.egroupware.org/viewvc/branches/1.2/etemplate/doc/et_media/s= =3D etup/setup.inc.php?rev=3D3D22855&r1=3D3D22854&r2=3D3D22855&view=3D3Ddiff =3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D= =3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D =3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D= =3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D =3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D= =3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D =3D3D=3D3D=3D3D --- branches/1.2/etemplate/doc/et_media/setup/setup.inc.php (original) +++ branches/1.2/etemplate/doc/et_media/setup/setup.inc.php Sat Nov 18 08:3= =3D 8:09 2006 @@ -34,9 +34,9 @@ /* Dependencies for this app to work */ $setup_info['et_media']['depends'][] =3D3D array( 'appname' =3D3D> 'phpgwapi', - 'versions' =3D3D> Array('1.0.0','1.0.1','1.2') + 'versions' =3D3D> Array('1.2','1.3','1.4') ); $setup_info['et_media']['depends'][] =3D3D array( 'appname' =3D3D> 'etemplate', - 'versions' =3D3D> Array('1.0.0','1.0.1','1.2') + 'versions' =3D3D> Array('1.2','1.3','1.4') ); Modified: branches/1.2/etemplate/doc/etemplate.html URL: http://www.egroupware.org/viewvc/branches/1.2/etemplate/doc/etemplate.= =3D html?rev=3D3D22855&r1=3D3D22854&r2=3D3D22855&view=3D3Ddiff =3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D= =3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D =3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D= =3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D =3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D= =3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D3D=3D =3D3D=3D3D=3D3D --- branches/1.2/etemplate/doc/etemplate.html (original) +++ branches/1.2/etemplate/doc/etemplate.html Sat Nov 18 08:38:09 2006 @@ -2,87 +2,53 @@ <html><head> <meta http-equiv=3D3D"CONTENT-TYPE" content=3D3D"text/html; charset=3D3Du= tf-8">=3D <title>eGroupWare: eTemplates - Templates and Dialog-Editor</title> =3D - <meta name=3D3D"GENERATOR" content=3D3D"NeoOffice 1.2 (Unix)"> - <meta name=3D3D"CREATED" content=3D3D"20060219;14431900"> - <meta name=3D3D"CHANGED" content=3D3D"20060220;16434900"> <!-- $Id$ --> =3D <style> <!-- - H1 { color: #000000 } - P { color: #000000 } - PRE { border: 1px solid #000000; padding: 0.08in; color: #000000; font-f= =3D amily: monospace } - H3 { color: #000000 } - H2 { color: #000000 } + h1,h2,h3,p,pre { color: black } + pre { border: 1px solid black; padding: 0.08in; font-family: monospace; = =3D background: #f0f0f0; } + span { color: darkblue; } --> </style></head> =3D -<body bgcolor=3D3D"#ffffff" dir=3D3D"ltr" lang=3D3D"en-US" text=3D3D"#0000= 00"> +<body> <h1>eTemplate - Templates and Dialog-Editor for eGroupWare</h1> <h3>by Ralf Becker <a href=3D3D"#" onclick=3D3D"document.location=3D3D'mai= '+'lto=3D :RalfBecker'+unescape('%40')+'outdoor-training'+unescape('%2E')+'de'; retur= =3D n false;">RalfBecker AT outdoor-training DOT de</a></h3> <h3>Updated by Raphael Alla <a href=3D3D"#" onclick=3D3D"document.location= =3D3D'=3D mai'+'lto:raphael'+unescape('%40')+'olineopensolutions'+unescape('%2E')+'co= =3D m'; return false;">>raphael AT olineopensolutions DOT com</a></h3> -<p>A developers tutorial how to write an application with the new -eTemplates.<br>It is also an introduction how to write a eGW- and -setup(3)-compatible app.</p> +<p>A developers tutorial how to write an application with the new eTemplat= =3D es.<br /> +It is also an introduction how to write a eGW- and setup(3)-compatible app= =3D .</p> <hr> <h1>Introduction - The concept of the eTemplates</h1> <p>The eTemplates =3D </p> <ul> - <li><p style=3D3D"margin-bottom: 0in;">consist out of rows and cols with - input-fields of several types =3D - </p> - </li><li><p style=3D3D"margin-bottom: 0in;">there is a dialog-editor (one= p=3D art - of the etemplate-app) to create the eTemplate =3D - </p> - </li><li><p style=3D3D"margin-bottom: 0in;">eTemplates can be (and are - usually) nested, eg. a template-field can contain an other eTemplate - </p> - </li><li><p style=3D3D"margin-bottom: 0in;">each field / cell of the temp= la=3D te - can have a label which is automaticaly run through lang() (the - content of the field can be run through lang() too) =3D - </p> - </li><li><p style=3D3D"margin-bottom: 0in;">the dialog editor can write a= ll - labels in a lang-file (mergeing it with the existing ones) =3D - </p> - </li><li><p style=3D3D"margin-bottom: 0in;">eTemplates have a name of the= f=3D orm - app.function[.subtemplate] which is used to call them up =3D - </p> - </li><li><p style=3D3D"margin-bottom: 0in;">they can have further keys, on - loading the class picks the most appropriate one for a user: =3D - </p> - <ol> - <li><p style=3D3D"margin-bottom: 0in;">group: the id of a group if the - template is just for that group (that allows admin to show differnt - views to each group) =3D - </p> - </li><li><p style=3D3D"margin-bottom: 0in;">lang: the 2 or 5 letter lang= ua=3D ge - code (or empty for a non-language specific template) =3D - </p> - </li><li><p style=3D3D"margin-bottom: 0in;">template set: they belong to= o =3D (if - the template-set key is empty it is an default-template) =3D - </p> - </li><li><p style=3D3D"margin-bottom: 0in;">version: version number like: - '0.9.15.001' =3D - </p> - </li></ol> - </li><li><p style=3D3D"margin-bottom: 0in;">they are stored in an array a= nd=3D in - serialized form in the db-table 'phpgw_etemplate' =3D - </p> - </li><li><p style=3D3D"margin-bottom: 0in;">the dialog editor can dump all - templates of an app for distribution (so they can be in the CVS too) - </p> - </li><li><p>they encapsulate differnt UI (User Interface) types from the - app: at the moment only a HTML one is ready, but a GTK one (using - <a href=3D3D"http://gtk.php.net/" target=3D3D"_blank">php-gtk</a>, <b>run= ning - as native app under linux and win32</b>) and XUL is under - development.<br>Here is a first screenshot of the DB-Tools as native - Linux Application: =3D - </p> -</li></ul> -<p style=3D3D"margin-bottom: 0in;"><img src=3D3D"gtk.png" name=3D3D"Graphi= c1" al=3D ign=3D3D"bottom" border=3D3D"0" height=3D3D"575" width=3D3D"1049"> + <li>consist out of rows and cols with input-fields of several types</li> + <li>there is a dialog-editor (one part of the etemplate-app) to create th= =3D e eTemplate</li> + <li>eTemplates can be (and are usually) nested, eg. a template-field can = =3D contain an other eTemplate</li> + <li>each field / cell of the template can have a label which is automatic= =3D aly run through lang() (the + content of the field can be run through lang() too)</li> + <li>the dialog editor can write all labels in a lang-file (mergeing it wi= =3D th the existing ones)</li> + <li>eTemplates have a name of the form app.function[.subtemplate] which i= =3D s used to call them up</li> + <li>they can have further keys, on loading the class picks the most appro= =3D priate one for a user: =3D + <ol> + <li>group: the id of a group if the template is just for that group (th= =3D at allows admin to show differnt + views to each group)</li> + <li>lang: the 2 or 5 letter language code (or empty for a non-language = =3D specific template)</li> + <li>template set: they belong too (if the template-set key is empty it = =3D is an default-template)</li> + <li>version: version number like: '1.3.001'</li> + </ol> + </li> + <li>they are stored in an array and in serialized form in the db-table 'e= =3D gw_etemplate' </li> + <li>the dialog editor can dump all templates of an app for distribution (= =3D so they can be in the CVS too)</li> + <li><p>they encapsulate differnt UI (User Interface) types from the app: = =3D at the moment only a HTML one is ready, + but a GTK one (using <a href=3D3D"http://gtk.php.net/" target=3D3D"_blank= ">ph=3D p-gtk</a>, <b>running + as native app under linux and win32</b>) and XUL is under development.<br= =3D >Here is a first screenshot of the DB-Tools as native + Linux Application:</li> +</ul> +<img src=3D3D"gtk.png" name=3D3D"Graphic1" align=3D3D"bottom" border=3D3D"= 0" heigh=3D t=3D3D"575" width=3D3D"1049"> </p> <hr> <h1>Tutorial / Example: a simple media database</h1> @@ -112,19 +78,19 @@ <pre><?php $setup_info['et_media']['name'] =3D3D 'et_media'; $setup_info['et_media']['title'] =3D3D 'eT-Media'; - $setup_info['et_media']['version'] =3D3D '0.9.15.001'; + $setup_info['et_media']['version'] =3D3D '1.2'; $setup_info['et_media']['app_order'] =3D3D 100; // at = th=3D e end - $setup_info['et_media']['tables'] =3D3D array('phpgw_et_media'); + $setup_info['et_media']['tables'] =3D3D array('egw_et_media'); $setup_info['et_media']['enable'] =3D3D 1; =3D /* Dependencies for this app to work */ $setup_info['et_media']['depends'][] =3D3D array( 'appname' =3D3D> 'phpgwapi', - 'versions' =3D3D> Array('1.2.005','1.2.006') + 'versions' =3D3D> Array('1.2','1.3','1.4') ); - $setup_info['et_media']['depends'][] =3D3D array( // this is onl= y =3D necessary as long the etemplate-class is not in the api + $setup_info['et_media']['depends'][] =3D3D array( 'appname' =3D3D> 'etemplate', - 'versions' =3D3D> Array('1.2') + 'versions' =3D3D> Array('1.2','1.3','1.4') );</pre><h2> 3. setting up the db-table with the db_tools and setup</h2> <p>To enable setup to create a db-table for us and to supply the @@ -137,74 +103,52 @@ file for us: =3D </p> <ol> - <li><p style=3D3D"margin-bottom: 0in;">start the etemplate app and click - on the button up, right which says db-Tools =3D - </p> - </li><li><p style=3D3D"margin-bottom: 0in;">select Application: eT-Media = =3D - </p> - </li><li><p style=3D3D"margin-bottom: 0in;">type 'egw_et_media' in the fi= eld - in front of the [Add Table] button and click on the button =3D - </p> - </li><li><p style=3D3D"margin-bottom: 0in;">now use [Add Column] to creat= e =3D the - necessary fields as shown on the screenshot =3D - </p> - </li><li><p style=3D3D"margin-bottom: 0in;">Click on [Write Table] (you n= eed - to give the webserver write-permission to the setup-dir of et_media - or you will get an error message, leave the write-permission as it - is necessary later on too, click on write again) =3D - </p> - </li><li><p style=3D3D"margin-bottom: 0in;">log out and log into setup and - start manage applications =3D - </p> - </li><li><p style=3D3D"margin-bottom: 0in;">eT-Media is shown as not inst= al=3D led - and only install is offerd, check it and submit =3D - </p> - </li><li><p>you can now log out from setup, the db-table is now created = =3D - </p> - </li><li><p>In order to be able to use your eT-Media application, do not - forget to give yourself access to it (Admin/User account: check - eT-Media)</p> -</li></ol> + <li>start the etemplate app and click on the button up, right which says = =3D db-Tools</li> + <li>select Application: eT-Media</li> + <li>type 'egw_et_media' in the field in front of the [Add Table] button a= =3D nd click on the button</li> + <li>now use [Add Column] to create thenecessary fields as shown on the sc= =3D reenshot</li> + <li>Click on [Write Table] (you need to give the webserver write-permissi= =3D on to the setup-dir of et_media + or you will get an error message, leave the write-permission as it is ne= =3D cessary later on too, click on write again)</li> + <li>log out and log into setup and start manage applications</li> + <li>eT-Media is shown as not installed and only install is offerd, check = =3D it and submit</li> + <li><p>you can now log out from setup, the db-table is now created</li> + <li><p>In order to be able to use your eT-Media application, do not forge= =3D t to give yourself access to it =3D + (Admin/User account: check eT-Media)</li> +</ol> <h2>4. creating an eTemplates for the edit-dialog</h2> <p>Now we need a nice edit dialog and use the eTemplate editor to set it up: =3D </p> <ol> - <li><p style=3D3D"margin-bottom: 0in;">start the etemplate app and type - <b>'et_media.edit'</b> in the name field. Save the template in order - to create it</p> - </li><li><p style=3D3D"margin-bottom: 0in;">an empty template is displaye= d=2E=3D An - eTemplate can be thought off as a =3DC3=3DA2=3DC2=3D80=3DC2=3D9Cgrid=3DC3= =3DA2=3DC2=3D80=3DC2=3D =3D9D. The first cell may be - a bit tricky to find, but will be highlighted when moving the mouse - over it. On my computer this cell appears in pink as illustrated - below:</p> - </li><li><p style=3D3D"margin-bottom: 0in;"><img src=3D3D"step0.jpg" name= =3D3D"=3D Graphic3" align=3D3D"left" border=3D3D"0" height=3D3D"509" width=3D3D"922">= <br clea=3D r=3D3D"left">Double - click on the pink spot will bring the following dialog:</p> - </li><li><p style=3D3D"margin-bottom: 0in;"><img src=3D3D"step1.jpg" name= =3D3D"=3D Graphic7" align=3D3D"left" border=3D3D"0" height=3D3D"544" width=3D3D"851">= <br clea=3D r=3D3D"left">The - top row allows you to add column and rows to the template. We will - need 2 columns and 6 rows</p> - </li><li><p style=3D3D"margin-bottom: 0in;">Create the following label in= t=3D he - first top left cell:</p> -</li></ol> -<p style=3D3D"margin-bottom: 0in;"><img src=3D3D"step2.jpg" name=3D3D"Grap= hic8" =3D align=3D3D"left" border=3D3D"0" height=3D3D"533" width=3D3D"853"><br clear= =3D3D"left"=3D ><br> -</p> -<p style=3D3D"margin-bottom: 0in;"><br> + <li>start the etemplate app and type <b>'et_media.edit'</b> in the name f= =3D ield. Save the template in order + to create it</li> + <li>an empty template is displayed. An eTemplate can be thought off as a = =3D =3DC3=3DA2=3DC2=3D80=3DC2=3D9Cgrid=3DC3=3DA2=3DC2=3D80=3DC2=3D9D. The first= cell may be + a bit tricky to find, but will be highlighted when moving the mouse + over it. On my computer this cell appears in pink as illustrated below:<= =3D /li> + <li><img src=3D3D"step0.jpg" name=3D3D"Graphic3" align=3D3D"left" border= =3D3D"0" =3D height=3D3D"509" width=3D3D"922"><br clear=3D3D"left">Double + click on the pink spot will bring the following dialog:</li> + <li><img src=3D3D"step1.jpg" name=3D3D"Graphic7" align=3D3D"left" border= =3D3D"0" =3D height=3D3D"544" width=3D3D"851"><br clear=3D3D"left">The + top row allows you to add column and rows to the template. We will need = =3D 2 columns and 6 rows</li> + <li>Create the following label in the first top left cell:</li> +</ol> +<img src=3D3D"step2.jpg" name=3D3D"Graphic8" align=3D3D"left" border=3D3D"= 0" heigh=3D t=3D3D"533" width=3D3D"853"><br clear=3D3D"left"><br> +</p> +<br> </p> <ol start=3D3D"6"> - <li><p>In the top right cell, we will create a user entry and call - it =3DC3=3DA2=3DC2=3D80=3DC2=3D9Cname=3DC3=3DA2=3DC2=3D80=3DC2=3D9D: this= is the same name as the=3D e column in our - egw_et_media table. This is important as those fields will be - populated automatically for us by eGroupWare:</p> - </li><li><p><img src=3D3D"step3.jpg" name=3D3D"Graphic9" align=3D3D"left"= borde=3D r=3D3D"0" height=3D3D"560" width=3D3D"852"><br clear=3D3D"left">Complete - the template as follows. The widget used for =3DC3=3DA2=3DC2=3D80=3DC2=3D= 9Ctype=3DC3=3DA2=3D =3DC2=3D80=3DC2=3D9D is a - Selectbox, the one used for =3DC3=3DA2=3DC2=3D80=3DC2=3D9Cdescription=3DC= 3=3DA2=3DC2=3D80=3DC2=3D =3D9D is a textarea. Note - that the name of the input is =3DC3=3DA2=3DC2=3D80=3DC2=3D9Cdescr=3DC3=3D= A2=3DC2=3D80=3DC2=3D9D a=3D nd not description, as - this is the name of the column in the table. Finally on the last row - we have two widgets of type =3DC3=3DA2=3DC2=3D80=3DC2=3D9CSubmitbutton=3D= C3=3DA2=3DC2=3D80=3DC2=3D =3D9D of names =3DC3=3DA2=3DC2=3D80=3DC2=3D9Cread=3DC3=3DA2=3DC2=3D80=3DC2= =3D9D - and =3DC3=3DA2=3DC2=3D80=3DC2=3D9Csave=3DC3=3DA2=3DC2=3D80=3DC2=3D9D and = of corresponding label.<=3D /p> - <p><img src=3D3D"step4.jpg" name=3D3D"Graphic4" align=3D3D"left" border= =3D3D"0" h=3D eight=3D3D"380" width=3D3D"922"><br clear=3D3D"left"></p> -</li></ol> -<p>Then before moving to the next stage save the template as an XML + <li>In the top right cell, we will create a user entry and call it =3DC3= =3DA2=3D =3DC2=3D80=3DC2=3D9Cname=3DC3=3DA2=3DC2=3D80=3DC2=3D9D: this is the same na= me as thee column in=3D our + egw_et_media table. This is important as those fields will be populated = =3D automatically for us by eGroupWare:</li> + <li><img src=3D3D"step3.jpg" name=3D3D"Graphic9" align=3D3D"left" border= =3D3D"0" =3D height=3D3D"560" width=3D3D"852"><br clear=3D3D"left"> + <p>Complete the template as follows. The widget used for =3DC3=3DA2=3DC2= =3D80=3DC2=3D =3D9Ctype=3DC3=3DA2=3DC2=3D80=3DC2=3D9D is a + Selectbox, the one used for =3DC3=3DA2=3DC2=3D80=3DC2=3D9Cdescription=3D= C3=3DA2=3DC2=3D80=3DC2=3D =3D9D is a textarea. Note + that the name of the input is =3DC3=3DA2=3DC2=3D80=3DC2=3D9Cdescr=3DC3= =3DA2=3DC2=3D80=3DC2=3D9D =3D and not description, as + this is the name of the column in the table. Finally on the last row + we have two widgets of type =3DC3=3DA2=3DC2=3D80=3DC2=3D9CSubmitbutton= =3DC3=3DA2=3DC2=3D80=3D =3DC2=3D9D of names =3DC3=3DA2=3DC2=3D80=3DC2=3D9Cread=3DC3=3DA2=3DC2=3D80= =3DC2=3D9D + and =3DC3=3DA2=3DC2=3D80=3DC2=3D9Csave=3DC3=3DA2=3DC2=3D80=3DC2=3D9D and= of corresponding label.=3D </p> + <p><img src=3D3D"step4.jpg" name=3D3D"Graphic4" align=3D3D"left" border= =3D3D"0" =3D height=3D3D"380" width=3D3D"922"><br clear=3D3D"left"></p> + </li> +</ol> +<p>Then before moving to the next stage save the template as an XML =3D file by clicking on =3DC3=3DA2=3DC2=3D80=3DC2=3D9CExport XML=3DC3=3DA2=3DC= 2=3D80=3DC2=3D9D. Once a=3D gain the server must have write permissions on the directory.</p> <h2>5. Setting up the index page</h2> @@ -218,254 +162,213 @@ 'nonavbar' =3D3D> True ); include('../header.inc.php'); - $GLOBALS['egw']->redirect_link('/index.php', 'menuaction=3D3Dra= ph=3D atest.ui_et_media.edit'); - </pre><h2> -6. The code for our application</h2> + $GLOBALS['egw']->redirect_link('/index.php', 'menuaction=3D3Det= _m=3D edia.ui_et_media.edit'); +</pre> +<h2>6. The code for our application</h2> <p>An eGroupWare application is organised around 3 application layers:</p> -<ol> - <li><p>the storage layer, managed by a =3DC3=3DA2=3DC2=3D80=3DC2=3D9CStor= age Object=3D =3DC3=3DA2=3DC2=3D80=3DC2=3D9D (so). - This object is responsible for handling all access to the storage - engine</p> - </li><li><p>the business layer, managed by a =3DC3=3DA2=3DC2=3D80=3DC2=3D= 9CBusiness O=3D jbect=3DC3=3DA2=3DC2=3D80=3DC2=3D9D (bo). - This object is responsible for all the business logic</p> - </li><li><p>the user interface layer, managed by a =3DC3=3DA2=3DC2=3D80= =3DC2=3D9CUser=3D Interface=3DC3=3DA2=3DC2=3D80=3DC2=3D9D - (ui) object. This object is responsible for all interaction with the - user, including displaying and gathering data to and from the user</p> -</li></ol> -<p>For this, we create 3 files in the =3DC3=3DA2=3DC2=3D80=3DC2=3D9Cinc=3D= C3=3DA2=3DC2=3D80=3DC2=3D =3D9D directory, called -class.so.et_media.inc.php, class.bo_et_media.inc.php, -class.ui_et_media.inc.php. In this simple application, the bo and so -layers will be fairly minimal, this said it is a good idea to create -the application using the right standards from the start.</p> -<p>Here is the file <b>/et_media/inc/class.so_et_media.inc.php</b>:</p> -<pre><?php - include_once(PHPGW_INCLUDE_ROOT . '/etemplate/inc/class.so_sql.inc.php'); - - /** - * General storage class for et_media - */ - class so_et_media extends so_sql - { - function so_et_media() - { - $this->so_sql('et_media','egw_et_media'); - $this->empty_on_write =3D3D "''"; - } - }</pre><p> -<br><br> -</p> -<p>The file <b>/et_media/inc/class.bo_et_media.inc.php</b>:</p> -<pre><?php - /** - * Business Object for et_media - */ - class bo_et_media - { - var $types =3D3D array( - '' =3D3D> 'Select one ...', - 'cd' =3D3D> 'Compact Disc', - 'dvd' =3D3D> 'DVD', - 'book' =3D3D> 'Book', - 'video' =3D3D> 'Video Tape' - ); - - function bo_et_media() - { - $this->so =3D3D& CreateObject('et_media.so_et_media'); - } - =3D - function save($content) - { - $this->so->save($content); - } - - function read($content) - { - $this->so->search($content); - } - }</pre><p> -<br><br> -</p> +<ul> + <li> + the storage layer, managed by a =3DC3=3DA2=3DC2=3D80=3DC2=3D9CStorage Ob= ject=3DC3=3DA2=3D =3DC2=3D80=3DC2=3D9D (so). + This object is responsible for handling all access to the storage + engine. We use the "stock" so_sql class for this, so we + need no extra so-object for the moment. + </li> + <li> + the business layer, managed by a =3DC3=3DA2=3DC2=3D80=3DC2=3D9CBusiness = Ojbect=3DC3=3DA2=3D =3DC2=3D80=3DC2=3D9D (bo). + This object is responsible for all the business logic. + The business object can extend the storage object, + to avoid passing the so-methods as stubs to the ui layer. + </li> + <li> + the user interface layer, managed by a =3DC3=3DA2=3DC2=3D80=3DC2=3D9CUse= r Interface=3D =3DC3=3DA2=3DC2=3D80=3DC2=3D9D + (ui) object. This object is responsible for all interaction with the + user, including displaying and gathering data to and from the user. + The ui object can extend the bo-object. + </li> +</ul> +<p>For this, we create 2 files in the =3DC3=3DA2=3DC2=3D80=3DC2=3D9Cinc=3D= C3=3DA2=3DC2=3D80=3DC2=3D =3D9D directory, called +class.bo_et_media.inc.php and class.ui_et_media.inc.php. =3D +In this simple application, the bo layer will be fairly minimal, =3D +this said it is a good idea to create the application using the =3D +right standards from the start.</p> +<p>Here is the file <b>/et_media/inc/class.bo_et_media.inc.php</b>: +</p> +<pre> +<?php +<span>/** + * eGroupWare editable Templates - Example media database (et_media) + * + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU Gener= =3D al Public License + * @package etemplate + * @subpackage et_media + * @link http://www.egroupware.org + * @author Ralf Becker <Ral...@ou...> + */</span> + +include_once(EGW_INCLUDE_ROOT . '/etemplate/inc/class.so_sql.inc.php'); + +<span>/** + * Business object for et_media + */</span> +class bo_et_media extends so_sql +{ + <span>/** + * Availible media types + * + * @var array + */</span> + var $types =3D3D array( + '' =3D3D> 'Select one ...', + 'cd' =3D3D> 'Compact Disc', + 'dvd' =3D3D> 'DVD', + 'book' =3D3D> 'Book', + 'video' =3D3D> 'Video Tape' + ); + <span>/** + * Constructor initialising so_sql + * + * @return so_et_media + */</span> + function bo_et_media() + { + $this->so_sql('et_media','egw_et_media'); <span>// calling the const= =3D ructor of the extended bo object</span> + $this->empty_on_write =3D3D "''"; + } +} +</pre> <p>And finally the start of the <b>/et_media/inc/class.ui_et_media.inc.php</b>:</p> -<pre><?php -/*************************************************************************= =3D *\ -* eGroupWare - eTemplates - Tutoria Example - a simple MediaDB * -* http://www.eGroupWare.org * -* Written by Ralf Becker <RalfBecker AT outdoor-training DOT de> = =3D * -* -------------------------------------------- = =3D * -* This program is free software; you can redistribute it and/or modify it= =3D * -* under the terms of the GNU General Public License as published by the = =3D * -* Free Software Foundation; either version 2 of the License, or (at your = =3D * -* option) any later version. = =3D * -\*************************************************************************= =3D */ - -/* $ Id: class.et_media.inc.php,v 1.2 2002/10/19 11:11:03 ralfbecker Exp $= =3D */ - -class ui_et_media +<pre> +<?php +<span>/** + * eGroupWare editable Templates - Example media database (et_media) + * + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU Gener= =3D al Public License + * @package etemplate + * @subpackage et_media + * @link http://www.egroupware.org + * @author Ralf Becker <Ral...@ou...> + */</span> + +include_once(EGW_INCLUDE_ROOT . '/et_media/inc/class.bo_et_media.inc.php'); + +class ui_et_media extends bo_et_media { - var $public_functions =3D3D array( - "edit" =3D3D> True, - "writeLangFile" =3D3D> True - );</pre><p> -The $public_functions array defines which public functions can be -accessed by the user.</p> -<p>The constructor initialises the template engine and the Business -Object:</p> -<pre> function ui_et_media() - { - $this->tmpl =3D3D& CreateObject('etemplate.etemplate', 'et_me= di=3D a=2Eedit'); - $this->bo =3D3D& CreateObject('et_media.bo_et_media'); - $this->html =3D3D& $GLOBALS['egw']->html; - =3D - if(!@is_object($GLOBALS['egw']->js)) - { - $GLOBALS['egw']->js =3D3D& CreateObject('phpgwapi.javasc= ri=3D pt'); - } - - }</pre><p> -<br><br> -</p> -<p>Finally, the edit function is the one which does all the work from -a user perspective.</p> -<pre>function edit($content=3D3D'') =3D -{ - if (is_array($content)) // we are called as a call back - { - $r_id =3D3D $content['id']; - if ($r_id>0) // if we have an id -> read the entry - { - $content =3D3D $this->bo->read($content['id'= ]); - } - - if (isset($content['save'])) - { - unset($content['save']); - $msg .=3D3D (!$this->bo->save($content))?lan= g(=3D 'Entry Saved'):lang('Error: while saving'); - } - elseif (isset($content['read'])) - { - unset($content['id']); - unset($content['read']); - $found =3D3D $this->bo->so->search($conte= nt=3D , False, 'name, author'); - - if (!$found) - { - $msg .=3D3D lang('Nothing matched the sear= ch=3D criteria'); - } - else - { - $content =3D3D $found[0]; - } - } - } - else - { - $content =3D3D array(); - } - - //now we fill the content array for the next call to etemplate.exec - - $content =3D3D $content + array ( - 'msg' =3D3D> $msg - ); - - $sel_options =3D3D array( - 'type' =3D3D> $this->bo->types - ); - - $no_button =3D3D array( - ); - $preserv =3D3D array( - 'id' =3D3D> $this->data['id'] - ); - - $this->tmpl->exec( - 'et_media.ui_et_media.edit', // setting this function as t= =3D he callback - $content,$sel_options, $no_button,$preserv - ); - } - }</pre><p> + <span>/** + * Public functions callable via menuaction + * + * @var array + */</span> + var $public_functions =3D3D array( + 'edit' =3D3D> True, + ); + + <span>/** + * Constructor + * + * @return ui_et_media + */</span> + function ui_et_media() + { + $this->bo_et_media(); <span>// calling the constructor of the extend= =3D ed bo object</span> + + $this->tmpl =3D3D& CreateObject('etemplate.etemplate','et_media.edit'= ); + } + + <span>/** + * Edit a media database entry + * + * @param array $content=3D3Dnull + * @param string $msg=3D3D'' + */</span> + function edit($content=3D3Dnull,$msg =3D3D '') + { + if (is_array($content)) <span>// not first call from index</span> + { + if ($content['id'] > 0) + { + $this->read($content); + } + <span>//echo "<p>edit: content =3D3D"; _debug_array($content);</s= pa=3D n> + $this->data_merge($content); + <span>//echo "<p>edit: data =3D3D"; _debug_array($this->data);= </=3D span> + + if (isset($content['save'])) + { + $msg .=3D3D !$this->save() ? lang('Entry saved') : lang('Error: whi= le=3D saving !!!'); + } + } + + <span>// now we filling the content array for the next call to etemplate= =3D .exec</span> + + $content =3D3D $this->data + array( + 'msg' =3D3D> $msg + ); + $sel_options =3D3D array( + 'type' =3D3D> $this->types + ); + $this->tmpl->exec('et_media.ui_et_media.edit',$content,$sel_option= =3D s,$no_button,array( + 'id' =3D3D> $this->data['id'] + )); + } +</pre> +<p> The edit function is called from our index.php file or as callback for this form / dialog. In that case $content is an array with the content the user put into the fields of the dialog.</p> <p>Let first have a look what happend if we called the first time (or what we do to show the dialog again with the changed data):</p> <ol> - <li><p style=3D3D"margin-bottom: 0in;">the $content array is set up with - our internal data-array (which is empty on the first call) and the - message =3D - </p> - </li><li><p style=3D3D"margin-bottom: 0in;">$sel_options has the options = for - our selectbox: the options are an array where the keys are the - values returned by the selectbox and the values are what the - selectbox shows to the user. As we can have more than one selectbox - in a dialog, the key in $sel_options need to be the same as the name - of the selectbox. =3D - </p> - </li><li><p style=3D3D"margin-bottom: 0in;">$readonlys: if a fieldname is= s=3D et - in $readonlys to True, its content is showed readonly (for regular - fields like type Text) or left out for buttons (we use this later to - show the delete-button only when an entry is loaded) =3D - </p> - </li><li><p style=3D3D"margin-bottom: 0in;">the array $preserv is preserv= ed, - which means its stored in the app's session-data and is delivered - back like the content of the fields to the callback-function. We use - it here to store the id of the entry. This is similar to use a - hidden input-field in a form, but it does not need to be serialized - by the app and is NOT transmitted to the user and back. =3D - </p> - </li><li><p>at last we call etemplate::exec to show the template with the - content from $content and set the function itself as callback for - the dialog / form. =3D - </p> -</li></ol> + <li>the $content array is set up with our internal data-array (which is e= =3D mpty on the first call) and the message</li> + <li>$sel_options has the options for our selectbox: the options are an ar= =3D ray where the keys are the + values returned by the selectbox and the values are what the + selectbox shows to the user. As we can have more than one selectbox + in a dialog, the key in $sel_options need to be the same as the name + of the selectbox.</li> + <li>$readonlys: if a fieldname is set in $readonlys to True, its content = =3D is showed readonly =3D + (for regular fields like type Text) or left out for buttons (we use this= =3D later to + show the delete-button only when an entry is loaded)</li> + <li>the array $preserv is preserved, which means its stored in the app's = =3D session-data and is delivered + back like the content of the fields to the callback-function. We use + it here to store the id of the entry. This is similar to use a + hidden input-field in a form, but it does not need to be serialized + by the app and is NOT transmitted to the user and back.</li> + <li><p>at last we call etemplate::exec to show the template with the + content from $content and set the function itself as callback for + the dialog / form.</li> +</ol> <p>Now let's have a look what happens if the user submits the form and our callback is called: =3D </p> <ol> - <li><p style=3D3D"margin-bottom: 0in;">the callback (this function) is - not the submit-address of the form, the form get's always submitted - to the function <b>process_exec</b> of the etemplate class. This - function changes for some field-types the content (eg. a date-field - consists of 3 single fields, process_exec takes care that it is - delivered back as timestamp, as we set it in content before). It can - even submit the form back to the user if for a address-selection a - search for a pattern has to be performed and the matches are shown - to the user. In this case the callback is NOT called. The same is - true if an int field contains letters or is not within the minimum - or maximum set. <i>Not all of the is allready working, it will - follow in the next days/weeks.</i><br>For the specialist - process_exec uses $_POST and ignores $_GET set as query in the url. =3D - </p> - </li><li><p style=3D3D"margin-bottom: 0in;">the so_sql function data_merg= e, - copies all values from $content, which are columns in the db-table, - in our internal data array. Values which are not real data, like - buttons pressed are not copied (!). =3D - </p> - </li><li><p style=3D3D"margin-bottom: 0in;">if $content['save'] is set, t= he - [Save] button has been pressed ('save' is the name NOT the label of - the save button), in that case we use so_sql's save function to save - the content of our internal data-array to the db. =3D - </p> - </li><li><p style=3D3D"margin-bottom: 0in;">the same check is used for the - [Read]: we uses the content of all fields to search db for matching - entries. The user can use wildcards to perform a search on all - field. The wildcards are '*' and '?', so_sql translates them into - sql-wildcards. =3D - </p> - </li><li><p style=3D3D"margin-bottom: 0in;">if the search return False we= j=3D ust - set our message var. =3D - </p> - </li><li><p style=3D3D"margin-bottom: 0in;">if something is found we use - so_sql's init-function to set the data of the first match. Lateron - we will show a list if more than one entry is found. =3D - </p> - </li><li><p>after that the content array is filled again as discriped - above. =3D - </p> -</li></ol> + <li>the callback (this function) is + not the submit-address of the form, the form get's always submitted + to the function <b>process_exec</b> of the etemplate class. This + function changes for some field-types the content (eg. a date-field + consists of 3 single fields, process_exec takes care that it is + delivered back as timestamp, as we set it in content before). It can + even submit the form back to the user if for a address-selection a + search for a pattern has to be performed and the matches are shown + to the user. In this case the callback is NOT called. The same is + true if an int field contains letters or is not within the minimum + or maximum set. <i>Not all of the is allready working, it will + follow in the next days/weeks.</i><br>For the specialist + process_exec uses $_POST and ignores $_GET set as query in the url.</li> + <li>the so_sql function data_merge, copies all values from $content, whic= =3D h are columns in the db-table, + in our internal data array. Values which are not real data, like + buttons pressed are not copied (!).</li> + <li>if $content['save'] is set, the [Save] button has been pressed ('save= =3D ' is the name NOT the label of + the save button), in that case we use so_sql's save function to save + the content of our internal data-array to the db.</li> + <li>the same check is used for the [Read]: we uses the content of all fie= =3D lds to search db for matching + entries. The user can use wildcards to perform a search on all + field. The wildcards are '*' and '?', so_sql translates them into sql-wi= =3D ldcards.</li> + <li>if the search return False we just set our message var.</li> + <li>if something is found we use so_sql's init-function to set the data o= =3D f the first match. Lateron + we will show a list if more than one entry is found.</li> + <li><p>after that the content array is filled again as discriped above.</= =3D li> +</ol> <p>Now we are able to store entries in the db and retrive them by searching the database for patterns in the different fields. You can try your new application now. You can create new records and save @@ -487,143 +390,133 @@ <p style=3D3D"">The 'et_media.show.rows' template is created as a 3x2 table. On the header row, two labels =3DC3=3DA2=3DC2=3D80= =3DC2=3D9CNa=3D me=3DC3=3DA2=3DC2=3D80=3DC2=3D9D and =3DC3=3DA2=3DC2=3D80=3DC2=3D9CAuthor=3DC3=3DA2=3DC2=3D80=3DC2=3D9D and one= empty cell.</p> -<p><span style=3D3D"">On the second row, two labels of -name ${row}[name]</span> and ${row}[author]. In the last cell a +<p>ond row, two labels of name ${row}[name] and ${row}[author]. In the las= =3D t cell a submitButton of label =3DC3=3DA2=3DC2=3D80=3DC2=3D9CEdit=3DC3=3DA2=3DC2=3D= 80=3DC2=3D9D and of name=3D =3DC3=3DA2=3DC2=3D80=3DC2=3D9Cedit[$row_cont[id]]=3DC3=3DA2=3DC2=3D80=3DC2= =3D9D </p> <p><img src=3D3D"step6.jpg" name=3D3D"Graphic6" align=3D3D"left" border=3D= 3D"0" he=3D ight=3D3D"515" width=3D3D"847"><br clear=3D3D"left"><br><br> </p> -<p>The class of the header row is =3DC3=3DA2=3DC2=3D80=3DC2=3D9Cnmh=3DC3= =3DA2=3DC2=3D80=3DC2=3D9D =3D and the class of the -content row is =3DC3=3DA2=3DC2=3D80=3DC2=3D9Cnmr=3DC3=3DA2=3DC2=3D80=3DC2= =3D9D. eTemplate will aut=3D omatically vary the -colors of the =3DC3=3DA2=3DC2=3D80=3DC2=3D9Cnmr=3DC3=3DA2=3DC2=3D80=3DC2= =3D9D class to provide a n=3D ice visual effect.</p> +<p>The class of the header row is =3DC3=3DA2=3DC2=3D80=3DC2=3D9Cth=3DC3=3D= A2=3DC2=3D80=3DC2=3D9D a=3D nd the class of the +content row is =3DC3=3DA2=3DC2=3D80=3DC2=3D9Crow=3DC3=3DA2=3DC2=3D80=3DC2= =3D9D. eTemplate will aut=3D omatically vary the +colors of the =3DC3=3DA2=3DC2=3D80=3DC2=3D9Crow=3DC3=3DA2=3DC2=3D80=3DC2= =3D9D class to provide a n=3D ice visual effect.</p> <p>Here is a view of the et_media.show template once the two templates have been created:</p> <p><img src=3D3D"step7.jpg" name=3D3D"Graphic10" align=3D3D"left" border= =3D3D"0" h=3D eight=3D3D"419" width=3D3D"950"><br clear=3D3D"left"><br><br> </p> <p>We need some code / a function in the class to call the template and fill the content:</p> -<pre> function show($found) - { - if (!is_array($found) || !count($found)) - { - $this->edit(); - return; - } - reset($found); // create array with all matches, = =3D indexes starting with 1 - for ($row=3D3D1; list($key,$data) =3D3D each($found); ++$r= ow) - { - $entry[$row] =3D3D $data; - } - $content =3D3D array( - 'msg' =3D3D> lang('%d matches on search criteri= a'=3D ,count($found)), - 'entry' =3D3D> $entry // et_media= .s=3D how.rows uses this, as we put 'entry' in the Options-field - ); - $this->tmpl->read('et_media.show'); // read the = =3D show-template - - $this->tmpl->exec('et_media.ui_et_media.edit',$conte= =3D nt); // exec it with the edit-function as callback - }</pre><p> +<pre> + <span>/** + * Showing entries from the media database + * + * @param array $found + */</span> + function show($found=3D3Dnull) + { + if (!is_array($found) || !count($found)) + { + $this->edit(); + return; + } + array_unshift($found,false); <span>// change the array to start with ind= =3D ex 1</span> + $content =3D3D array( + 'msg' =3D3D> lang('%1 matches on search criteria',count($found)), + 'entry' =3D3D> $found, + ); + $this->tmpl->read('et_media.show'); + + $this->tmpl->exec('et_media.ui_et_media.edit',$content); + } +} +</pre><p> This function is called by edit with the matches of a search:</p> <ol> - <li><p style=3D3D"margin-bottom: 0in;">We build an array with all the - matches, the index in that array is the row-number starting with 1 - (!) ($entry =3D3D array('empty') + $found; would do the same).<br>The - names in the data-row (last row) of 'et_media.show.rows' are like - '${row}[name]'. Variable expansion is performed on each name and - expands that for the first row to '1[name]' which addresses the name - in the first match. =3D - </p> - </li><li><p style=3D3D"margin-bottom: 0in;">$content contains again 'msg' - which we set to the number of entris found and the above array with - the data of all rows under the key 'entry', as we put that in - Options for the field loading the sub-template 'et_media.show.rows'. - It not necessary to put something in Options-field / use a sub-array - for a sub-template, but it can be very helpful to organize a complex - content-array. (As an exercice you can remove 'entry' from the - Options-field and change the function arrcordingly). =3D - </p> - </li><li><p style=3D3D"margin-bottom: 0in;">we now explizitly read the - template 'et_media.show' (the constructor reed 'et_media.edit') and - execute it again with the edit function as callback (because of - that, show does NOT need to be listed in public_functions) =3D - </p> - </li><li><p>as 'et_media.show.rows' contains only one data-row, but - fieldnames with variables to expand, that row is autorepeated for as - many data we put into the content array (or the sub-array if we used - the Options-field). =3D - </p> -</li></ol> + <li>We build an array with all the matches, the index in that array is th= =3D e row-number starting with 1(!) =3D + ($entry =3D3D array('empty') + $found; would do the same).<br /> + The names in the data-row (last row) of 'et_media.show.rows' are like + '${row}[name]'. Variable expansion is performed on each name and + expands that for the first row to '1[name]' which addresses the name + in the first match.</li> + <li>$content contains again 'msg' which we set to the number of entris fo= =3D und and the above array with + the data of all rows under the key 'entry', as we put that in + Options for the field loading the sub-template 'et_media.show.rows'. + It not necessary to put something in Options-field / use a sub-array + for a sub-template, but it can be very helpful to organize a complex + content-array. (As an exercice you can remove 'entry' from the + Options-field and change the function arrcordingly).</li> + <li>we now explizitly read the template 'et_media.show' (the constructor = =3D reed 'et_media.edit') and + execute it again with the edit function as callback (because of + that, show does NOT need to be listed in public_functions)</li> + <li>as 'et_media.show.rows' contains only one data-row, but fieldnames wi= =3D th variables to expand, that row is autorepeated for as + many data we put into the content array (or the sub-array if we used the = =3D Options-field).</li> +</ol> <p>To call the show function, we need to make some changes to the edit-function too:</p> -<pre> elseif (isset($content['read'])) - { - unset($content['id']); = =3D // not set by user, so dont use for seach - $found =3D3D $this->search($content,Fal= se=3D ,'name,author'); // searches by using the no-empty fields - - if (!$found) // search returned empty - { - $msg .=3D3D lang('Nothing matched = se=3D arch criteria !!!'); - } - elseif (count($found) =3D3D=3D3D 1) = =3D // only one match --> show it in the editor - { - $this->init($found[0]); - } - else //= =3D multiple matches --> use the show function/template - { - $this->show($found); - return; - } - } - elseif (isset($content['entry']['edit'])) //= =3D the callback from for the show function/template - { //= =3D the id is set via the button name of '$row_cont[id]' - list($id) =3D3D each($content['entry']['ed= it=3D ']); // note its not only ['edit'] !!! - if ($id > 0) - { - $content =3D3D $this->bo->so= -&=3D gt;read(array('id' =3D3D> $id)); - } - }</pre> -<ol> - <li><p style=3D3D"margin-bottom: 0in;">the first part should be - self-explaining, we call show with $found if it contain more than - one entry. =3D - </p> - </li><li><p>The show function uses edit as callback, the [Edit] buttons - in each row has 'edit[$row_cont[id]]' as name. If an [Edit] button - is pressed $content['entry']['edit'] is set to the id of the entry - of that row. We use that id to read the whole entry. =3D - </p> -</li></ol> +<pre> + elseif (isset($content['read'])) + { + unset($content['id']); <span>// not set by user, so dont use for s= =3D each</span> + unset($content['read']); + $found =3D3D $this->search($content,False,'name,author'); <span>// = se=3D arches by using the no-empty fields</span> + + if (!$found) + { + $msg .=3D3D lang('Nothing matched search criteria !!!'); + } + elseif (count($found) =3D3D=3D3D 1) + { + $this->init($found[0]); <span>// only one match --> show it = =3D in the editor</span> + } + else + { + $this->show($found); <span>// multiple matches --> use the s= =3D how function/template</span> + return; + } + } + elseif (isset($content['entry']['edit'])) <span>// the callback from = =3D for the show function/template</span> + { <span>// the id is set via the button name of '$row_cont[id]'<= =3D /span> + list($id) =3D3D each($content['entry']['edit']); <span>// note its no= t =3D only ['edit'] !!!</span> + if ($id > 0) + { + $this->read(array('id' =3D3D> $id)); + } + } +</pre> +<ol> + <li>the first part should be self-explaining, we call show with $found if= =3D it contain more than + one entry.</li> + <li>The show function uses edit as callback, the [Edit] buttons + in each row has 'edit[$row_cont[id]]' as name. If an [Edit] button + is pressed $content['entry']['edit'] is set to the id of the entry + of that row. We use that id to read the whole entry.</li> +</ol> <p>This is what the new =3DC3=3DA2=3DC2=3D80=3DC2=3D9Cshow=3DC3=3DA2=3DC2= =3D80=3DC2=3D9D template =3D looks like:</p> <p><img src=3D3D"step8.jpg" name=3D3D"Graphic11" align=3D3D"left" border= =3D3D"0" h=3D eight=3D3D"349" width=3D3D"950"><br clear=3D3D"left"><br><br> </p> <p>While makeing this changes we can add a [Cancel] and [Delete] button too:</p> -<pre> elseif (isset($content['cancel'])) - { - $content =3D3D array(); // clear the conte= nts - } - elseif (isset($content['delete'])) - { - $this->bo->so->delete($r_id); - $content =3D3D array(); // clear the conte= nt - } - - - $no_button =3D3D array( // no delete button if id =3D3= D=3D3D=3D 0 --> entry not saved - 'delete' =3D3D> !$this->content['id']; =3D - );</pre> -<ol> - <li><p style=3D3D"margin-bottom: 0in;">on cancel we just clear the - internal data-array with so_sql's init function. =3D - </p> - </li><li><p style=3D3D"margin-bottom: 0in;">on delete we have to call so_= sq=3D l's - delete before (it deletes the db-row coresponding with our internal - data-array) =3D - </p> - </li><li><p>the last block checks if the id field is set (it can only be - set by a read or save) and disables the [Delete] button if not - ($this->db_key_cols[$this->autoinc_id] =3D3D=3D3D 'id'). =3D - </p> -</li></ol> +<pre> + elseif (isset($content['cancel'])) + { + $content =3D3D array(); <span>// clear the contents</span> + } + elseif (isset($content['delete'])) + { + $this->bo->so->delete($r_id); + $content =3D3D array(); <span>// clear the content</span> + } + =3D + $no_button =3D3D array( <span>// no delete butto= n =3D if id =3D3D=3D3D 0 --> entry not saved</span> + 'delete' =3D3D> !$this->content['id']; =3D + ); +</pre> +<ol> + <li>on cancel we just clear the internal data-array with so_sql's init fu= =3D nction.</li> + <li>on delete we have to call so_sql's delete before (it deletes the db-r= =3D ow coresponding =3D + with our internal data-array)</li> + <li><p>the last block checks if the id field is set (it can only be + set by a read or save) and disables the [Delete] button if not + ($this->db_key_cols[$this->autoinc_id] =3D3D=3D3D 'id').</li> +</ol> <p>Of course we have to add this buttons to the template 'et_media.edit'. I trust you can add 2 Submitbuttons with the names 'cancel' and 'delete', a Label and a nice helpmessages by now without @@ -633,32 +526,12 @@ translate the app in other languages we need to create a lang-file<br>There are 2 possibilties to create it automaticaly:</p> <ol> - <li><p style=3D3D"margin-bottom: 0in;">Use the [Write Langfile] button in - the eTemplate editor (put the app-name 'et_media' in the name-field - first)<br>That will omitt our own messages in the class!!! =3D - </p> - </li><li><p>We use a function in our class to call - etemplate::writeLangFile('et_media','en',$extra) and can so supply - some extra strings.<br>If we add this function to the - public_functions-array in our class, we can just call this function - via the - browser:<br>http://ourDomain/eGroupWare/index.php?menuaction=3D3Det_media= .e=3D t_media.writeLangFile - (the errormsg can be savely ignored)<br>This is the function (don't - forget to add it like the edit-function to public_functions): =3D - </p> -</li></ol> -<p>Anyway we have to use the TranslationTools to find and write the -lang()-messages of our code!</p> -<pre> /*! - @function writeLangFile - @abstract writes langfile with all templates registered here - @discussion can be called via [write Langfile] in eTemplate editor - */ - function writeLangFile() - { - return $this->tmpl->writeLangFile('et_media','en',$t= =3D his->types); - }</pre><h2> -9. dumping the eTemplate to a file for distribution</h2> + <li>Use the [Write Langfile] button in the eTemplate editor (put the app-= =3D name 'et_media' in the name-field + first)<br />That will NOT write the messages in the classes!!!</li> + <li>We can use the TranslationTools to scans our sources for lang('...') = =3D calls ([search new phrases] button).</li> + <li>Other phrases like the media types can be added manually via [Add] bu= =3D tton in the Translation Tools.</li> +</ol> +<h2>9. dumping the eTemplate to a file for distribution</h2> <p>To be able to put the eTemplates in CVS and to ship them with your app, you need to dump them in a file first. =3D </p> @@ -668,30 +541,30 @@ <b>et_media/setup/etemplates.inc.php</b>. The etemplate-class loads this file whenever it finds a new version automaticaly.</p> <h2>10. further information</h2> -<ol> - <li><p style=3D3D"margin-bottom: 0in;">the <a href=3D3D"reference.html">r= efer=3D ence-documentation</a> - of the eTemplates</p></li> - <li><p style=3D3D"margin-bottom: 0in;">for all functions and parameters - of the <b>etemplate</b>-class(es) look in the =3D - <a href=3D3D"http://www.egroupware.org/egwdoc/li_etemplate.html" target= =3D3D"=3D _blank">phpDocumentor docu of etemplate</a> =3D - created from comments (yes there are comments) in the sources: =3D - </p> - <ul> - <li><p style=3D3D"margin-bottom: 0in;"><a href=3D3D"http://www.egroupwar= e=2Eor=3D g/egwdoc/etemplate/api/etemplate.html" target=3D3D"_blank">class.uietemplat= e=2E=3D inc.php</a> =3D - for the exec function</p></li> - <li><p style=3D3D"margin-bottom: 0in;"><a href=3D3D"http://www.egroupwar= e=2Eor=3D g/egwdoc/etemplate/api/boetemplate.html" target=3D3D"_blank">class.boetempl= at=3D e=2Einc.php</a> - for the variable replacement in names and about the autorepeat rows and = =3D columns</p></li> - <li><p style=3D3D"margin-bottom: 0in;"><a href=3D3D"http://www.egroupwar= e=2Eor=3D g/egwdoc/etemplate/api/boetemplate.html" target=3D3D"_blank">class.soetempl= at=3D e=2Einc.php</a> - for writeLangFile and all functions to read, store and dump an eTemplate= =3D </p></li> - </ul></li> - <li><p style=3D3D"margin-bottom: 0in;">for all functions and parameters - of the <b>so_sql</b>-class look in the comments of the file - <a href=3D3D"http://www.egroupware.org/egwdoc/etemplate/api/so_sql.html" = ta=3D rget=3D3D"_blank">class.so_sql.inc.php</a></p> - </li><li><p>for setup, the necessary files of an app or the format of - tables_current.inc.php look at the exelent <a href=3D3D"../../setup/doc/s= et=3D up3.html">docu - of setup3</a> in the doc-dir of the setup app. =3D - </p> -</li></ol> -<h2><i>That's it</i> - please <a href=3D3D"#" onclick=3D3D"document.locati= on=3D =3D3D'mai'+'lto:RalfBecker'+unescape('%40')+'outdoor-training'+unescape('%2= E'=3D )+'de'; return false;">contact -me</a> if you have further questions or comments about the tutorial</h2> +<p><b>Please note:</b> <i>all files of the et_media example can be found i= =3D n the et_media sub-direcotry of +etemplate's doc directory. Symlinking or coping to the eGroupWare install = =3D directory, allows to =3D +immediatly install it via setup.</i></p> +<ol> + <li>the <a href=3D3D"reference.html">reference-documentation</a> of the e= Te=3D mplates</li> + <li>for all functions and parameters of the <b>etemplate</b>-class(es) lo= =3D ok in the =3D + <a href=3D3D"http://www.egroupware.org/egwdoc/li_etemplate.html" target= =3D3D=3D "_blank">phpDocumentor docu of etemplate</a> =3D + created from comments (yes there are comments) in the sources: =3D + <ul> + <li><a href=3D3D"http://www.egroupware.org/egwdoc/etemplate/api/etempla= te=3D .html" target=3D3D"_blank">class.uietemplate.inc.php</a> =3D + for the exec function</p></li> + <li><a href=3D3D"http://www.egroupware.org/egwdoc/etemplate/api/boetemp= la=3D te.html" target=3D3D"_blank">class.boetemplate.inc.php</a> + for the variable replacement in names and about the autorepeat rows and= =3D columns</p></li> + <li><a href=3D3D"http://www.egroupware.org/egwdoc/etemplate/api/boetemp= la=3D te.html" target=3D3D"_blank">class.soetemplate.inc.php</a> + for writeLangFile and all functions to read, store and dump an eTemplat= =3D e</p></li> + </ul> + </li> + <li>for all functions and parameters of the <b>so_sql</b>-class look in t= =3D he comments of the file + <a href=3D3D"http://www.egroupware.org/egwdoc/etemplate/api/so_sql.html"= t=3D arget=3D3D"_blank">class.so_sql.inc.php</a></li> + <li><p>for setup, the necessary files of an app or the format of + tables_current.inc.php look at the exelent <a href=3D3D"../../setup/doc/= se=3D tup3.html">docu + of setup3</a> in the doc-dir of the setup app. </li> +</ol> +<h2><i>That's it</i> - please write to our <a href=3D3D"#" onclick=3D3D"do= cume=3D nt.location=3D3D'mai'+'lto:egroupware-developer'+unescape('%40')+'lists'+un= es=3D cape('%2E')+'sf.net'; return false;">developers list</a> =3D +or <a href=3D3D"http://forum.egroupware.org/" target=3D3D"_blank">develope= r fo=3D rum</a>, =3D +if you have further questions or comments about the tutorial or eTemplate.= =3D </h2> </body></html> |