Revision 3adb0cb7
Von Moritz Bunkus vor fast 13 Jahren hinzugefügt
doc/html/ch04.html | ||
---|---|---|
1 | 1 |
<html><head> |
2 | 2 |
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> |
3 |
<title>Kapitel 4. Entwicklerdokumentation</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="Lx-Office: Installation, Konfiguration, Entwicklung"><link rel="up" href="index.html" title="Lx-Office: Installation, Konfiguration, Entwicklung"><link rel="prev" href="ch03s03.html" title="3.3. Excel-Vorlagen"><link rel="next" href="ch04s02.html" title="4.2. Entwicklung unter FastCGI"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Kapitel 4. Entwicklerdokumentation</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s03.html">Zur?ck</a> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="ch04s02.html">Weiter</a></td></tr></table><hr></div><div class="chapter" title="Kapitel 4. Entwicklerdokumentation"><div class="titlepage"><div><div><h2 class="title"><a name="d0e4243"></a>Kapitel 4. Entwicklerdokumentation</h2></div></div></div><div class="sect1" title="4.1. Globale Variablen"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="devel.globals"></a>4.1. Globale Variablen</h2></div></div></div><div class="sect2" title="4.1.1. Wie sehen globale Variablen in Perl aus?"><div class="titlepage"><div><div><h3 class="title"><a name="d0e4249"></a>4.1.1. Wie sehen globale Variablen in Perl aus?</h3></div></div></div><p>Globale Variablen liegen in einem speziellen namespace namens
|
|
3 |
<title>Kapitel 4. Entwicklerdokumentation</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="Lx-Office: Installation, Konfiguration, Entwicklung"><link rel="up" href="index.html" title="Lx-Office: Installation, Konfiguration, Entwicklung"><link rel="prev" href="ch03s03.html" title="3.3. Excel-Vorlagen"><link rel="next" href="ch04s02.html" title="4.2. Entwicklung unter FastCGI"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Kapitel 4. Entwicklerdokumentation</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s03.html">Zur?ck</a> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="ch04s02.html">Weiter</a></td></tr></table><hr></div><div class="chapter" title="Kapitel 4. Entwicklerdokumentation"><div class="titlepage"><div><div><h2 class="title"><a name="d0e4341"></a>Kapitel 4. Entwicklerdokumentation</h2></div></div></div><div class="sect1" title="4.1. Globale Variablen"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="devel.globals"></a>4.1. Globale Variablen</h2></div></div></div><div class="sect2" title="4.1.1. Wie sehen globale Variablen in Perl aus?"><div class="titlepage"><div><div><h3 class="title"><a name="d0e4347"></a>4.1.1. Wie sehen globale Variablen in Perl aus?</h3></div></div></div><p>Globale Variablen liegen in einem speziellen namespace namens
|
|
4 | 4 |
"main", der von ?berall erreichbar ist. Dar?ber hinaus sind bareword |
5 | 5 |
globs global und die meisten speziellen Variablen sind... |
6 | 6 |
speziell.</p><p>Daraus ergeben sich folgende Formen:</p><div class="variablelist"><dl><dt><span class="term"> |
... | ... | |
25 | 25 |
<code class="varname">$PACKAGE::form</code>.</p></dd><dt><span class="term"> |
26 | 26 |
<code class="literal">local $form</code> |
27 | 27 |
</span></dt><dd><p>Alle ?nderungen an <code class="varname">$form</code> werden am Ende |
28 |
des scopes zur?ckgesetzt</p></dd></dl></div></div><div class="sect2" title="4.1.2. Warum sind globale Variablen ein Problem?"><div class="titlepage"><div><div><h3 class="title"><a name="d0e4350"></a>4.1.2. Warum sind globale Variablen ein Problem?</h3></div></div></div><p>Das erste Problem ist <span class="productname">FCGI</span>™.</p><p>
|
|
28 |
des scopes zur?ckgesetzt</p></dd></dl></div></div><div class="sect2" title="4.1.2. Warum sind globale Variablen ein Problem?"><div class="titlepage"><div><div><h3 class="title"><a name="d0e4448"></a>4.1.2. Warum sind globale Variablen ein Problem?</h3></div></div></div><p>Das erste Problem ist <span class="productname">FCGI</span>™.</p><p>
|
|
29 | 29 |
<span class="productname">SQL-Ledger</span>™ hat fast alles im globalen |
30 | 30 |
namespace abgelegt, und erwartet, dass es da auch wiederzufinden ist. |
31 | 31 |
Unter <span class="productname">FCGI</span>™ m?ssen diese Sachen aber wieder |
... | ... | |
36 | 36 |
<code class="function">strict</code> werden alle Variablen die nicht explizit |
37 | 37 |
mit <code class="function">Package</code>, <code class="function">my</code> oder |
38 | 38 |
<code class="function">our</code> angegeben werden als Tippfehler angemarkert, |
39 |
dies hat, seit der Einf?hrung, u.a. schon so manche langwierige Bug-Suche verk?rzt. |
|
40 |
Da globale Variablen aber implizit mit Package angegeben werden, werden |
|
41 |
die nicht gepr?ft, und somit kann sich schnell ein Tippfehler einschleichen.</p></div><div class="sect2" title="4.1.3. Kanonische globale Variablen"><div class="titlepage"><div><div><h3 class="title"><a name="d0e4383"></a>4.1.3. Kanonische globale Variablen</h3></div></div></div><p>Um dieses Problem im Griff zu halten gibt es einige wenige |
|
42 |
globale Variablen, die kanonisch sind, d.h. sie haben bestimmte vorgegebenen Eigenschaften, |
|
43 |
und alles andere sollte anderweitig umhergereicht werden.</p><p>Diese Variablen sind im Moment die folgenden neun:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p> |
|
39 |
dies hat, seit der Einf?hrung, u.a. schon so manche langwierige |
|
40 |
Bug-Suche verk?rzt. Da globale Variablen aber implizit mit Package |
|
41 |
angegeben werden, werden die nicht gepr?ft, und somit kann sich |
|
42 |
schnell ein Tippfehler einschleichen.</p></div><div class="sect2" title="4.1.3. Kanonische globale Variablen"><div class="titlepage"><div><div><h3 class="title"><a name="d0e4481"></a>4.1.3. Kanonische globale Variablen</h3></div></div></div><p>Um dieses Problem im Griff zu halten gibt es einige wenige |
|
43 |
globale Variablen, die kanonisch sind, d.h. sie haben bestimmte |
|
44 |
vorgegebenen Eigenschaften, und alles andere sollte anderweitig |
|
45 |
umhergereicht werden.</p><p>Diese Variablen sind im Moment die folgenden neun:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p> |
|
44 | 46 |
<code class="varname">$::form</code> |
45 | 47 |
</p></li><li class="listitem"><p> |
46 | 48 |
<code class="varname">%::myconfig</code> |
... | ... | |
58 | 60 |
<code class="varname">$::dispatcher</code> |
59 | 61 |
</p></li><li class="listitem"><p> |
60 | 62 |
<code class="varname">$::request</code> |
61 |
</p></li></ul></div><p>Damit diese nicht erneut als M?llhalde missbraucht werden, im Folgenden |
|
62 |
eine kurze Erl?uterung der bestimmten vorgegebenen Eigenschaften (Konventionen):</p><div class="sect3" title="4.1.3.1. $::form"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4447"></a>4.1.3.1. $::form</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Ist ein Objekt der Klasse |
|
63 |
</p></li></ul></div><p>Damit diese nicht erneut als M?llhalde missbraucht werden, im |
|
64 |
Folgenden eine kurze Erl?uterung der bestimmten vorgegebenen |
|
65 |
Eigenschaften (Konventionen):</p><div class="sect3" title="4.1.3.1. $::form"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4545"></a>4.1.3.1. $::form</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Ist ein Objekt der Klasse |
|
63 | 66 |
"<code class="classname">Form</code>"</p></li><li class="listitem"><p>Wird nach jedem Request gel?scht</p></li><li class="listitem"><p>Muss auch in Tests und Konsolenscripts vorhanden |
64 | 67 |
sein.</p></li><li class="listitem"><p>Enth?lt am Anfang eines Requests die Requestparameter vom |
65 | 68 |
User</p></li><li class="listitem"><p>Kann zwar intern ?ber Requestgrenzen ein Datenbankhandle |
... | ... | |
68 | 71 |
Ledger</span>™ als Gottobjekt f?r alles misbraucht. S?mtliche |
69 | 72 |
alten Funktionen unter SL/ mutieren <code class="varname">$::form</code>, das |
70 | 73 |
hei?t, alles was einem lieb ist (alle Variablen die einem ans Herz |
71 |
gewachsen sind), sollte man vor einem Aufruf (!) von zum |
|
72 |
Beispiel <code class="function">IS->retrieve_customer()</code> in |
|
73 |
Sicherheit bringen. </p><p> |
|
74 |
Z.B. das vom Benutzer eingestellte Zahlenformat, bevor man Berechnung in einem |
|
75 |
bestimmten Format durchf?hrt (SL/Form.pm Zeile 3552, Stand version 2.7beta), um |
|
76 |
dies hinterher wieder auf den richtigen Wert zu setzen: |
|
77 |
</p><pre class="programlisting"> my $saved_numberformat = $::myconfig{numberformat}; |
|
74 |
gewachsen sind), sollte man vor einem Aufruf (!) von zum Beispiel |
|
75 |
<code class="function">IS->retrieve_customer()</code> in Sicherheit |
|
76 |
bringen.</p><p>Z.B. das vom Benutzer eingestellte Zahlenformat, bevor man |
|
77 |
Berechnung in einem bestimmten Format durchf?hrt (SL/Form.pm Zeile |
|
78 |
3552, Stand version 2.7beta), um dies hinterher wieder auf den |
|
79 |
richtigen Wert zu setzen:</p><pre class="programlisting"> my $saved_numberformat = $::myconfig{numberformat}; |
|
78 | 80 |
$::myconfig{numberformat} = $numberformat; |
79 | 81 |
# (...) div Berechnungen |
80 |
$::myconfig{numberformat} = $saved_numberformat;</pre><p> |
|
81 |
Das Objekt der Klasse Form hat leider im Moment noch viele zentrale Funktionen die vom internen Zustand abh?ngen, deshalb bitte |
|
82 |
nie einfach zerst?ren oder ?berschreiben (zumindestens nicht kurz vor einem Release oder in Absprache ?ber bspw. die devel-Liste |
|
83 |
;-). Es geht ziemlich sicher etwas kaputt. |
|
84 |
</p><p> |
|
85 |
|
|
86 |
<code class="varname">$::form</code> ist gleichzeitig der Standard Scope in den <span class="productname">Template::Toolkit</span>™ Templates |
|
87 |
au?erhalb der Controller: der Ausdruck <code class="function">[% var %]</code> greift auf <code class="varname">$::form->{var}</code> zu. Unter |
|
88 |
Controllern ist der Standard Scope anders, da lautet der Zugriff <code class="function">[% FORM.var %]</code>. In Druckvorlagen sind |
|
89 |
normale Variablen ebenfall im <code class="varname">$::form</code> Scope, d.h. <code class="function"><%var%></code> zeigt auf |
|
90 |
<code class="varname">$::form->{var}</code>. Nochmal von der anderen Seite erl?utert, innerhalb von (Web-)Templates sieht man h?ufiger |
|
91 |
solche Konstrukte: |
|
92 |
</p><pre class="programlisting">[%- IF business %] |
|
82 |
$::myconfig{numberformat} = $saved_numberformat;</pre><p>Das Objekt der Klasse Form hat leider im Moment noch viele |
|
83 |
zentrale Funktionen die vom internen Zustand abh?ngen, deshalb bitte |
|
84 |
nie einfach zerst?ren oder ?berschreiben (zumindestens nicht kurz |
|
85 |
vor einem Release oder in Absprache ?ber bspw. die devel-Liste ;-). |
|
86 |
Es geht ziemlich sicher etwas kaputt.</p><p> |
|
87 |
<code class="varname">$::form</code> ist gleichzeitig der Standard Scope |
|
88 |
in den <span class="productname">Template::Toolkit</span>™ Templates |
|
89 |
au?erhalb der Controller: der Ausdruck <code class="function">[% var |
|
90 |
%]</code> greift auf <code class="varname">$::form->{var}</code> zu. |
|
91 |
Unter Controllern ist der Standard Scope anders, da lautet der |
|
92 |
Zugriff <code class="function">[% FORM.var %]</code>. In Druckvorlagen sind |
|
93 |
normale Variablen ebenfall im <code class="varname">$::form</code> Scope, d.h. |
|
94 |
<code class="function"><%var%></code> zeigt auf |
|
95 |
<code class="varname">$::form->{var}</code>. Nochmal von der anderen Seite |
|
96 |
erl?utert, innerhalb von (Web-)Templates sieht man h?ufiger solche |
|
97 |
Konstrukte:</p><pre class="programlisting">[%- IF business %] |
|
93 | 98 |
# (... Zeig die Auswahlliste Kunden-/Lieferantentyp an) |
94 |
[%- END %]</pre><p> |
|
95 |
Entweder wird hier dann $::form->{business} ausgewertet oder aber der Funktion <code class="function">$form->parse_html_template</code> |
|
96 |
wird explizit noch ein zus?tzlicher Hash ?bergeben, der dann auch in den (Web-)Templates zu Verf?gung steht, bspw. so: |
|
97 |
</p><pre class="programlisting">$form->parse_html_template("is/form_header", \%TMPL_VAR);</pre><p> |
|
98 |
Innerhalb von Schleifen wird <code class="varname">$::form->{TEMPLATE_ARRAYS}{var}[$index]</code> bevorzugt, wenn vorhanden. Ein |
|
99 |
Beispiel findet sich in SL/DO.pm, welches ?ber alle Positionen eines Lieferscheins in Schleife l?uft: |
|
100 |
</p><pre class="programlisting">for $i (1 .. $form->{rowcount}) { |
|
99 |
[%- END %]</pre><p>Entweder wird hier dann $::form->{business} ausgewertet |
|
100 |
oder aber der Funktion |
|
101 |
<code class="function">$form->parse_html_template</code> wird explizit |
|
102 |
noch ein zus?tzlicher Hash ?bergeben, der dann auch in den |
|
103 |
(Web-)Templates zu Verf?gung steht, bspw. so:</p><pre class="programlisting">$form->parse_html_template("is/form_header", \%TMPL_VAR);</pre><p>Innerhalb von Schleifen wird |
|
104 |
<code class="varname">$::form->{TEMPLATE_ARRAYS}{var}[$index]</code> |
|
105 |
bevorzugt, wenn vorhanden. Ein Beispiel findet sich in SL/DO.pm, |
|
106 |
welches ?ber alle Positionen eines Lieferscheins in Schleife |
|
107 |
l?uft:</p><pre class="programlisting">for $i (1 .. $form->{rowcount}) { |
|
101 | 108 |
# ... |
102 | 109 |
push @{ $form->{TEMPLATE_ARRAYS}{runningnumber} }, $position; |
103 | 110 |
push @{ $form->{TEMPLATE_ARRAYS}{number} }, $form->{"partnumber_$i"}; |
104 | 111 |
push @{ $form->{TEMPLATE_ARRAYS}{description} }, $form->{"description_$i"}; |
105 | 112 |
# ... |
106 |
}</pre></div><div class="sect3" title="4.1.3.2. %::myconfig"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4531"></a>4.1.3.2. %::myconfig</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Das einzige Hash unter den globalen Variablen</p></li><li class="listitem"><p>Wird sp?testens ben?tigt wenn auf die Datenbank
|
|
113 |
}</pre></div><div class="sect3" title="4.1.3.2. %::myconfig"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4629"></a>4.1.3.2. %::myconfig</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Das einzige Hash unter den globalen Variablen</p></li><li class="listitem"><p>Wird sp?testens ben?tigt wenn auf die Datenbank
|
|
107 | 114 |
zugegriffen wird</p></li><li class="listitem"><p>Wird bei jedem Request neu erstellt.</p></li><li class="listitem"><p>Enth?lt die Userdaten des aktuellen Logins</p></li><li class="listitem"><p>Sollte nicht ohne Filterung irgendwo gedumpt werden oder |
108 | 115 |
extern serialisiert werden, weil da auch der Datenbankzugriff |
109 | 116 |
f?r diesen user drinsteht.</p></li><li class="listitem"><p>Enth?lt unter anderem Listenbegrenzung vclimit, |
110 | 117 |
Datumsformat dateformat und Nummernformat numberformat</p></li><li class="listitem"><p>Enth?lt Datenbankzugriffinformationen</p></li></ul></div><p> |
111 |
|
|
112 |
<code class="varname">%::myconfig</code> ist im Moment der Ersatz f?r ein Userobjekt. Die meisten Funktionen, die etwas anhand des |
|
113 |
aktuellen Users entscheiden m?ssen, befragen <code class="varname">%::myconfig</code>. Innerhalb der Anwendungen sind dies ?berwiegend die |
|
114 |
Daten, die sich unter <span class="guimenu">Programm</span> -> <span class="guimenuitem">Einstellungen</span> befinden, bzw. die Informationen |
|
115 |
?ber den Benutzer die ?ber die Administrator-Schnittstelle (admin.pl) eingegeben wurden. |
|
116 |
</p></div><div class="sect3" title="4.1.3.3. $::locale"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4570"></a>4.1.3.3. $::locale</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse "Locale"</p></li><li class="listitem"><p>Wird pro Request erstellt</p></li><li class="listitem"><p>Muss auch f?r Tests und Scripte immer verf?gbar |
|
118 |
<code class="varname">%::myconfig</code> ist im Moment der Ersatz f?r |
|
119 |
ein Userobjekt. Die meisten Funktionen, die etwas anhand des |
|
120 |
aktuellen Users entscheiden m?ssen, befragen |
|
121 |
<code class="varname">%::myconfig</code>. Innerhalb der Anwendungen sind dies |
|
122 |
?berwiegend die Daten, die sich unter <span class="guimenu">Programm</span> |
|
123 |
-> <span class="guimenuitem">Einstellungen</span> befinden, bzw. die |
|
124 |
Informationen ?ber den Benutzer die ?ber die |
|
125 |
Administrator-Schnittstelle (admin.pl) eingegeben wurden.</p></div><div class="sect3" title="4.1.3.3. $::locale"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4668"></a>4.1.3.3. $::locale</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse "Locale"</p></li><li class="listitem"><p>Wird pro Request erstellt</p></li><li class="listitem"><p>Muss auch f?r Tests und Scripte immer verf?gbar |
|
117 | 126 |
sein.</p></li><li class="listitem"><p>Cached intern ?ber Requestgrenzen hinweg benutzte |
118 | 127 |
Locales</p></li></ul></div><p>Lokalisierung f?r den aktuellen User. Alle ?bersetzungen, |
119 |
Zahlen- und Datumsformatierungen laufen ?ber dieses Objekt.</p></div><div class="sect3" title="4.1.3.4. $::lxdebug"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4588"></a>4.1.3.4. $::lxdebug</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse "LXDebug"</p></li><li class="listitem"><p>Wird global gecached</p></li><li class="listitem"><p>Muss immer verf?gbar sein, in nahezu allen
|
|
128 |
Zahlen- und Datumsformatierungen laufen ?ber dieses Objekt.</p></div><div class="sect3" title="4.1.3.4. $::lxdebug"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4686"></a>4.1.3.4. $::lxdebug</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse "LXDebug"</p></li><li class="listitem"><p>Wird global gecached</p></li><li class="listitem"><p>Muss immer verf?gbar sein, in nahezu allen
|
|
120 | 129 |
Funktionen</p></li></ul></div><p> |
121 |
|
|
122 |
<code class="varname">$::lxdebug</code> stellt Debuggingfunktionen bereit, wie "<code class="function">enter_sub</code>" und |
|
123 |
"<code class="function">leave_sub</code>", mit denen in den alten Modulen ein brauchbares Tracing gebaut ist, |
|
124 |
"<code class="function">log_time</code>", mit der man die Wallclockzeit seit Requeststart loggen kann, sowie |
|
125 |
"<code class="function">message</code>" und "<code class="function">dump</code>" mit denen man flott Informationen ins Log |
|
126 |
(tmp/lx-office-debug.log) packen kann. |
|
127 |
</p><p> |
|
128 |
Beispielsweise so: |
|
129 |
</p><pre class="programlisting">$main::lxdebug->message(0, 'Meine Konfig:' . Dumper (%::myconfig)); |
|
130 |
$main::lxdebug->message(0, 'Wer bin ich? Kunde oder Lieferant:' . $form->{vc});</pre></div><div class="sect3" title="4.1.3.5. $::auth"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4625"></a>4.1.3.5. $::auth</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse "SL::Auth"</p></li><li class="listitem"><p>Wird global gecached</p></li><li class="listitem"><p>Hat eine permanente DB Verbindung zur Authdatenbank</p></li><li class="listitem"><p>Wird nach jedem Request resettet.</p></li></ul></div><p> |
|
130 |
<code class="varname">$::lxdebug</code> stellt Debuggingfunktionen |
|
131 |
bereit, wie "<code class="function">enter_sub</code>" und |
|
132 |
"<code class="function">leave_sub</code>", mit denen in den alten Modulen ein |
|
133 |
brauchbares Tracing gebaut ist, "<code class="function">log_time</code>", mit |
|
134 |
der man die Wallclockzeit seit Requeststart loggen kann, sowie |
|
135 |
"<code class="function">message</code>" und "<code class="function">dump</code>" mit |
|
136 |
denen man flott Informationen ins Log (tmp/lx-office-debug.log) |
|
137 |
packen kann.</p><p>Beispielsweise so:</p><pre class="programlisting">$main::lxdebug->message(0, 'Meine Konfig:' . Dumper (%::myconfig)); |
|
138 |
$main::lxdebug->message(0, 'Wer bin ich? Kunde oder Lieferant:' . $form->{vc});</pre></div><div class="sect3" title="4.1.3.5. $::auth"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4723"></a>4.1.3.5. $::auth</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse "SL::Auth"</p></li><li class="listitem"><p>Wird global gecached</p></li><li class="listitem"><p>Hat eine permanente DB Verbindung zur Authdatenbank</p></li><li class="listitem"><p>Wird nach jedem Request resettet.</p></li></ul></div><p> |
|
131 | 139 |
<code class="varname">$::auth</code> stellt Funktionen bereit um die |
132 | 140 |
Rechte des aktuellen Users abzufragen. Obwohl diese Informationen |
133 | 141 |
vom aktuellen User abh?ngen wird das Objekt aus |
134 | 142 |
Geschwindigkeitsgr?nden nur einmal angelegt und dann nach jedem |
135 |
Request kurz resettet.</p></div><div class="sect3" title="4.1.3.6. $::lx_office_conf"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4646"></a>4.1.3.6. $::lx_office_conf</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse
|
|
143 |
Request kurz resettet.</p></div><div class="sect3" title="4.1.3.6. $::lx_office_conf"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4744"></a>4.1.3.6. $::lx_office_conf</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse
|
|
136 | 144 |
"<code class="classname">SL::LxOfficeConf</code>"</p></li><li class="listitem"><p>Global gecached</p></li><li class="listitem"><p>Repr?sentation der |
137 | 145 |
<code class="filename">config/lx_office.conf[.default]</code>-Dateien</p></li></ul></div><p>Globale Konfiguration. Configdateien werden zum Start gelesen |
138 |
und danach nicht mehr angefasst. Es ist derzeit nicht geplant, dass das |
|
139 |
Programm die Konfiguration ?ndern kann oder sollte.</p><p>Beispielsweise ist ?ber den Konfigurationseintrag [debug] |
|
140 |
die Debug- und Trace-Log-Datei wie folgt konfiguriert und verf?gbar:</p><pre class="programlisting">[debug] |
|
146 |
und danach nicht mehr angefasst. Es ist derzeit nicht geplant, dass |
|
147 |
das Programm die Konfiguration ?ndern kann oder sollte.</p><p>Beispielsweise ist ?ber den Konfigurationseintrag [debug] die |
|
148 |
Debug- und Trace-Log-Datei wie folgt konfiguriert und |
|
149 |
verf?gbar:</p><pre class="programlisting">[debug] |
|
141 | 150 |
file = /tmp/lx-office-debug.log</pre><p>ist der Key <code class="varname">file</code> im Programm als |
142 | 151 |
<code class="varname">$::lx_office_conf->{debug}{file}</code> |
143 | 152 |
erreichbar.</p><div class="warning" title="Warnung" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Warning"><tr><td rowspan="2" align="center" valign="top" width="25"><img alt="[Warnung]" src="../../../../system/docbook-xsl/images/warning.png"></td><th align="left">Warnung</th></tr><tr><td align="left" valign="top"><p>Zugriff auf die Konfiguration erfolgt im Moment ?ber |
144 |
Hashkeys, sind also nicht gegen Tippfehler abgesichert.</p></td></tr></table></div></div><div class="sect3" title="4.1.3.7. $::instance_conf"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4682"></a>4.1.3.7. $::instance_conf</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse
|
|
153 |
Hashkeys, sind also nicht gegen Tippfehler abgesichert.</p></td></tr></table></div></div><div class="sect3" title="4.1.3.7. $::instance_conf"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4780"></a>4.1.3.7. $::instance_conf</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse
|
|
145 | 154 |
"<code class="classname">SL::InstanceConfiguration</code>"</p></li><li class="listitem"><p>wird pro Request neu erstellt</p></li></ul></div><p>Funktioniert wie <code class="varname">$::lx_office_conf</code>, |
146 | 155 |
speichert aber Daten die von der Instanz abh?ngig sind. Eine Instanz |
147 |
ist hier eine Mandantendatenbank. |
|
148 |
Beispielsweise ?berpr?ft |
|
156 |
ist hier eine Mandantendatenbank. Beispielsweise ?berpr?ft |
|
149 | 157 |
</p><pre class="programlisting">$::instance_conf->get_inventory_system eq 'perpetual'</pre><p> |
150 |
ob die ber?chtigte Bestandsmethode zur Anwendung kommt.</p></div><div class="sect3" title="4.1.3.8. $::dispatcher"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4703"></a>4.1.3.8. $::dispatcher</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse
|
|
158 |
ob die ber?chtigte Bestandsmethode zur Anwendung kommt.</p></div><div class="sect3" title="4.1.3.8. $::dispatcher"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4801"></a>4.1.3.8. $::dispatcher</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse
|
|
151 | 159 |
"<code class="varname">SL::Dispatcher</code>"</p></li><li class="listitem"><p>wird pro Serverprozess erstellt.</p></li><li class="listitem"><p>enth?lt Informationen ?ber die technische Verbindung zum |
152 | 160 |
Server</p></li></ul></div><p>Der dritte Punkt ist auch der einzige Grund warum das Objekt |
153 | 161 |
global gespeichert wird. Wird vermutlich irgendwann in einem anderen |
154 |
Objekt untergebracht.</p></div><div class="sect3" title="4.1.3.9. $::request"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4721"></a>4.1.3.9. $::request</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Hashref (evtl sp?ter Objekt)</p></li><li class="listitem"><p>Wird pro Request neu initialisiert.</p></li><li class="listitem"><p>Keine Unterstruktur garantiert.</p></li></ul></div><p>
|
|
162 |
Objekt untergebracht.</p></div><div class="sect3" title="4.1.3.9. $::request"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4819"></a>4.1.3.9. $::request</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Hashref (evtl sp?ter Objekt)</p></li><li class="listitem"><p>Wird pro Request neu initialisiert.</p></li><li class="listitem"><p>Keine Unterstruktur garantiert.</p></li></ul></div><p>
|
|
155 | 163 |
<code class="varname">$::request</code> ist ein generischer Platz um |
156 | 164 |
Daten "f?r den aktuellen Request" abzulegen. Sollte nicht f?r action |
157 | 165 |
at a distance benutzt werden, sondern um lokales memoizing zu |
158 | 166 |
erm?glichen, das garantiert am Ende des Requests zerst?rt |
159 | 167 |
wird.</p><p>Vieles von dem, was im moment in <code class="varname">$::form</code> |
160 | 168 |
liegt, sollte eigentlich hier liegen. Die groben |
161 |
Differentialkriterien sind:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Kommt es vom User, und soll unver?ndert wieder an den User? Dann <code class="varname">$::form</code>, steht da eh schon</p></li><li class="listitem"><p>Sind es Daten aus der Datenbank, die nur bis zum Ende des Requests gebraucht werden? Dann |
|
169 |
Differentialkriterien sind:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Kommt es vom User, und soll unver?ndert wieder an den |
|
170 |
User? Dann <code class="varname">$::form</code>, steht da eh schon</p></li><li class="listitem"><p>Sind es Daten aus der Datenbank, die nur bis zum Ende des |
|
171 |
Requests gebraucht werden? Dann |
|
162 | 172 |
<code class="varname">$::request</code> |
163 |
</p></li><li class="listitem"><p>Muss ich von anderen Teilen des Programms lesend drauf zugreifen? Dann <code class="varname">$::request</code>, aber Zugriff ?ber |
|
164 |
Wrappermethode</p></li></ul></div></div></div><div class="sect2" title="4.1.4. Ehemalige globale Variablen"><div class="titlepage"><div><div><h3 class="title"><a name="d0e4763"></a>4.1.4. Ehemalige globale Variablen</h3></div></div></div><p>Die folgenden Variablen waren einmal im Programm, und wurden |
|
165 |
entfernt.</p><div class="sect3" title="4.1.4.1. $::cgi"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4768"></a>4.1.4.1. $::cgi</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>war n?tig, weil cookie Methoden nicht als |
|
173 |
</p></li><li class="listitem"><p>Muss ich von anderen Teilen des Programms lesend drauf |
|
174 |
zugreifen? Dann <code class="varname">$::request</code>, aber Zugriff ?ber |
|
175 |
Wrappermethode</p></li></ul></div></div></div><div class="sect2" title="4.1.4. Ehemalige globale Variablen"><div class="titlepage"><div><div><h3 class="title"><a name="d0e4861"></a>4.1.4. Ehemalige globale Variablen</h3></div></div></div><p>Die folgenden Variablen waren einmal im Programm, und wurden |
|
176 |
entfernt.</p><div class="sect3" title="4.1.4.1. $::cgi"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4866"></a>4.1.4.1. $::cgi</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>war n?tig, weil cookie Methoden nicht als |
|
166 | 177 |
Klassenfunktionen funktionieren</p></li><li class="listitem"><p>Aufruf als Klasse erzeugt Dummyobjekt was im |
167 | 178 |
Klassennamespace gehalten wird und ?ber Requestgrenzen |
168 | 179 |
leaked</p></li><li class="listitem"><p>liegt jetzt unter |
169 | 180 |
<code class="varname">$::request->{cgi}</code> |
170 |
</p></li></ul></div></div><div class="sect3" title="4.1.4.2. $::all_units"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4784"></a>4.1.4.2. $::all_units</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>war n?tig, weil einige Funktionen in Schleifen zum Teil
|
|
181 |
</p></li></ul></div></div><div class="sect3" title="4.1.4.2. $::all_units"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4882"></a>4.1.4.2. $::all_units</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>war n?tig, weil einige Funktionen in Schleifen zum Teil
|
|
171 | 182 |
ein paar hundert mal pro Request eine Liste der Einheiten |
172 | 183 |
brauchen, und de als Parameter durch einen Riesenstack von |
173 | 184 |
Funktionen geschleift werden m?ssten.</p></li><li class="listitem"><p>Liegt jetzt unter |
174 | 185 |
<code class="varname">$::request->{cache}{all_units}</code> |
175 | 186 |
</p></li><li class="listitem"><p>Wird nur in |
176 | 187 |
<code class="function">AM->retrieve_all_units()</code> gesetzt oder |
177 |
gelesen.</p></li></ul></div></div><div class="sect3" title="4.1.4.3. %::called_subs"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4803"></a>4.1.4.3. %::called_subs</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>wurde benutzt um callsub deep recursions
|
|
188 |
gelesen.</p></li></ul></div></div><div class="sect3" title="4.1.4.3. %::called_subs"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4901"></a>4.1.4.3. %::called_subs</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>wurde benutzt um callsub deep recursions
|
|
178 | 189 |
abzufangen.</p></li><li class="listitem"><p>Wurde entfernt, weil callsub nur einen Bruchteil der |
179 | 190 |
m?glichen Rekursioenen darstellt, und da nie welche |
180 | 191 |
auftreten.</p></li><li class="listitem"><p>komplette recursion protection wurde entfernt.</p></li></ul></div></div></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch03s03.html">Zur?ck</a> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="ch04s02.html">Weiter</a></td></tr><tr><td width="40%" align="left" valign="top">3.3. Excel-Vorlagen </td><td width="20%" align="center"><a accesskey="h" href="index.html">Zum Anfang</a></td><td width="40%" align="right" valign="top"> 4.2. Entwicklung unter FastCGI</td></tr></table></div></body></html> |
Auch abrufbar als: Unified diff
doc/skr04-update-3804 nach DocBook gewandelt