phpgroupware-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Phpgroupware-cvs] CVS: etemplate/doc etemplate.html,1.4,1.5


From: Ralf Becker <address@hidden>
Subject: [Phpgroupware-cvs] CVS: etemplate/doc etemplate.html,1.4,1.5
Date: Mon, 18 Feb 2002 16:56:02 -0500

Update of /cvsroot/phpgroupware/etemplate/doc
In directory subversions:/tmp/cvs-serv7571

Modified Files:
        etemplate.html 
Log Message:
lots of explanation and some formatting added

Index: etemplate.html
===================================================================
RCS file: /cvsroot/phpgroupware/etemplate/doc/etemplate.html,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -r1.4 -r1.5
*** etemplate.html      18 Feb 2002 17:39:25 -0000      1.4
--- etemplate.html      18 Feb 2002 21:56:00 -0000      1.5
***************
*** 4,11 ****
  <head>
    <title>phpGroupware: eTemplates - Templates and Dialog-Editor</title>
  </head>
  <body>
  <h1>eTemplate - Templates and Dialog-Editor for phpGroupware</h1>
! <h3>address@hidden</h3>
  <p>A developers tutorial how to write an application with the new 
eTemplates.<br>
  It is also an introduction how to write a phpgw- and setup(3)-compatible 
app.</p>
--- 4,18 ----
  <head>
    <title>phpGroupware: eTemplates - Templates and Dialog-Editor</title>
+ <STYLE type="text/css">
+ <!--
+ pre { font-family: monospace; background-color: #e0e0e0; padding: 2mm; 
border-width: thin; border-style: solid; border-color: black; white-space: pre; 
}
+ span { color: darkblue; font-family: sans-serife; }
+ li { margin-top: 5px; }
+ -->
+ </STYLE>
  </head>
  <body>
  <h1>eTemplate - Templates and Dialog-Editor for phpGroupware</h1>
! <h3>by Ralf Becker <a href="mailto:address@hidden";>address@hidden</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 phpgw- and setup(3)-compatible 
app.</p>
***************
*** 31,35 ****
        <li>the dialog editor can dump all templates of an app for distribution 
(so they can be in the CVS too)
        <li>they encapsulate differnt UI (User Interface) types from the app: 
at the moment only a HTML one is ready,
!       but a GTK one (using php-gtk, <b>running as native app under linux and 
win32</b>) and XUL is planed.
  </ul>
  <hr>
--- 38,42 ----
        <li>the dialog editor can dump all templates of an app for distribution 
(so they can be in the CVS too)
        <li>they encapsulate differnt UI (User Interface) types from the app: 
at the moment only a HTML one is ready,
!       but a GTK one (using php-gtk, <b>running as native app under linux and 
win32</b>) and XUL is under development.
  </ul>
  <hr>
***************
*** 45,54 ****
  <p>Each app need a name, eg. 'et_media'. We now need to create the following 
directory structur above the phpgroupware dir:
  <pre>
! et_media                              (that has to be identical to our 
app-name)
!       + setup                         (files necessary for the setup 
Programm, give the webserver write-permission to that dir)
!       + inc                           (class-files)
!       + templates                     (templates, still need to store the 
images and get around a lot of complains from the api)
                + default
!                       + images        (here goes our images / icons)
  </pre>
  
--- 52,61 ----
  <p>Each app need a name, eg. 'et_media'. We now need to create the following 
directory structur above the phpgroupware dir:
  <pre>
! et_media                              <span>that has to be identical to our 
app-name</span>
!       + setup                         <span>files necessary for the setup 
Programm, give the webserver write-permission to that dir</span>
!       + inc                           <span>class-files</span>
!       + templates                     <span>templates, still needed to store 
the images and get around a lot of complains from the api</span>
                + default
!                       + images        <span>here goes our images / 
icons</span>
  </pre>
  
***************
*** 71,84 ****
        $setup_info['et_media']['title']     = 'eT-Media';
        $setup_info['et_media']['version']   = '0.9.15.001';
!       $setup_info['et_media']['app_order'] = 100;     // at the end
        $setup_info['et_media']['tables']    = array('phpgw_et_media');
        $setup_info['et_media']['enable']    = 1;
  
!       /* Dependacies for this app to work */
        $setup_info['et_media']['depends'][] = array(
                 'appname' => 'phpgwapi',
                 'versions' => Array('0.9.13','0.9.14','0.9.15')
        );
