1 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" |
---|
2 | "http://www.w3.org/TR/html4/loose.dtd"> |
---|
3 | |
---|
4 | <html> |
---|
5 | <head> |
---|
6 | <title>eGroupWare Application Development</title> |
---|
7 | |
---|
8 | <style type="text/css"> |
---|
9 | <!-- |
---|
10 | h1 { |
---|
11 | text-shadow: 3px 3px 5px; |
---|
12 | } |
---|
13 | h1:before { |
---|
14 | content: counter(chapter) ". "; |
---|
15 | counter-increment: chapter; /* Add 1 to chapter */ |
---|
16 | counter-reset: section; /* Set section to 0 */ |
---|
17 | } |
---|
18 | h2:before { |
---|
19 | content: counter(chapter) "." counter(section) " "; |
---|
20 | counter-increment: section; |
---|
21 | } |
---|
22 | ol { counter-reset: item } |
---|
23 | lo { display: block } |
---|
24 | li:before { content: counters(item, "."); counter-increment: item } |
---|
25 | body, p, td {font-family: Verdana, Arial, Helvetica, sans-serif;} |
---|
26 | blockquote {text-align: center; font-style: italic;} |
---|
27 | //--> |
---|
28 | </style> |
---|
29 | </head> |
---|
30 | |
---|
31 | <body> |
---|
32 | <h1>eGroupWare Application Development</h1> |
---|
33 | |
---|
34 | <blockquote> |
---|
35 | This document explains eGroupWare's infrastructure and API, |
---|
36 | along with what is required to integrate applications into |
---|
37 | it. |
---|
38 | </blockquote> |
---|
39 | |
---|
40 | <h1>Contents</h1> |
---|
41 | |
---|
42 | <ol> |
---|
43 | <li><a href="#tth_sEc1">Introduction</a></li> |
---|
44 | |
---|
45 | <li style="list-style: none"> |
---|
46 | <ol> |
---|
47 | <li><a href="#tth_sEc1.1">Overview of application |
---|
48 | writing</a></li> |
---|
49 | |
---|
50 | <li><a href="#tth_sEc1.2">What does the eGroupWare API |
---|
51 | provide?</a></li> |
---|
52 | </ol> |
---|
53 | </li> |
---|
54 | |
---|
55 | <li><a href="#tth_sEc2">Guidelines</a></li> |
---|
56 | |
---|
57 | <li style="list-style: none"> |
---|
58 | <ol> |
---|
59 | <li><a href="#tth_sEc2.1">Requirements</a></li> |
---|
60 | |
---|
61 | <li><a href="#tth_sEc2.2">Writing/porting your |
---|
62 | application</a></li> |
---|
63 | </ol> |
---|
64 | </li> |
---|
65 | |
---|
66 | <li><a href="#tth_sEc3">Installing your application</a></li> |
---|
67 | |
---|
68 | <li style="list-style: none"> |
---|
69 | <ol> |
---|
70 | <li><a href="#tth_sEc3.1">Overview</a></li> |
---|
71 | |
---|
72 | <li><a href="#tth_sEc3.2">Automatic features</a></li> |
---|
73 | |
---|
74 | <li><a href="#tth_sEc3.3">Adding files, directories and |
---|
75 | icons.</a></li> |
---|
76 | |
---|
77 | <li><a href="#tth_sEc3.4">Making eGroupWare aware of your |
---|
78 | application</a></li> |
---|
79 | |
---|
80 | <li><a href="#tth_sEc3.5">Hooking into Administration |
---|
81 | page</a></li> |
---|
82 | |
---|
83 | <li><a href="#tth_sEc3.6">Hooking into Preferences |
---|
84 | page</a></li> |
---|
85 | </ol> |
---|
86 | </li> |
---|
87 | |
---|
88 | <li><a href="#tth_sEc4">Infrastructure</a></li> |
---|
89 | |
---|
90 | <li style="list-style: none"> |
---|
91 | <ol> |
---|
92 | <li><a href="#tth_sEc4.1">Overview</a></li> |
---|
93 | |
---|
94 | <li><a href="#tth_sEc4.2">Directory tree</a></li> |
---|
95 | |
---|
96 | <li><a href="#tth_sEc4.3">Translations</a></li> |
---|
97 | </ol> |
---|
98 | </li> |
---|
99 | |
---|
100 | <li><a href="#tth_sEc5">The API</a></li> |
---|
101 | |
---|
102 | <li style="list-style: none"> |
---|
103 | <ol> |
---|
104 | <li><a href="#tth_sEc5.1">Introduction</a></li> |
---|
105 | |
---|
106 | <li><a href="#tth_sEc5.2">Basic functions</a></li> |
---|
107 | |
---|
108 | <li><a href="#tth_sEc5.3">Application Functions</a></li> |
---|
109 | |
---|
110 | <li><a href="#tth_sEc5.4">File functions</a></li> |
---|
111 | |
---|
112 | <li><a href="#tth_sEc5.5">Email/NNTP Functions</a></li> |
---|
113 | </ol> |
---|
114 | </li> |
---|
115 | |
---|
116 | <li><a href="#tth_sEc6">Configuration Variables</a></li> |
---|
117 | |
---|
118 | <li style="list-style: none"> |
---|
119 | <ol> |
---|
120 | <li><a href="#tth_sEc6.1">Introduction</a></li> |
---|
121 | |
---|
122 | <li><a href="#tth_sEc6.2">User information</a></li> |
---|
123 | |
---|
124 | <li><a href="#tth_sEc6.3">Group information</a></li> |
---|
125 | |
---|
126 | <li><a href="#tth_sEc6.4">Server information</a></li> |
---|
127 | |
---|
128 | <li><a href="#tth_sEc6.5">Database information</a></li> |
---|
129 | |
---|
130 | <li><a href="#tth_sEc6.6">Mail information</a></li> |
---|
131 | |
---|
132 | <li><a href="#tth_sEc6.7">NNTP information</a></li> |
---|
133 | |
---|
134 | <li><a href="#tth_sEc6.8">Application |
---|
135 | information</a></li> |
---|
136 | </ol> |
---|
137 | </li> |
---|
138 | |
---|
139 | <li><a href="#tth_sEc7">Using Language Support</a></li> |
---|
140 | |
---|
141 | <li style="list-style: none"> |
---|
142 | <ol> |
---|
143 | <li><a href="#tth_sEc7.1">Overview</a></li> |
---|
144 | |
---|
145 | <li><a href="#tth_sEc7.2">How to use lang |
---|
146 | support</a></li> |
---|
147 | |
---|
148 | <li><a href="#tth_sEc7.3">Common return codes</a></li> |
---|
149 | </ol> |
---|
150 | </li> |
---|
151 | |
---|
152 | <li><a href="#tth_sEc8">Using Templates</a></li> |
---|
153 | |
---|
154 | <li style="list-style: none"> |
---|
155 | <ol> |
---|
156 | <li><a href="#tth_sEc8.1">Overview</a></li> |
---|
157 | |
---|
158 | <li><a href="#tth_sEc8.2">How to use PHPLIB |
---|
159 | templates</a></li> |
---|
160 | |
---|
161 | <li><a href="#tth_sEc8.3">How to use eTemplate |
---|
162 | templates</a></li> |
---|
163 | </ol> |
---|
164 | </li> |
---|
165 | |
---|
166 | <li><a href="#tth_sEc9">About this document</a></li> |
---|
167 | |
---|
168 | <li style="list-style: none"> |
---|
169 | <ol> |
---|
170 | <li><a href="#tth_sEc9.1">New versions</a></li> |
---|
171 | |
---|
172 | <li><a href="#tth_sEc9.2">Comments</a></li> |
---|
173 | |
---|
174 | <li><a href="#tth_sEc9.3">History</a></li> |
---|
175 | |
---|
176 | <li><a href="#tth_sEc9.4">Copyrights and |
---|
177 | Trademarks</a></li> |
---|
178 | |
---|
179 | <li><a href="#tth_sEc9.5">Acknowledgments and |
---|
180 | Thanks</a></li> |
---|
181 | </ol> |
---|
182 | </li> |
---|
183 | </ol> |
---|
184 | |
---|
185 | <h2><a name="tth_sEc1">1</a> Introduction</h2> |
---|
186 | |
---|
187 | <p>eGroupWare is a web based groupware application framework |
---|
188 | (API), for writing applications. Integrated applications such |
---|
189 | as email, calendar, todo list, address book, and file manager |
---|
190 | are included.</p> |
---|
191 | |
---|
192 | <h3><a name="tth_sEc1.1">1.1</a> Overview of |
---|
193 | application writing</h3> |
---|
194 | |
---|
195 | <p>We have attempted to make writing application for eGroupWare |
---|
196 | as painless as possible. We hope any pain and suffering is |
---|
197 | cause by making your application work, but not dealing with |
---|
198 | eGroupWare itself.</p> |
---|
199 | |
---|
200 | <h3><a name="tth_sEc1.2">1.2</a> What does the |
---|
201 | eGroupWare API provide?</h3> |
---|
202 | |
---|
203 | <p>The eGroupWare API handles session management, user/group |
---|
204 | management, has support for multiple databases, using the |
---|
205 | PHPLIB database abstraction method, we support templates using |
---|
206 | the PHPLIB Templates class, a file system interface, and even a |
---|
207 | network i/o interface.</p> |
---|
208 | |
---|
209 | <p>On top of these standard functions, eGroupWare provides |
---|
210 | several functions to give you the information you need about |
---|
211 | the users environment, and to properly plug into |
---|
212 | eGroupWare.</p> |
---|
213 | |
---|
214 | <h2><a name="tth_sEc2">2</a> Guidelines</h2> |
---|
215 | |
---|
216 | <h3><a name="tth_sEc2.1">2.1</a> Requirements</h3> |
---|
217 | |
---|
218 | <p>These guidelines must be followed for any application that |
---|
219 | wants considered for inclusion into eGroupWare deluxe:</p> |
---|
220 | |
---|
221 | <ul> |
---|
222 | <li>It must run on PHP4.1.0</li> |
---|
223 | |
---|
224 | <li>SQL statements must be compatible with both MySQL, |
---|
225 | PostgreSQL, M$ SQL Server and SAP-DB</li> |
---|
226 | |
---|
227 | <li>It must use our default header.inc.php include.</li> |
---|
228 | |
---|
229 | <li>It must use our $GLOBALS['phpgw']->link($url) for all |
---|
230 | links (this is for session support).</li> |
---|
231 | |
---|
232 | <li>It must use "POST" for form submit methods.</li> |
---|
233 | |
---|
234 | <li>It must respect eGW group rights and eGW user |
---|
235 | permissions.</li> |
---|
236 | |
---|
237 | <li>It must use our directory structure, template support and |
---|
238 | lang (multi-language) support.</li> |
---|
239 | |
---|
240 | <li>Where possible it should run on both Unix and NT |
---|
241 | platforms.</li> |
---|
242 | |
---|
243 | <li>For applications that do not meet these requirements, |
---|
244 | they can be available to users via the eGroupWare "3rd Party |
---|
245 | Apps" listing on our website. If you need help converting |
---|
246 | your application to templates and our lang support, we will |
---|
247 | try to connect you with someone to help.</li> |
---|
248 | </ul> |
---|
249 | |
---|
250 | <h3><a name="tth_sEc2.2">2.2</a> Writing/porting |
---|
251 | your application</h3> |
---|
252 | |
---|
253 | <h4>Include files</h4> |
---|
254 | |
---|
255 | <p>Each PHP page you write will need to include the |
---|
256 | header.inc.php along with a few variables.<br> |
---|
257 | This is done by putting this at the top of each PHP page.</p> |
---|
258 | <pre> |
---|
259 | <?php |
---|
260 | $GLOBALS['phpgw_info']['flags']['currentapp'] = 'appname'; |
---|
261 | include('../header.inc.php'); |
---|
262 | ?> |
---|
263 | |
---|
264 | |
---|
265 | </pre> |
---|
266 | Of course change application name to fit.<br> |
---|
267 | This include will provide the following things: |
---|
268 | |
---|
269 | <ul> |
---|
270 | <li>The phpgwAPI - The eGroupWare API will be loaded.</li> |
---|
271 | |
---|
272 | <li>The eGW navbar will be loaded (by default, but can be |
---|
273 | disabled until a later point.</li> |
---|
274 | |
---|
275 | <li>appname/inc/functions.inc.php - This file is loaded just |
---|
276 | after the phpgwAPI and before any HTML code is generated. |
---|
277 | This file should include all your application specific |
---|
278 | functions.. You are welcome to include any additional files |
---|
279 | you need from within this file.<br> |
---|
280 | <b>Note:</b> Depricated and not used for OOP |
---|
281 | (/index.php?menuaction=app.obj.method) calls.</li> |
---|
282 | |
---|
283 | <li>appname/inc/header.inc.php - This file is loaded just |
---|
284 | after the system header/navbar, and allows developers to use |
---|
285 | it for whatever they need to load.<br> |
---|
286 | <b>Note:</b> Depricated and not used for OOP |
---|
287 | (/index.php?menuaction=app.obj.method) calls.</li> |
---|
288 | |
---|
289 | <li>appname/inc/footer.inc.php - This file is loaded just |
---|
290 | before the system footer, allowing developers to close |
---|
291 | connections and whatever else they need.<br> |
---|
292 | <b>Note:</b> Depricated and not used for OOP |
---|
293 | (/index.php?menuaction=app.obj.method) calls.</li> |
---|
294 | |
---|
295 | <li>The eGW footer will be loaded, which closes several |
---|
296 | connections.</li> |
---|
297 | </ul> |
---|
298 | |
---|
299 | <h2><a name="tth_sEc3">3</a> Installing your |
---|
300 | application</h2> |
---|
301 | |
---|
302 | <h3><a name="tth_sEc3.1">3.1</a> Overview</h3> |
---|
303 | |
---|
304 | <p>It is fairly simple to add and delete applications to/from |
---|
305 | eGroupWare.</p> |
---|
306 | |
---|
307 | <h3><a name="tth_sEc3.2">3.2</a> Automatic |
---|
308 | features</h3> |
---|
309 | |
---|
310 | <p>To make things easy for developers we go ahead and load the |
---|
311 | following files.</p> |
---|
312 | |
---|
313 | <ul> |
---|
314 | <li>appname/inc/functions.inc.php - This file should include |
---|
315 | all your application specific functions.<br> |
---|
316 | <b>Note:</b> Depricated and not used for OOP |
---|
317 | (/index.php?menuaction=app.obj.method) calls.</li> |
---|
318 | |
---|
319 | <li>appname/inc/header.inc.php - This file is loaded by |
---|
320 | $phpgw->common->header just after the system |
---|
321 | header/navbar, and allows developers to use it for whatever |
---|
322 | they need to load.<br> |
---|
323 | <b>Note:</b> Depricated and not used for OOP |
---|
324 | (/index.php?menuaction=app.obj.method) calls.</li> |
---|
325 | |
---|
326 | <li>appname/inc/footer.inc.php - This file is loaded by |
---|
327 | $phpgw->common->footer just before the system footer, |
---|
328 | allowing developers to close connections and whatever else |
---|
329 | they need.<br> |
---|
330 | <b>Note:</b> Depricated and not used for OOP |
---|
331 | (/index.php?menuaction=app.obj.method) calls.</li> |
---|
332 | </ul> |
---|
333 | |
---|
334 | <h3><a name="tth_sEc3.3">3.3</a> Adding files, |
---|
335 | directories and icons.</h3> |
---|
336 | |
---|
337 | <p>You will need to create the following directories for your |
---|
338 | code<br> |
---|
339 | (replace 'appname' with your application name)<br> |
---|
340 | </p> |
---|
341 | <pre> |
---|
342 | --appname |
---|
343 | |
---|
344 | +--inc |
---|
345 | |
---|
346 | | |--functions.inc.php |
---|
347 | |
---|
348 | | |--header.inc.php |
---|
349 | |
---|
350 | | |--hook_preferences.inc.php |
---|
351 | |
---|
352 | | |--hook_admin.inc.php |
---|
353 | |
---|
354 | | +--footer.inc.php |
---|
355 | |
---|
356 | +--js |
---|
357 | |
---|
358 | | |--base |
---|
359 | |
---|
360 | | +--js_package_name |
---|
361 | |
---|
362 | +--setup |
---|
363 | |
---|
364 | | |--default_records.inc.php |
---|
365 | |
---|
366 | | |--setup.inc.php |
---|
367 | |
---|
368 | | +--tables_current.inc.php |
---|
369 | |
---|
370 | +--templates |
---|
371 | |
---|
372 | +--default |
---|
373 | </pre> |
---|
374 | |
---|
375 | <h3><a name="tth_sEc3.4">3.4</a> Making eGroupWare |
---|
376 | aware of your application</h3> |
---|
377 | |
---|
378 | <p>To make the application aware of your application, add your |
---|
379 | application details to the applications table. This can be done |
---|
380 | via the GUI administration screen, or via a SQL script. The |
---|
381 | script below should only be used during initial development. |
---|
382 | You should use the eGroupWare setup system for install and |
---|
383 | updating the final version of your application.</p> |
---|
384 | <pre> |
---|
385 | INSERT INTO phpgw_applications (app_name, app_title, app_enabled) |
---|
386 | VALUES('appname', 'The App name', 1); |
---|
387 | </pre> |
---|
388 | |
---|
389 | <h3><a name="tth_sEc3.5">3.5</a> Hooking into |
---|
390 | Administration page</h3> |
---|
391 | |
---|
392 | <p>When a user goes to the Administration page, it starts |
---|
393 | appname/inc/hook_admin.inc.php for each application that is |
---|
394 | enabled, in alphabetical order of application title. If the |
---|
395 | file exists, it is include()d in the hopes it will display a |
---|
396 | selection of links to configure that application.</p> |
---|
397 | |
---|
398 | <p>Simple Example:</p> |
---|
399 | <pre> |
---|
400 | <?php |
---|
401 | // Old linear script style |
---|
402 | $file['Site Configuration'] = $GLOBALS['phpgw']->link('myapp/myAdminPage.php'); |
---|
403 | // OR - OOP Style |
---|
404 | $file['Site Configuration'] = $GLOBALS['phpgw']->link('/index.php', |
---|
405 | array(menuaction => 'myapp.uiobj.admin_method'); |
---|
406 | display_section('myapp',$file); |
---|
407 | ?&#gt; |
---|
408 | </pre> |
---|
409 | Look at headlines/inc/hook_admin.inc.php and |
---|
410 | admin/inc/hook_admin.inc.php for more examples. Things to note: |
---|
411 | |
---|
412 | |
---|
413 | <ul> |
---|
414 | <li>Links are relative to the admin/index.php file, not your |
---|
415 | application's base directory. (so use "appname" in your |
---|
416 | link() calls)</li> |
---|
417 | |
---|
418 | <li>The file is brought in with include() so be careful to |
---|
419 | not pollute the name-space too much</li> |
---|
420 | </ul> |
---|
421 | The standard $GLOBALS['phpgw'] and $GLOBALS['phpgw_info'] |
---|
422 | variables are in-scope, as is $appname which corresponds to the |
---|
423 | application name in the path. |
---|
424 | |
---|
425 | <h3><a name="tth_sEc3.6">3.6</a> Hooking into |
---|
426 | Preferences page</h3> |
---|
427 | |
---|
428 | <p>The mechanism to hook into the preferences page is identical |
---|
429 | to the one used to hook into the administration page, however |
---|
430 | it looks for appname/inc/hook_preferences.inc.php instead of |
---|
431 | appname/inc/hook_admin.inc.php. The same functions and |
---|
432 | variables are defined.</p> |
---|
433 | |
---|
434 | <h2><a name="tth_sEc4">4</a> Infrastructure</h2> |
---|
435 | |
---|
436 | <h3><a name="tth_sEc4.1">4.1</a> Overview</h3> |
---|
437 | |
---|
438 | <p>eGroupWare attempts to provide developers with a sound |
---|
439 | directory structure to work from.<br> |
---|
440 | The directory layout may seem complex at first, but after some |
---|
441 | use, you will see that it is designed to accommodate a large |
---|
442 | number of applications and functions.</p> |
---|
443 | |
---|
444 | <h3><a name="tth_sEc4.2">4.2</a> Directory tree</h3> |
---|
445 | <pre> |
---|
446 | --eGroupWare |
---|
447 | | |
---|
448 | +--admin |
---|
449 | | |
---|
450 | +--docs (installation docs) |
---|
451 | | |
---|
452 | +--files (<b>Note:</b> must be out of webserver document root!) |
---|
453 | | | |
---|
454 | | +--groups |
---|
455 | | | |
---|
456 | | +--homes |
---|
457 | | | |
---|
458 | | +--users |
---|
459 | | |
---|
460 | +--phpgwapi |
---|
461 | | | |
---|
462 | | +--cron (eGroupWare's optional daemons) |
---|
463 | | | |
---|
464 | | +--doc (developers docs) |
---|
465 | | | |
---|
466 | | +--inc |
---|
467 | | | | |
---|
468 | | | +--class.phpgw.inc.php |
---|
469 | | | | |
---|
470 | | | +--phpgw_info.inc.php |
---|
471 | | | | |
---|
472 | | | +--class.common.inc.php |
---|
473 | | | | |
---|
474 | | | +--etc.. |
---|
475 | | | |
---|
476 | | +--js (javascript) |
---|
477 | | | | |
---|
478 | | | +--base |
---|
479 | | | | |
---|
480 | | | +--js_package_name |
---|
481 | | | |
---|
482 | | +--manual |
---|
483 | | | |
---|
484 | | +--setup |
---|
485 | | | | |
---|
486 | | | +--baseline.inc.php |
---|
487 | | | | |
---|
488 | | | +--default_records.inc.php |
---|
489 | | | | |
---|
490 | | | +--tables_current.inc.php |
---|
491 | | | | |
---|
492 | | | +--tables_update.inc.php |
---|
493 | | | |
---|
494 | | +--templates |
---|
495 | | | | |
---|
496 | | | +--default |
---|
497 | | | | | |
---|
498 | | | | +--images |
---|
499 | | | | |
---|
500 | | | +--verilak |
---|
501 | | | | |
---|
502 | | | +--images |
---|
503 | | | |
---|
504 | | +--themes |
---|
505 | | | |
---|
506 | | +--default.theme |
---|
507 | | |
---|
508 | +--preferences |
---|
509 | | |
---|
510 | +--setup |
---|
511 | </pre> |
---|
512 | |
---|
513 | <h3><a name="tth_sEc4.3">4.3</a> Translations</h3> |
---|
514 | |
---|
515 | <p>The translations are now being done thru the database, and |
---|
516 | may be configurable to use other mechanisms in future |
---|
517 | releases.</p> |
---|
518 | |
---|
519 | <p>You can use the developer_tools translations application for |
---|
520 | creating the "lang files", which will be installed through the |
---|
521 | setup application. Alternatively you can edit the files |
---|
522 | manually. The file naming convention for the lang files is |
---|
523 | <tt>phpgw_<langcode>.lang</tt>. The files are stored in |
---|
524 | the <tt>app/setup</tt> directory. The format of the files is as |
---|
525 | follows:</p> |
---|
526 | <pre> |
---|
527 | english phrase in lower case appname ** Translated phrase in desired case. |
---|
528 | </pre> |
---|
529 | <b>Notes:</b> |
---|
530 | |
---|
531 | <ul> |
---|
532 | <li>replace ** with the desired language code, as used in the |
---|
533 | filename</li> |
---|
534 | |
---|
535 | <li>tabs are used to deliniate "columns"</li> |
---|
536 | </ul> |
---|
537 | |
---|
538 | <h2><a name="tth_sEc5">5</a> The API</h2> |
---|
539 | |
---|
540 | <h3><a name="tth_sEc5.1">5.1</a> Introduction</h3> |
---|
541 | |
---|
542 | <p>eGroupWare attempts to provide developers with a useful API |
---|
543 | to handle common tasks.</p> |
---|
544 | |
---|
545 | <p>To do this we have created a multi-dimensional class |
---|
546 | $GLOBALS['phpgw']->.</p> |
---|
547 | |
---|
548 | <p>This allows for terrific code organization, and help |
---|
549 | developers easily identify the file that the function is in. |
---|
550 | All the files that are part of this class are in the inc/core |
---|
551 | directory and are named to match the sub-class.</p> |
---|
552 | |
---|
553 | <p>Example: $phpgw->send->msg() is in the |
---|
554 | inc/phpgwapi/class.send.inc.php file.</p> |
---|
555 | |
---|
556 | <h3><a name="tth_sEc5.2">5.2</a> Basic |
---|
557 | functions</h3> |
---|
558 | |
---|
559 | <h4>$GLOBALS['phpgw']->link</h4> |
---|
560 | |
---|
561 | <p>$GLOBALS['phpgw']->link($url, $args)<br> |
---|
562 | Add support for session management. ALL links must use this, |
---|
563 | that includes href's form actions and header location's.</p> |
---|
564 | |
---|
565 | <p>If you are just doing a form action back to the same page, |
---|
566 | you can use it without any parameters.</p> |
---|
567 | |
---|
568 | <p>This function is right at the core of the class because it |
---|
569 | is used so often, we wanted to save developers a few |
---|
570 | keystrokes. Example:</p> |
---|
571 | <pre> |
---|
572 | <form name=copy method=post action="<?php echo $GLOBALS['phpgw']->link();?>"> |
---|
573 | /* If session management is done via passing url parameters */ |
---|
574 | /* The the result would be */ |
---|
575 | /* <form name=copy method=post action="somepage.php?sessionid=87687693276?kp3=kjh98u80"> */ |
---|
576 | </pre> |
---|
577 | |
---|
578 | <h3><a name="tth_sEc5.3">5.3</a> Application |
---|
579 | Functions</h3> |
---|
580 | |
---|
581 | <h4>$GLOBALS['phpgw']->common->phpgw_header</h4> |
---|
582 | |
---|
583 | <p>$GLOBALS['phpgw']->phpgw_header()<br> |
---|
584 | Print out the start of the HTML page, including the navigation |
---|
585 | bar and includes appname/inc/header.php, if using deprecated |
---|
586 | linear scripts style.</p> |
---|
587 | |
---|
588 | <h4>$GLOBALS['phpgw']->common->phpgw_footer</h4> |
---|
589 | |
---|
590 | <p>$GLOBALS['phpgw']->phpgw_footer()<br> |
---|
591 | Prints the system footer, and includes |
---|
592 | appname/inc/footer.php</p> |
---|
593 | |
---|
594 | <h4>$GLOBALS['phpgw']->common->appsession</h4> |
---|
595 | |
---|
596 | <p>$GLOBALS['phpgw']->common->appsession($data)<br> |
---|
597 | Store important information session information that your |
---|
598 | application needs.<br> |
---|
599 | $GLOBALS['phpgw']->appsession will return the value of your |
---|
600 | session data is you leave the parameter empty [i.e. |
---|
601 | $GLOBALS['phpgw']->appsession()], otherwise it will store |
---|
602 | whatever data you send to it.<br> |
---|
603 | You can also store a comma delimited string and use explode() |
---|
604 | to turn it back into an array when you receive the value |
---|
605 | back.</p> |
---|
606 | |
---|
607 | <p>Example:</p> |
---|
608 | <pre> |
---|
609 | $GLOBALS['phpgw']->common->appsession("/path/to/something"); |
---|
610 | echo "Dir: " . $GLOBALS['phpgw']->common->appsession(); |
---|
611 | </pre> |
---|
612 | |
---|
613 | <h3><a name="tth_sEc5.4">5.4</a> File functions</h3> |
---|
614 | |
---|
615 | <p>See <a href="vfs/vfs.html">Virtual File System (VFS) |
---|
616 | Developers Guide</a> for more info.</p> |
---|
617 | |
---|
618 | <h3><a name="tth_sEc5.5">5.5</a> Email/NNTP |
---|
619 | Functions</h3> |
---|
620 | |
---|
621 | <h4>$phpgw->send->msg</h4> |
---|
622 | |
---|
623 | <p>$phpgw->msg->send($service, $to, $subject, $body, |
---|
624 | $msgtype, $cc, $bcc)<br> |
---|
625 | Send a message via email or NNTP and returns any error |
---|
626 | codes.<br> |
---|
627 | Example:</p> |
---|
628 | <pre> |
---|
629 | $to = 'someuser@domain.com'; |
---|
630 | $subject = 'Hello buddy'; |
---|
631 | $body = "Give me a call\n Been wondering what your up to."; |
---|
632 | $errors = $GLOBALS['phpgw']->msg->send('email', $to, $subject, $body); |
---|
633 | |
---|
634 | |
---|
635 | </pre> |
---|
636 | |
---|
637 | <h2><a name="tth_sEc6">6</a> Configuration |
---|
638 | Variables</h2> |
---|
639 | |
---|
640 | <h3><a name="tth_sEc6.1">6.1</a> Introduction</h3> |
---|
641 | |
---|
642 | <p>eGroupWare attempts to provide developers with as much |
---|
643 | information about the user, group, server, and application |
---|
644 | configuration as possible.</p> |
---|
645 | |
---|
646 | <p>To do this we provide a multi-dimensional array called |
---|
647 | "$GLOBALS['phpgw_info']", which includes all the information |
---|
648 | about your environment.</p> |
---|
649 | |
---|
650 | <p>Due to the multi-dimensional array approach. getting these |
---|
651 | values is easy.</p> |
---|
652 | |
---|
653 | <p>Here are some examples:</p> |
---|
654 | <pre> |
---|
655 | <?php |
---|
656 | // To do a hello username |
---|
657 | echo "Hello " . $GLOBALS['phpgw_info']['user']['fullname']; |
---|
658 | //If username first name is John and last name is Doe, prints: 'Hello John Doe' |
---|
659 | ?> |
---|
660 | <?php |
---|
661 | // To find out the location of the imap server |
---|
662 | echo 'IMAP Server is named: ' . $GLOBALS['phpgw_info']['server']['imap_server']; |
---|
663 | //If imap is running on localhost, prints: 'IMAP Server is named: localhost' |
---|
664 | ?> |
---|
665 | |
---|
666 | |
---|
667 | |
---|
668 | </pre> |
---|
669 | |
---|
670 | <h3><a name="tth_sEc6.2">6.2</a> User |
---|
671 | information</h3> |
---|
672 | <tt><font size="-1">$GLOBALS['phpgw_info']['user']['userid'] = |
---|
673 | The user ID.<br> |
---|
674 | $GLOBALS['phpgw_info']['user']['sessionid'] = The session |
---|
675 | ID<br> |
---|
676 | $GLOBALS['phpgw_info']['user']['theme'] = Selected theme<br> |
---|
677 | $GLOBALS['phpgw_info']['user']['private_dir'] = Users private |
---|
678 | dir. Use eGroupWare core functions for access to the files.<br> |
---|
679 | $GLOBALS['phpgw_info']['user']['firstname'] = Users first |
---|
680 | name<br> |
---|
681 | $GLOBALS['phpgw_info']['user']['lastname'] = Users last |
---|
682 | name<br> |
---|
683 | $GLOBALS['phpgw_info']['user']['fullname'] = Users Full |
---|
684 | Name<br> |
---|
685 | $GLOBALS['phpgw_info']['user']['groups'] = Groups the user is |
---|
686 | a member of<br> |
---|
687 | $GLOBALS['phpgw_info']['user']['app_perms'] = If the user has |
---|
688 | access to the current application<br> |
---|
689 | $GLOBALS['phpgw_info']['user']['lastlogin'] = Last time the |
---|
690 | user logged in.<br> |
---|
691 | $GLOBALS['phpgw_info']['user']['lastloginfrom'] = Where they |
---|
692 | logged in from the last time.<br> |
---|
693 | $GLOBALS['phpgw_info']['user']['lastpasswd_change'] = Last time |
---|
694 | they changed their password.<br> |
---|
695 | $GLOBALS['phpgw_info']['user']['passwd'] = Hashed password.<br> |
---|
696 | $GLOBALS['phpgw_info']['user']['status'] = If the user is |
---|
697 | enabled.<br> |
---|
698 | $GLOBALS['phpgw_info']['user']['logintime'] = Time they logged |
---|
699 | into their current session.<br> |
---|
700 | $GLOBALS['phpgw_info']['user']['session_dla'] = Last time they |
---|
701 | did anything in their current session<br> |
---|
702 | $GLOBALS['phpgw_info']['user']['session_ip'] = Current IP |
---|
703 | address<br> |
---|
704 | </font></tt> |
---|
705 | |
---|
706 | <h3><tt><a name="tth_sEc6.3">6.3</a> Group |
---|
707 | information</tt></h3> |
---|
708 | <tt><font size= |
---|
709 | "-1">$GLOBALS['phpgw_info']['group']['group_names'] = List of |
---|
710 | groups.</font></tt> |
---|
711 | |
---|
712 | <h3><a name="tth_sEc6.4">6.4</a> Server |
---|
713 | information</h3> |
---|
714 | <tt><font size="-1">$phpgw_info[``server''][``server_root''] = |
---|
715 | Main installation directory |
---|
716 | $phpgw_info[``server''][``include_root''] = Location of the |
---|
717 | 'inc' directory. $phpgw_info[``server''][``temp_dir''] = |
---|
718 | Directory that can be used for temporarily storing files |
---|
719 | $phpgw_info[``server''][``files_dir''] = Directory er and group |
---|
720 | files are stored |
---|
721 | $phpgw_info[``server''][``common_include_dir''] = Location of |
---|
722 | the core/shared include files. |
---|
723 | $phpgw_info[``server''][``template_dir''] = Active template |
---|
724 | files directory. This is defaulted by the server, and |
---|
725 | changeable by the user. |
---|
726 | $phpgw_info[``server''][``dir_separator''] = Allows |
---|
727 | compatibility with WindowsNT directory format |
---|
728 | $phpgw_info[``server''][``encrpytkey''] = Key used for |
---|
729 | encryption functions $phpgw_info[``server''][``site_title''] = |
---|
730 | Site Title will show in the title bar of each webpage. |
---|
731 | $phpgw_info[``server''][``webserver_url''] = URL to eGroupWare |
---|
732 | installation. $phpgw_info[``server''][``hostname''] = Name of |
---|
733 | the server eGroupWare is installed upon. |
---|
734 | $phpgw_info[``server''][``charset''] = default charset, |
---|
735 | default:iso-8859-1 $phpgw_info[``server''][``version''] = |
---|
736 | eGroupWare version.</font></tt> |
---|
737 | |
---|
738 | <h3><tt><font size="-1"><a name= |
---|
739 | "tth_sEc6.5">6.5</a> Database |
---|
740 | information</font></tt></h3> |
---|
741 | |
---|
742 | <p>It is unlikely you will need these, because |
---|
743 | $GLOBALS['phpgw']->db will already be loaded as a database |
---|
744 | for you to use.</p> |
---|
745 | <tt><font size="-1">$phpgw_info[``server''][``db_host''] = |
---|
746 | Address of the database server. Usually this is set to |
---|
747 | localhost. $phpgw_info[``server''][``db_name''] = Database |
---|
748 | name. $phpgw_info[``server''][``db_user''] = User name. |
---|
749 | $phpgw_info[``server''][``db_pass''] = Password |
---|
750 | $phpgw_info[``server''][``db_type''] = Type of database. |
---|
751 | Currently MySQL and PostgreSQL are supported.</font></tt> |
---|
752 | |
---|
753 | <h3><a name="tth_sEc6.6">6.6</a> Mail |
---|
754 | information</h3> |
---|
755 | |
---|
756 | <p>It is unlikely you will need these, because most email needs |
---|
757 | are services thru core eGroupWare functions.</p> |
---|
758 | |
---|
759 | <p><tt><font size="-1">$phpgw_info[``server''][``mail_server''] |
---|
760 | = Address of the IMAP server. Usually this is set to |
---|
761 | localhost.</font></tt></p> |
---|
762 | |
---|
763 | <p><tt><font size= |
---|
764 | "-1">$phpgw_info[``server''][``mail_server_type''] = IMAP or |
---|
765 | POP3</font></tt></p> |
---|
766 | |
---|
767 | <p><tt><font size= |
---|
768 | "-1">$phpgw_info[``server''][``imap_server_type''] = Cyrus or |
---|
769 | Uwash</font></tt></p> |
---|
770 | |
---|
771 | <p><tt><font size="-1">$phpgw_info[``server''][``imap_port''] = |
---|
772 | This is usually 143, and should only be changed if there is a |
---|
773 | good reason.</font></tt></p> |
---|
774 | |
---|
775 | <p><tt><font size="-1">$phpgw_info[``server''][``mail_suffix] = |
---|
776 | This is the domain name, used to add to email |
---|
777 | address</font></tt></p> |
---|
778 | |
---|
779 | <p><tt><font size= |
---|
780 | "-1">$phpgw_info[``server''][``mail_login_type''] = This adds |
---|
781 | support for VMailMgr. Generally this should be set to |
---|
782 | 'standard'.</font></tt></p> |
---|
783 | |
---|
784 | <p><tt><font size="-1">$phpgw_info[``server''][``smtp_server''] |
---|
785 | = Address of the SMTP server. Usually this is set to |
---|
786 | localhost.</font></tt></p> |
---|
787 | |
---|
788 | <p><tt><font size="-1">$phpgw_info[``server''][``smtp_port''] = |
---|
789 | This is usually 25, and should only be changed if there is a |
---|
790 | good reason</font></tt></p> |
---|
791 | |
---|
792 | <h3><a name="tth_sEc6.7">6.7</a> NNTP |
---|
793 | information</h3> |
---|
794 | |
---|
795 | <p><tt><font size="-1">$phpgw_info[``server''][``nntp_server''] |
---|
796 | = Address of the NNTP server.</font></tt></p> |
---|
797 | |
---|
798 | <p><tt><font size="-1">$phpgw_info[``server''][``nntp_port''] = |
---|
799 | This is usually XX, and should only be changed if there is a |
---|
800 | good reason.</font></tt></p> |
---|
801 | |
---|
802 | <p><tt><font size="-1">$phpgw_info[``server''][``nntp_sender''] |
---|
803 | = Unknown</font></tt></p> |
---|
804 | |
---|
805 | <p><tt><font size= |
---|
806 | "-1">$phpgw_info[``server''][``nntp_organization''] = |
---|
807 | Unknown</font></tt></p> |
---|
808 | |
---|
809 | <p><tt><font size="-1">$phpgw_info[``server''][``nntp_admin''] |
---|
810 | = Unknown</font></tt></p> |
---|
811 | |
---|
812 | <h3><a name="tth_sEc6.8">6.8</a> Application |
---|
813 | information</h3> |
---|
814 | |
---|
815 | <p>Each application has the following information |
---|
816 | available.</p> |
---|
817 | |
---|
818 | <p><tt><font size= |
---|
819 | "-1">$phpgw_info[``apps''][``appname''][``title''] = The title |
---|
820 | of the application.</font></tt></p> |
---|
821 | |
---|
822 | <p><tt><font size= |
---|
823 | "-1">$phpgw_info[``apps''][``appname''][``enabled''] = If the |
---|
824 | application is enabled. True or False.</font></tt></p> |
---|
825 | |
---|
826 | <p><tt><font size= |
---|
827 | "-1">$phpgw_info[``server''][``app_include_dir''] = Location of |
---|
828 | the current application include files.</font></tt></p> |
---|
829 | |
---|
830 | <p><tt><font size= |
---|
831 | "-1">$phpgw_info[``server''][``app_template_dir''] = Location |
---|
832 | of the current application tpl files.</font></tt></p> |
---|
833 | |
---|
834 | <p><tt><font size= |
---|
835 | "-1">$phpgw_info[``server''][``app_lang_dir''] = Location of |
---|
836 | the current lang directory.</font></tt></p> |
---|
837 | |
---|
838 | <p><tt><font size="-1">$phpgw_info[``server''][``app_auth''] = |
---|
839 | If the server and current user have access to current |
---|
840 | application</font></tt></p> |
---|
841 | |
---|
842 | <p><tt><font size="-1">$phpgw_info[``server''][``app_current''] |
---|
843 | = name of the current application.</font></tt></p> |
---|
844 | |
---|
845 | <h2><a name="tth_sEc7">7</a> Using Language |
---|
846 | Support</h2> |
---|
847 | |
---|
848 | <h3><a name="tth_sEc7.1">7.1</a> Overview</h3> |
---|
849 | |
---|
850 | <p>eGroupWare is built using a multi-language support scheme. |
---|
851 | This means the pages can be translated to other languages very |
---|
852 | easily. Translations of text strings are stored in the |
---|
853 | eGroupWare database, and can be modified by the eGroupWare |
---|
854 | administrator.</p> |
---|
855 | |
---|
856 | <h3><a name="tth_sEc7.2">7.2</a> How to use lang |
---|
857 | support</h3> |
---|
858 | |
---|
859 | <p>The lang() function is your application's interface to |
---|
860 | eGroupWare's internationalization support.</p> |
---|
861 | |
---|
862 | <p>While developing your application, just wrap all your text |
---|
863 | output with calls to lang(), as in the following code:</p> |
---|
864 | <pre> |
---|
865 | $x = 42; |
---|
866 | echo lang("The counter is %1",$x)."<br>"; |
---|
867 | </pre> |
---|
868 | This will attempt to translate ``The counter is %1'', and |
---|
869 | return a translated version based on the current application |
---|
870 | and language in use. Note how the position that $x will end up |
---|
871 | is controlled by the format string, <b>not</b> by building up |
---|
872 | the string in your code. This allows your application to be |
---|
873 | translated to languages where the actual number is not placed |
---|
874 | at the end of the string. |
---|
875 | |
---|
876 | <p>When a translation is not found, the original text will be |
---|
877 | returned with a * after the string. This makes it easy to |
---|
878 | develop your application, then go back and add missing |
---|
879 | translations (identified by the *) later.</p> |
---|
880 | |
---|
881 | <p>Without a specific translation in the lang table, the above |
---|
882 | code will print:</p> |
---|
883 | <pre> |
---|
884 | The counter is 42*<br> |
---|
885 | </pre> |
---|
886 | If the current user speaks Italian, they string returned may |
---|
887 | instead be: |
---|
888 | <pre> |
---|
889 | il contatore è 42<br&#gt; |
---|
890 | </pre> |
---|
891 | |
---|
892 | <h4>The lang function</h4> |
---|
893 | <pre> |
---|
894 | lang($key, $m1="", $m2="", $m3="", $m4="", $m5="", |
---|
895 | $m6="", $m7="", $m8="", $m9="", $m10="") |
---|
896 | |
---|
897 | </pre> |
---|
898 | |
---|
899 | <dl compact="compact"> |
---|
900 | <dd> |
---|
901 | [$key ] |
---|
902 | |
---|
903 | <p>is the string to translate and may contain replacement |
---|
904 | directives of the form %n.<br> |
---|
905 | </p> |
---|
906 | </dd> |
---|
907 | |
---|
908 | <dd> |
---|
909 | [$m1 ] |
---|
910 | |
---|
911 | <p>is the first replacement value or may be an array of |
---|
912 | replacement values (in which case $m2 and above are |
---|
913 | ignored).</p> |
---|
914 | </dd> |
---|
915 | |
---|
916 | <dd> |
---|
917 | [$m2 - $m10 ] |
---|
918 | |
---|
919 | <p>the 2nd through 10th replacement values if $m1 is not an |
---|
920 | array.</p> |
---|
921 | </dd> |
---|
922 | </dl> |
---|
923 | The database is searched for rows with a lang.message_id that |
---|
924 | matches $key. If a translation is not found, the original $key |
---|
925 | is used. The translation engine then replaces all tokens of the |
---|
926 | form %N with the Nth parameter (either $m1[N] or $mN). |
---|
927 | |
---|
928 | <h4>Adding translation data</h4> |
---|
929 | |
---|
930 | <p>The <b>TranslationTools</b> (former developer_tools) allow easily create new translations of eGW applications.<br /> |
---|
931 | A developer also can use them to create the english lang-file by searching for new phrases in his sources.</p> |
---|
932 | |
---|
933 | <h4>The lang table</h4> |
---|
934 | |
---|
935 | <p>The translation class uses the lang table for all |
---|
936 | translations. We are concerned with 4 of the columns to create |
---|
937 | a translation:</p> |
---|
938 | |
---|
939 | <dl compact="compact"> |
---|
940 | <dd> |
---|
941 | [message_id ] |
---|
942 | |
---|
943 | <p>The key to identify the message (the $key passed to the |
---|
944 | lang() function). This is written in English.</p> |
---|
945 | </dd> |
---|
946 | |
---|
947 | <dd> |
---|
948 | [app_name ] |
---|
949 | |
---|
950 | <p>The application the translation applies to, or common if |
---|
951 | it is common across multiple applications.</p> |
---|
952 | </dd> |
---|
953 | |
---|
954 | <dd> |
---|
955 | [lang ] |
---|
956 | |
---|
957 | <p>The code for the language the translation is in.</p> |
---|
958 | </dd> |
---|
959 | |
---|
960 | <dd> |
---|
961 | [content ] |
---|
962 | |
---|
963 | <p>The translated string.</p> |
---|
964 | </dd> |
---|
965 | </dl> |
---|
966 | |
---|
967 | translating the content to reflect the message_id string in the |
---|
968 | lang language. If the string is specific to your application, |
---|
969 | put your application name in for app_name otherwise use the |
---|
970 | name common. The message_id should be in lower case for a small |
---|
971 | increase in speed. |
---|
972 | |
---|
973 | <h3><a name="tth_sEc7.3">7.3</a> Common return |
---|
974 | codes</h3> |
---|
975 | |
---|
976 | <p>If you browse through the eGroupWare sources, you may notice |
---|
977 | a pattern to the return codes used in the higher-level |
---|
978 | functions. The codes used are partially documented in the |
---|
979 | doc/developers/CODES file.</p> |
---|
980 | |
---|
981 | <p>Codes are used as a simple way to communicate common error |
---|
982 | and progress conditions back to the user. They are mapped to a |
---|
983 | text string through the check_code() function, which passes the |
---|
984 | strings through lang() before returning.</p> |
---|
985 | |
---|
986 | <p>For example, calling</p> |
---|
987 | <pre> |
---|
988 | echo check_code(13); |
---|
989 | |
---|
990 | |
---|
991 | </pre> |
---|
992 | Would print |
---|
993 | <pre> |
---|
994 | Your message has been sent |
---|
995 | |
---|
996 | |
---|
997 | </pre> |
---|
998 | translated into the current language. |
---|
999 | |
---|
1000 | <h2><a name="tth_sEc8">8</a> Using Templates</h2> |
---|
1001 | |
---|
1002 | <h3><a name="tth_sEc8.1">8.1</a> Overview</h3> |
---|
1003 | |
---|
1004 | <p>eGroupWare is built using a templates based design. This |
---|
1005 | means the display pages, stored in tpl files, can be translated |
---|
1006 | to other languages, made to look completely different.</p> |
---|
1007 | |
---|
1008 | <h3><a name="tth_sEc8.2">8.2</a> How to use PHPLIB |
---|
1009 | templates</h3> |
---|
1010 | |
---|
1011 | <p>For Further info read the PHPLIBs documentation for their |
---|
1012 | template class. <a href= |
---|
1013 | "http://phplib.sanisoft.com"><tt>http://phplib.sanisoft.com</tt></a></p> |
---|
1014 | |
---|
1015 | <h3><a name="tth_sEc8.3">8.3</a> How to use |
---|
1016 | eTemplate templates</h3> |
---|
1017 | |
---|
1018 | <p><b>eTemplate</b> is a new widget-based template system, |
---|
1019 | which is used eg. for the InfoLog application.<br /> |
---|
1020 | There's a <a href="../../etemplate/doc/etemplate.html">Tutorial</a> |
---|
1021 | and a <a href="../../etemplate/doc/referenz.html">Referenz |
---|
1022 | documentation</a> availible.</p> |
---|
1023 | |
---|
1024 | <h2><a name="tth_sEc9">9</a> About this |
---|
1025 | document</h2> |
---|
1026 | |
---|
1027 | <h3><a name="tth_sEc9.1">9.1</a> New versions</h3> |
---|
1028 | |
---|
1029 | <p>The newest version of this document can be found on our |
---|
1030 | website <a href= |
---|
1031 | "http://www.eGroupWare.org/egroupware/phpgwapi/doc/"><tt>http://www.eGroupWare.org</tt></a>.</p> |
---|
1032 | |
---|
1033 | <h3><a name="tth_sEc9.2">9.2</a> Comments</h3> |
---|
1034 | |
---|
1035 | <p>Comments on this HOWTO should be directed to the <a href= |
---|
1036 | "mailto:eGroupWare-developers%20-AT-%20lists.sourceforge.net">eGroupWare |
---|
1037 | developers mailing list</a> (subscription at <a href= |
---|
1038 | "http://www.sourceforge.net/egroupware/">www.sourceforge.net/egroupware/</a>).</p> |
---|
1039 | |
---|
1040 | <h3><a name="tth_sEc9.3">9.3</a> History</h3> |
---|
1041 | |
---|
1042 | <p>This document was written by Dan Kuykendall.</p> |
---|
1043 | |
---|
1044 | <p>2000-09-25 documentation on lang(), codes, administration |
---|
1045 | and preferences extension added by Steve Brown.</p> |
---|
1046 | |
---|
1047 | <p>2001-01-08 fixed directory structure, minor layout changes, |
---|
1048 | imported to lyx source - Darryl VanDorp</p> |
---|
1049 | |
---|
1050 | <p>2001-01-08 fixed directory structure, minor layout changes, |
---|
1051 | imported to lyx source - Darryl VanDorp</p> |
---|
1052 | |
---|
1053 | <p>2004-02-22 imported skwashd's changes and adapted for |
---|
1054 | eGroupWare - Ralf Becker</p> |
---|
1055 | |
---|
1056 | <h3><a name="tth_sEc9.4">9.4</a> Copyrights and |
---|
1057 | Trademarks</h3> |
---|
1058 | |
---|
1059 | <p>Copyright © Free Software Foundarion. Permission is |
---|
1060 | granted to copy, distribute and/or modify this document under |
---|
1061 | the terms of the GNU Free Documentation License, Version 1.1 or |
---|
1062 | any later version published by the Free Software |
---|
1063 | Foundation.</p> |
---|
1064 | |
---|
1065 | <p>A copy of the license is available at <a href= |
---|
1066 | "http://www.gnu.org/copyleft/gpl.html"><tt>http://www.gnu.org/copyleft/gpl.html</tt></a></p> |
---|
1067 | |
---|
1068 | <h3><a name="tth_sEc9.5">9.5</a> Acknowledgments and |
---|
1069 | Thanks</h3> |
---|
1070 | |
---|
1071 | <p>Thanks to Joesph Engo for starting eGroupWare (at the time |
---|
1072 | called webdistro). Thanks to all the developers and users who |
---|
1073 | contribute to making eGroupWare such a success.<br> |
---|
1074 | <br> |
---|
1075 | </p> |
---|
1076 | <hr> |
---|
1077 | |
---|
1078 | <p>$Id: index.html,v 1.5 2004/02/23 00:24:21 ralfbecker Exp |
---|
1079 | $</p> |
---|
1080 | </body> |
---|
1081 | </html> |
---|
1082 | |
---|