!       $setup_info['et_media']['depends'][] = array(   // this is only 
necessary as long the etemplate-class is not in the api
                 'appname' => 'etemplate',
                 'versions' => Array('0.9.13','0.9.14','0.9.15')
--- 78,91 ----
        $setup_info['et_media']['title']     = 'eT-Media';
        $setup_info['et_media']['version']   = '0.9.15.001';
!       $setup_info['et_media']['app_order'] = 100;             <span>// at the 
end</span>
        $setup_info['et_media']['tables']    = array('phpgw_et_media');
        $setup_info['et_media']['enable']    = 1;
  
!       <span>/* Dependacies for this app to work */</span>
        $setup_info['et_media']['depends'][] = array(
                 'appname' => 'phpgwapi',
                 'versions' => Array('0.9.13','0.9.14','0.9.15')
        );
!       $setup_info['et_media']['depends'][] = array(   <span>// this is only 
necessary as long the etemplate-class is not in the api</span>
                 'appname' => 'etemplate',
                 'versions' => Array('0.9.13','0.9.14','0.9.15')
***************
*** 87,91 ****
  
  <h2>4. setting up the db-table with the db_tools and setup</h2>
! <p>To enable setup to create a db-table for us, we need to define the fields 
we want.<br>
  We can use the db-Tools from the etemplate app to create the file for us:</p>
  
--- 94,99 ----
  
  <h2>4. 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 
<b>so_sql</b>-class with the necessary information, we need to define
! the type and size of the fields / columns in our db-table.<br>
  We can use the db-Tools from the etemplate app to create the file for us:</p>
  
***************
*** 95,99 ****
        <li>start the etemplate app and click on the button up, right which 
says db-Tools
        <li>select Application: eT-Media
!       <li>type: phpgw_et_media in the field in front of the [Add Table] 
button and click on the button
        <li>now use [Add Column] to create the necessary fields as shown on the 
screenshot
        <li>Click on [Write Table] (If you get the error-message like in the 
screenshot, you need to give the webserver write-permission
--- 103,107 ----
        <li>start the etemplate app and click on the button up, right which 
says db-Tools
        <li>select Application: eT-Media
!       <li>type 'phpgw_et_media' in the field in front of the [Add Table] 
button and click on the button
        <li>now use [Add Column] to create the necessary fields as shown on the 
screenshot
        <li>Click on [Write Table] (If you get the error-message like in the 
screenshot, you need to give the webserver write-permission
***************
*** 108,117 ****
  <h2>5. 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:</p>
  <img src="editor.gif">
  <ol>
        <li>start the etemplate app and type <b>'et_media.edit'</b> in the name 
field
        <li>enter the field-types and other data as shown above
        <li>click on the [+] in the first column of the last row to add more 
rows
!       <li>click on save to save the dialog / template
        <li>you can use [Show (no save)] to have a look at it:<p>
  </ol>
--- 116,127 ----
  <h2>5. 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:</p>
+ 
  <img src="editor.gif">
+ 
  <ol>
        <li>start the etemplate app and type <b>'et_media.edit'</b> in the name 
field
        <li>enter the field-types and other data as shown above
        <li>click on the [+] in the first column of the last row to add more 
rows
!       <li>click on [Save] to save the dialog / template
        <li>you can use [Show (no save)] to have a look at it:<p>
  </ol>
***************
*** 123,126 ****
--- 133,137 ----
  <p>The index page is only used if someone clicks on the navbar icon (or on 
the black cross as we haven't supplied one so far).<br>
  Create the file <b>/et_media/index.php</b> with the following content:</p>
+ 
  <pre>
  &lt;?php
***************
*** 141,256 ****
  <h2>7. the code of class.et_media.inc.php</h2>
  <p>As a first step, we only save new entries. The code of the app is in 
<b>/et_media/inc/class.et_media.inc.php</b>:</p>
  <pre>
  &lt;?php
!       
/**************************************************************************\
!       * phpGroupWare - eTemplates - Tutoria Example - a simple MediaDB        
   *
!       * http://www.phpgroupware.org                                           
   *
!       * Written by Ralf Becker <address@hidden>                  *
!       * --------------------------------------------                          
   *
!       *  This program is free software; you can redistribute it and/or modify 
it *
!       *  under the terms of the GNU General Public License as published by 
the   *
!       *  Free Software Foundation; either version 2 of the License, or (at 
your  *
!       *  option) any later version.                                           
   *
!       
\**************************************************************************/
  
!       /* $Id$ */
  
!       
if(!isset($GLOBALS['phpgw_info']['flags']['included_classes']['so_sql']))
!       {
!               include(PHPGW_API_INC . 
'/../../etemplate/inc/class.so_sql.inc.php');
!               $GLOBALS['phpgw_info']['flags']['included_classes']['so_sql'] = 
True;
!       }
  
!       class et_media extends so_sql
        {
!               var $messages = array(
!                       'nothing_found' => 'Nothing matched search criteria 
!!!',
!                       'anz_found' => '%d matches on search criteria',
!                       'saved' => 'Entry saved',
!                       'error_writeing' => 'Error: writeing !!!'
!               );
!               var $types = array(
!                       '' => 'Select one ...',
!                       'cd' => 'Compact Disc',
!                       'dvd' => 'DVD',
!                       'book' => 'Book',
!                       'video' => 'Video Tape'
                );
  
!               function et_media($lang_on_messages = True)
                {
!                       $this->tmpl = 
CreateObject('etemplate.etemplate','et_media.edit');
! 
!                       $this->so_sql('et_media','phpgw_et_media');     // sets 
up our storage layer using the table 'phpgw_et_media'
!                       $this->empty_on_write = "''";   // that means if a 
column is empty how to write in the db, the default is NULL
  
!                       $this->public_functions += array(
!                               'edit' => True,
!                               'writeLangFile' => True
!                       );
  
!                       if ($lang_on_messages)
                        {
!                               reset($this->messages);
!                               while (list($key,$msg) = each($this->messages))
!                                       $this->messages[$key] = lang($msg);
                        }
!               }
  
!               function edit($content='',$msg = '')
!               {
!                       if (is_array($content)) // not first call from index
                        {
!                               if ($content['id'] > 0)
!                               {
!                                       $this->read($content);
!                               }
!                               $this->data_merge($content);
  
!                               if (isset($content['save']))
                                {
!                                       $msg .= $this->messages[!$this->save() 
? 'saved' : 'error_writeing'];
                                }
!                               elseif (isset($content['read']))
                                {
!                                       unset($content['id']);
!                                       $found = 
$this->search($content,False,'name,author');
! 
!                                       if (!$found)
!                                       {
!                                               $msg .= 
$this->messages['nothing_found'];
!                                       }
!                                       else
!                                       {
!                                               $this->init($found[0]);
!                                       }
                                }
                        }
  
!                       // now we filling the content array for the next call 
to etemplate.exec
  
!                       $content = $this->data + array(
!                               'msg' => $msg
!                       );
!                       $sel_options = array(
!                               'type' => $this->types
!                       );
!                       $no_button = array(
!                               'delete' => 
!$this->data[$this->db_key_cols[$this->autoinc_id]]
!                       );
!                       
$this->tmpl->exec('et_media.et_media.edit',$content,$sel_options,$no_button,array(
                                'id' => $this->data['id']
!                       ));
!               }
        }
  </pre>
  
! <h2>8. adding the search-function and a list-dialog</h2>
! <p>As saveing and reading of entries is working now we want to search for an 
entry and show a list of the result (if it's more than one).<br>
! First we need to create an other eTemplate to show the list: 
<b>'et_media.show'</b></p>
  <img src="list.gif">
  <p>As you see the templates includes an other template: 
<b>'et_media.show.rows'</b></p>
  <img src="rows.gif">
! <p>We need some code in the class to call the template and fill the 
content:</p>
  
  <pre>
--- 152,336 ----
  <h2>7. the code of class.et_media.inc.php</h2>
  <p>As a first step, we only save new entries. The code of the app is in 
<b>/et_media/inc/class.et_media.inc.php</b>:</p>
+ 
  <pre>
  &lt;?php
! 
<span>/**************************************************************************\
! * phpGroupWare - eTemplates - Tutoria Example - a simple MediaDB           *
! * http://www.phpgroupware.org                                              *
! * Written by Ralf Becker &lt;address@hidden>                  *
! * --------------------------------------------                             *
! *  This program is free software; you can redistribute it and/or modify it *
! *  under the terms of the GNU General Public License as published by the   *
! *  Free Software Foundation; either version 2 of the License, or (at your  *
! *  option) any later version.                                              *
! 
\**************************************************************************/</span>
! 
! <span>/* $Id$ */</span>
! 
! if(!isset($GLOBALS['phpgw_info']['flags']['included_classes']['so_sql']))
! {
!       include(PHPGW_API_INC . '/../../etemplate/inc/class.so_sql.inc.php');
!       $GLOBALS['phpgw_info']['flags']['included_classes']['so_sql'] = True;
! }
! </pre>
  
! <p>This loads the class so_sql, in a way that more than one class may use it 
(would be nice if we had an api-function for that).</p>
  
! <pre>
! class et_media extends so_sql
! {
!       var $messages = array(
!               'nothing_found' => 'Nothing matched search criteria !!!',
!               'anz_found' => '%d matches on search criteria',
!               'saved' => 'Entry saved',
!               'error_writeing' => 'Error: writeing !!!'
!       );
!       var $types = array(
!               '' => 'Select one ...',
!               'cd' => 'Compact Disc',
!               'dvd' => 'DVD',
!               'book' => 'Book',
!               'video' => 'Video Tape'
!       );
! </pre>
  
! <p>These are a few messages to show the user what happend, we show it via 
'msg' in content in the first Label-field after the app-title.<br>
! As one of the messages contain a %s to be used with sprintf, we have to run 
them manualy through lang().</p>
! 
! <pre>
!       function et_media($lang_on_messages = True)
        {
!               $this->tmpl = 
CreateObject('etemplate.etemplate','et_media.edit');
! 
!               $this->so_sql('et_media','phpgw_et_media');     <span>// sets 
up our storage layer using the table 'phpgw_et_media'</span>
!               $this->empty_on_write = "''";           <span>// what to write 
in the db, if a column is empty, the default is NULL</span>
! 
!               $this->public_functions += array(       <span>// this function 
can be called external, eg. by /index.php?menuaction=...</span>
!                       'edit' => True,
!                       'writeLangFile' => True
                );
  
!               if ($lang_on_messages)                  <span>// run all our 
messages throug lang</span>
                {
!                       reset($this->messages);
!                       while (list($key,$msg) = each($this->messages))
!                               $this->messages[$key] = lang($msg);
!               }
!       }
! </pre>
  
! <p>This is the contructor of the class, it does the following for us:
! <ol>
!       <li>creates a eTemplate object and load direct our 'et_media.show' 
template via the constructor
!       <li>set up our storage-layer, this is the <b>so_sql</b> class we are 
extending.<br>
!               <b>so_sql</b> provides basic functions to read, write, delete 
and search records in a sql-database.
!               It get's the information it needs about the structure of our 
table from the tables_current-file we created with the db-tools.
!       <li>set up / extends from so_sql the public_functions array, all 
functions called which should be called by links or as methode,
!               like our callbacks, need to be listed here.
!       <li>run our messages through lang() if we are not called with False 
(see later)
! </ol>
  
! <pre>
!       function edit($content='',$msg = '')
!       {
!               if (is_array($content)) <span>// we are called as callback for 
the dialog / form</span>
!               {
!                       if ($content['id'] > 0)         <span>// if we have an 
id --> read the entry</span>
                        {
!                               $this->read($content);
                        }
!                       $this->data_merge($content);    <span>// merge content 
with our internal data-array ($this->data)</span>
  
!                       if (isset($content['save']))    <span>// save the entry 
($this->data)</span>
                        {
!                               $msg .= $this->messages[!$this->save() ? 
'saved' : 'error_writeing'];
!                       }
!                       elseif (isset($content['read']))
!                       {
!                               unset($content['id']);                          
        <span>// not set by user, so dont use for seach</span>
!                               $found = 
$this->search($content,False,'name,author');   <span>// searches by using the 
no-empty fields</span>
  
!                               if (!$found)                    <span>// search 
returned empty</span>
                                {
!                                       $msg .= 
$this->messages['nothing_found'];
                                }
!                               else
                                {
!                                       $this->init($found[0]); <span>// set 
data-array with the content of the first match</span>
                                }
                        }
+               }
  
!               <span>// now we filling the content array for the next call to 
etemplate.exec</span>
  
!               $content = $this->data + array( <span>// the content to be 
merged in the template</span>
!                       'msg' => $msg
!               );
!               $sel_options = array(           <span>// the options for our 
type selectbox</span>
!                       'type' => $this->types
!               );
!               $no_button = array(             <span>// button not to 
show</span>
!               );
!               $preserv = array(               <span>// this data is preserved 
over the exec-call (like a hidden input-field in form)</span>
                                'id' => $this->data['id']
!               );
!               $this->tmpl->exec(
!                       'et_media.et_media.edit',       <span>// setting this 
function as callback for the dialog</span>
!                       $content,$sel_options,$no_button,$preserv
!               );
        }
+ }
  </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):<br>
! <ol>
!       <li>the $content array is set up with our internal data-array (which is 
empty on the first call) and the message
!       <li>$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.
!       <li>$readonlys: if a fieldname is set 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)
!       <li>the array $preserv is preserved, 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.
!       <li>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.
! </ol>
! <p>Now let's have a look what happens if the user submits the form and our 
callback is called:
! <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 $GLOBALS['HTTP_POST_VARS'] 
and ignores HTTP_GET_VARS set as query in the url.
!       <li>the so_sql function data_merge, 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 (!).
!       <li>if $content['save'] is set, the [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.
!       <li>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.
!       <li>if the search return False we just set our message var.
!       <li>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.
!       <li>after that the content array is filled again as discriped above.
! </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.<br>
! We are only lacking some way to show if we get more than one match on a 
search, that's what we are going to implement next:</p>
! 
! <h2>8. adding a list-dialog for the search-function</h2>
! <p>First we need to create an other eTemplate to show the list: 
<b>'et_media.show'</b></p>
! 
  <img src="list.gif">
+ 
  <p>As you see the templates includes an other template: 
<b>'et_media.show.rows'</b></p>
+ 
  <img src="rows.gif">
! 
! <p>We need some code / a function in the class to call the template and fill 
the content:</p>
  
  <pre>
***************
*** 262,266 ****
                        return;
                }
!               reset($found);
                for ($row=1; list($key,$data) = each($found); ++$row)
                {
--- 342,346 ----
                        return;
                }
!               reset($found);          <span>// create array with all matches, 
indexes starting with 1</span>
                for ($row=1; list($key,$data) = each($found); ++$row)
                {
***************
*** 269,327 ****
                $content = array(
                        'msg' => 
sprintf($this->messages['anz_found'],count($found)),
!                       'entry' => $entry
                );
!               $this->tmpl->read('et_media.show');
  
!               $this->tmpl->exec('et_media.et_media.edit',$content);
        }
  </pre>
  
  <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']);
!                                       $found = 
$this->search($content,False,'name,author');
  
!                                       if (!$found)
!                                       {
!                                               $msg .= 
$this->messages['nothing_found'];
!                                       }
!                                       elseif (count($found) == 1)
!                                       {
!                                               $this->init($found[0]);
!                                       }
!                                       else
!                                       {
!                                               $this->show($found);
!                                               return;
!                                       }
                                }
!                               elseif (isset($content['entry']['edit']))
                                {
!                                       list($id) = 
each($content['entry']['edit']);
!                                       if ($id > 0)
!                                       {
!                                               $this->read(array('id' => $id));
!                                       }
                                }
  </pre>
  
  <p>While makeing this changes we can add a [Cancel] and [Delete] button 
too:</p>
  
  <pre>
!                               elseif (isset($content['cancel']))
!                               {
!                                       $this->init();
!                               }
!                               elseif (isset($content['delete']))
!                               {
!                                       $this->delete();
!                                       $this->init();
!                               }
  </pre>
  
! <p>Of course we have to add this buttons to the template 'et_media.edit'</p>
  
  <h2>9. creating the english lang-file</h2>
--- 349,438 ----
                $content = array(
                        'msg' => 
sprintf($this->messages['anz_found'],count($found)),
!                       'entry' => $entry               <span>// 
et_media.show.rows uses this, as we put 'entry' in the size-field</span>
                );
!               $this->tmpl->read('et_media.show');     <span>// read the 
show-template</span>
  
!               $this->tmpl->exec('et_media.et_media.edit',$content);   
<span>// exec it with the edit-function as callback</span>
        }
  </pre>
  
+ <p>This function is called by edit with the matches of a search:</p>
+ <ol>
+       <li>We build an array with all the matches, the index in that array is 
the row-number starting with 1 (!).<br>
+               $entry = array('empty') + $found; would do the same.
+       <li>$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 Size for the field loading 
the sub-template 'et_media.show.rows'. It not necessary to
+               put something in Size-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 Size-field and 
change the function arrcordingly).
+       <li>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)
+ </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']);                          
        <span>// not set by user, so dont use for seach</span>
!                               $found = 
$this->search($content,False,'name,author');   <span>// searches by using the 
no-empty fields</span>
  
!                               if (!$found)    <span>// search returned 
empty</span>
!                               {
!                                       $msg .= 
$this->messages['nothing_found'];
!                               }
!                               elseif (count($found) == 1)             
<span>// only one match --> show it in the editor</span>
!                               {
!                                       $this->init($found[0]);
!                               }
!                               else                                    
<span>// multiple matches --> use the show function/template</span>
!                               {
!                                       $this->show($found);
!                                       return;
                                }
!                       }
!                       elseif (isset($content['entry']['edit']))       
<span>// the callback from for the show function/template</span>
!                       {                                               
<span>// the id is set via the button name of '$row_cont[id]'</span>
!                               list($id) = each($content['entry']['edit']);    
<span>// note its not only ['edit'] !!!</span>
!                               if ($id > 0)
                                {
!                                       $this->read(array('id' => $id));
                                }
+                       }
  </pre>
  
+ <ol>
+       <li>the first part should be self-explaining, we call show with $found 
if it contain more than one entry.
+       <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.
+ </ol>
+ 
  <p>While makeing this changes we can add a [Cancel] and [Delete] button 
too:</p>
  
  <pre>
!                       elseif (isset($content['cancel']))
!                       {
!                               $this->init();
!                       }
!                       elseif (isset($content['delete']))
!                       {
!                               $this->delete();
!                               $this->init();
!                       }
! 
! 
!               $no_button = array(     <span>// no delete button if id == 0 
--> entry not saved</span>
!                       'delete' => 
!$this->data[$this->db_key_cols[$this->autoinc_id]]
!               );
  </pre>
  
! <ol>
!       <li>on cancel we just clear the internal data-array with so_sql's init 
function.
!       <li>on delete we have to call so_sql's delete before (it deletes the 
db-row coresponding with our internal data-array)
!       <li>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] == 'id').
! </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 looking 
at a screenshot ;-).</p>
  
  <h2>9. creating the english lang-file</h2>
***************
*** 336,347 ****
        This is the function (don't forget to add it like the edit-function to 
public_functions):
  </ol>
  <pre>
        function writeLangFile()
        {
!               $etm = new et_media(False);     // no lang on messages
  
                $this->tmpl->writeLangFile('et_media','en',$etm->messages);
        }
  </pre>
  
  </body>
--- 447,480 ----
        This is the function (don't forget to add it like the edit-function to 
public_functions):
  </ol>
+ 
  <pre>
        function writeLangFile()
        {
!               $etm = new et_media(False);     <span>// no lang() on 
messages</span>
  
                $this->tmpl->writeLangFile('et_media','en',$etm->messages);
        }
  </pre>
+ 
+ <h2>10. 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.
+ <p>This is done in the eTemplate editor by putting the app-name or an 
template-name in the Name field and clicking on the button
+ [Dump4Setup]. This creates the file <b>et_media/setup/etemplates.inc.php</b>. 
The etemplate-class loads this file whenever it finds
+ a new version automaticaly.</p>
+ 
+ <h2>11. further information</h2>
+ <ol>
+       <li>for all functions and parameters of the <b>etemplate</b>-class look 
in the comments (yes there are comments) of the files:
+               <ul>
+                       <li>class.uietemplate.inc.php for the exec function
+                       <li>class.boetemplate.inc.php for the variable 
replacement in names and about the autorepeat rows and columns
+                       <li>class.soetemplate.inc.php for writeLangFile and all 
functions to read, store and dump an eTemplate
+               </ul>
+       <li>for all functions and parameters of the <b>so_sql</b>-class look in 
the comments of the file class.so_sql.inc.php
+       <li>for setup, the necessary files of an app or the format of 
tables_current.inc.php look at the exelent
+               <a href="../../setup/doc/setup3.html">docu of setup3</a> in the 
doc-dir of the setup app.
+ </ol>
+ 
+ <h2><i>That's it</i> - please <a href="mailto:address@hidden";>contact me</a> 
if you have further questions or comments about the tutorial</h2>
  
  </body>




reply via email to

[Prev in Thread] Current Thread [Next in Thread]