<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="http://unfoldingneurons.com/"
	>

<channel>
	<title>Guggat emol Blog &#187; Weight-Modell backen</title>
	<atom:link href="http://www.baldenhofer.eu/blog/tag/model/feed" rel="self" type="application/rss+xml" />
	<link>http://www.baldenhofer.eu/blog</link>
	<description>Roland bloggt über IT, Programmieren und Linux</description>
	<lastBuildDate>Tue, 25 Oct 2011 22:53:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Weight-Modell backen</title>
		<link>http://www.baldenhofer.eu/blog/it/weight-modell-backen</link>
		<comments>http://www.baldenhofer.eu/blog/it/weight-modell-backen#comments</comments>
		<pubDate>Tue, 25 Oct 2011 22:53:01 +0000</pubDate>
		<dc:creator>Roland</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[model]]></category>

		<guid isPermaLink="false">http://www.baldenhofer.eu/blog/?p=2221</guid>
		<description><![CDATA[Nachdem die Personen nun ein Modell (user.php) haben, wollen wir noch die Gewichtsangaben in ein Modell gießen. Dazu gehst du wieder in das Verzeichnis /app und rufst wieder ../cake/console/cake bake auf. Welcome to CakePHP v1.3.10 Console --------------------------------------------------------------- App : app Path: /home/roland/workspace/weightapplication/app --------------------------------------------------------------- Interactive Bake Shell --------------------------------------------------------------- [D]atabase Configuration [M]odel [V]iew [C]ontroller [P]roject [F]ixture [T]est [...]]]></description>
			<content:encoded><![CDATA[<p>Nachdem die Personen nun ein Modell (user.php) haben, wollen wir noch die Gewichtsangaben in ein Modell gießen.<br />
Dazu gehst du wieder in das Verzeichnis <strong>/app</strong> und rufst wieder <span class=“code“>../cake/console/cake bake</span> auf.</p>
<pre class=“code“>
Welcome to CakePHP v1.3.10 Console

---------------------------------------------------------------

App : app

Path: /home/roland/workspace/weightapplication/app

---------------------------------------------------------------

Interactive Bake Shell

---------------------------------------------------------------

[D]atabase Configuration

[M]odel

[V]iew

[C]ontroller

[P]roject

[F]ixture

[T]est case

[Q]uit

What would you like to Bake? (D/M/V/C/P/F/T/Q) 

> M   

---------------------------------------------------------------

Bake Model

Path: /home/roland/workspace/weightapplication/app/models/

---------------------------------------------------------------

Use Database Config: (default/test) 

[default] > 

Possible Models based on your current database:

1. User

2. Weight

Enter a number from the list above,

type in the name of another model, or 'q' to exit  

[q] > 2
</pre>
<p>Diesmal bin ich gleich bis zu den Modellen durchgegangen und gebe die 2 für Weight ein.</p>
<pre class=“code“>
[q] > 2

A displayField could not be automatically detected

would you like to choose one? (y/n) 

> y

1. id

2. user_id

3. weight

4. created

Choose a field from the options above:  

> 3
</pre>
<p>Diesmal erkennt Cake Console nicht welche Felder wir später anzeigen lassen wollen. Wir wählen das Gewicht.<br />
Danach generieren wir wieder die Validierungen.</p>
<p>Für id:</p>
<pre class=“code“>
> 3

Would you like to supply validation criteria 

for the fields in your model? (y/n) 

[y] > 

Field: id

Type: integer

---------------------------------------------------------------

Please select one of the following validation options:

---------------------------------------------------------------

1 - alphanumeric

2 - between

3 - blank

4 - boolean

5 - cc

6 - comparison

7 - custom

8 - date

9 - decimal

10 - email

11 - equalto

12 - extension

13 - inlist

14 - ip

15 - maxlength

16 - minlength

17 - money

18 - multiple

19 - notempty

20 - numeric

21 - phone

22 - postal

23 - range

24 - ssn

25 - time

26 - url

27 - userdefined

28 - uuid

29 - Do not do any validation on this field.

... or enter in a valid regex validation string.

[29] > 
</pre>
<p>Für User-ID</p>
<pre class=“code“>

[29] > 

Field: user_id

Type: integer

---------------------------------------------------------------

Please select one of the following validation options:

---------------------------------------------------------------

1 - alphanumeric

2 - between

3 - blank

4 - boolean

5 - cc

6 - comparison

7 - custom

8 - date

9 - decimal

10 - email

11 - equalto

12 - extension

13 - inlist

14 - ip

15 - maxlength

16 - minlength

17 - money

18 - multiple

19 - notempty

20 - numeric

21 - phone

22 - postal

23 - range

24 - ssn

25 - time

26 - url

27 - userdefined

28 - uuid

29 - Do not do any validation on this field.

... or enter in a valid regex validation string.

[20] > 
</pre>
<p>Hier wollen wir keine weiteren Validierungen.<br />
Für unser Gewicht wollen wir notempty verwenden:</p>
<pre class=“code“>
[n] > 

Field: weight

Type: float

---------------------------------------------------------------

Please select one of the following validation options:

---------------------------------------------------------------

1 - alphanumeric

2 - between

3 - blank

4 - boolean

5 - cc

6 - comparison

7 - custom

8 - date

9 - decimal

10 - email

11 - equalto

12 - extension

13 - inlist

14 - ip

15 - maxlength

16 - minlength

17 - money

18 - multiple

19 - notempty

20 - numeric

21 - phone

22 - postal

23 - range

24 - ssn

25 - time

26 - url

27 - userdefined

28 - uuid

29 - Do not do any validation on this field.

... or enter in a valid regex validation string.

[29] > 19
</pre>
<p>created lassen wir wie es ist:</p>
<pre class=“code“>
[n] > 

Field: created

Type: timestamp

---------------------------------------------------------------

Please select one of the following validation options:

---------------------------------------------------------------

1 - alphanumeric

2 - between

3 - blank

4 - boolean

5 - cc

6 - comparison

7 - custom

8 - date

9 - decimal

10 - email

11 - equalto

12 - extension

13 - inlist

14 - ip

15 - maxlength

16 - minlength

17 - money

18 - multiple

19 - notempty

20 - numeric

21 - phone

22 - postal

23 - range

24 - ssn

25 - time

26 - url

27 - userdefined

28 - uuid

29 - Do not do any validation on this field.

... or enter in a valid regex validation string.

[29] > 
</pre>
<p>Die Relation zur User-Tabelle ist eine BelongsTo-Relation. Die werden wir mit den folgenden Einträgen erstellen:</p>
<pre class=“code“>
[29] > 

Would you like to define model associations

(hasMany, hasOne, belongsTo, etc.)? (y/n) 

[y] > 

One moment while the associations are detected.

---------------------------------------------------------------

Please confirm the following associations:

---------------------------------------------------------------

Weight belongsTo User? (y/n) 

[y] >
</pre>
<p>Weitere Relationen brauchen wir nicht.<br />
Es wird uns nochmal angezeigt wie das Modell wohl aussehen wird.</p>
<pre class=“code“>
[y] > 

Would you like to define some additional model associations? (y/n) 

[n] > 

---------------------------------------------------------------

The following Model will be created:

---------------------------------------------------------------

Name:       Weight

DB Table:   `weights`

Validation: Array

(

    [user_id] => Array

        (

            [numeric] => numeric

        )

    [weight] => Array

        (

            [notempty] => notempty

        )

)

Associations:

	Weight belongsTo User

---------------------------------------------------------------

Look okay? (y/n) 

[y] > 
</pre>
<p>Auch die Simpletests können wir vorbereiten lassen und fertig ist die Installation.</p>
<pre code=“class“>
[y] > 

Baking model class for Weight...

Creating file /home/roland/workspace/weightapplication/app/models/weight.php

Wrote `/home/roland/workspace/weightapplication/app/models/weight.php`

SimpleTest is not installed. Do you want to bake unit test files anyway? (y/n) 

[y] > 

You can download SimpleTest from http://simpletest.org

Baking test fixture for Weight...

Creating file /home/roland/workspace/weightapplication/app/tests/fixtures/weight_fixture.php

Wrote `/home/roland/workspace/weightapplication/app/tests/fixtures/weight_fixture.php`

Bake is detecting possible fixtures..

Creating file /home/roland/workspace/weightapplication/app/tests/cases/models/weight.test.php

Wrote `/home/roland/workspace/weightapplication/app/tests/cases/models/weight.test.php`

---------------------------------------------------------------

Interactive Bake Shell

---------------------------------------------------------------

[D]atabase Configuration

[M]odel

[V]iew

[C]ontroller

[P]roject

[F]ixture

[T]est case

[Q]uit

What would you like to Bake? (D/M/V/C/P/F/T/Q) 

> 
</pre>
<p>So, jetzt haben wir für die Tabellen users und weights angelegt. </p>
<hr /><h2>Ähnliche Beiträge</h2><ul></ul><hr /><small>www.baldenhofer.eu © seit 2009 <br />
Dieser Feed kommt vom <a href="http://www.baldenhofer.eu/blog">Guggat emol Blog</a>, viel Spa&#223; beim Lesen! &#220;ber  Links zu Artikeln freuen wir uns, jedoch bitte bindet nicht einfach unsere Inhalte in eure Seite ein, danke. Hinweis für Feedleser: Beiträge, die Quellcode enthalten sind auf der Webseite meist besser lesbar, als in einem Feed-Reader. 
<br /> 4e3744397ab2a417f811b29573bcbef4)</small>]]></content:encoded>
			<wfw:commentRss>http://www.baldenhofer.eu/blog/it/weight-modell-backen/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>User-Modell für den Datenbankzugriff in CakePHP backen</title>
		<link>http://www.baldenhofer.eu/blog/it/user-modell-fur-den-datenbankzugriff-in-cakephp-backen</link>
		<comments>http://www.baldenhofer.eu/blog/it/user-modell-fur-den-datenbankzugriff-in-cakephp-backen#comments</comments>
		<pubDate>Sun, 23 Oct 2011 22:49:40 +0000</pubDate>
		<dc:creator>Roland</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[model]]></category>

		<guid isPermaLink="false">http://www.baldenhofer.eu/blog/?p=2218</guid>
		<description><![CDATA[In CakePHP gibt es Konsoleapplikationen mit denen du ohne großen Aufwand Modelle, Controller und Views erstellen kannst. Für unsere Gewichtsapplikation werden wir zuerst die Modelle erstellen. Wechsle in das Verzeichnis /app der Gewichtsapplikation. Dort rufst du mit ../cake/console/cake bake die Bäckerei auf. Wie du sehen kannst, sind die Konsoleanwendungen von Cake im Verzeichnis /cake/console hinterlegt. [...]]]></description>
			<content:encoded><![CDATA[<p>In CakePHP gibt es Konsoleapplikationen mit denen du ohne großen Aufwand Modelle, Controller und Views erstellen kannst.<br />
Für unsere Gewichtsapplikation werden wir zuerst die Modelle erstellen.<br />
<a href="http://www.baldenhofer.eu/blog/wp-content/uploads/2011/10/modelle_anlegen.png"><img class="alignnone size-full wp-image-2219" title="modelle_anlegen" src="http://www.baldenhofer.eu/blog/wp-content/uploads/2011/10/modelle_anlegen.png" alt="Komponentenübersicht Modelle anlegen" width="696" height="873" /></a><br />
Wechsle in das Verzeichnis <strong>/app</strong> der Gewichtsapplikation.<br />
Dort rufst du mit <span class="“code“">../cake/console/cake bake</span> die Bäckerei auf.<br />
Wie du sehen kannst, sind die Konsoleanwendungen von Cake im Verzeichnis <strong>/cake/console</strong> hinterlegt. Schau einfach mal rein.<br />
Wenn du den Aufruf durchgeführt hast, erscheint folgende Auswahl:</p>
<pre class="“code“">Welcome to CakePHP v1.3.10 Console

---------------------------------------------------------------

App : app

Path: /home/roland/workspace/weightapplication/app

---------------------------------------------------------------

Interactive Bake Shell

---------------------------------------------------------------

[D]atabase Configuration

[M]odel

[V]iew

[C]ontroller

[P]roject

[F]ixture

[T]est case

[Q]uit

What would you like to Bake? (D/M/V/C/P/F/T/Q) 

&gt;</pre>
<p>Hier kannst du auswählen was du backen willst.<br />
Wir wollen zuerst unsere Modelle backen, also geben wir M ein.<br />
Die nächste Frage lautet ob wir unsere Modelle anhand der Definitionen der Default-Database-Connection oder der Test-Connection erstellen wollen.</p>
<pre class="“code“">&gt; M       

---------------------------------------------------------------

Bake Model

Path: /home/roland/workspace/weightapplication/app/models/

---------------------------------------------------------------

Use Database Config: (default/test) 

[default] &gt;</pre>
<p>Hier kannst du return drücken, da wir die default-Konfiguration nehmen wollen.<br />
Als nächstes werden die Tabellen, die derzeitig in der Datenbank definiert sind, angezeigt:</p>
<pre class="“code“">[default] &gt; 

Possible Models based on your current database:

1. User

2. Weight

Enter a number from the list above,

type in the name of another model, or 'q' to exit  

[q] &gt;</pre>
<p>Jetzt lassen wir die Modelle erstellen. Du gibst hierfür die 1 und 2 ein.<br />
Fangen wir also mit 1 an:</p>
<pre class="“code“">[q] &gt; 1   

Would you like to supply validation criteria 

for the fields in your model? (y/n) 

[y] &gt;</pre>
<p>Die Modell-Attribute können mit Standard-Validierungen überprüft werden.<br />
Wir wollen das der Name und die E-Mail Adresse korrekt eingegeben werden.<br />
Also sagen wir ja (return)<br />
Das erste Feld ist die id.<br />
Hier werden folgende Optionen angeboten:</p>
<pre class="“code“">[y] &gt; 

Field: id

Type: integer

---------------------------------------------------------------

Please select one of the following validation options:

---------------------------------------------------------------

1 - alphanumeric

2 - between

3 - blank

4 - boolean

5 - cc

6 - comparison

7 - custom

8 - date

9 - decimal

10 - email

11 - equalto

12 - extension

13 - inlist

14 - ip

15 - maxlength

16 - minlength

17 - money

18 - multiple

19 - notempty

20 - numeric

21 - phone

22 - postal

23 - range

24 - ssn

25 - time

26 - url

27 - userdefined

28 - uuid

29 - Do not do any validation on this field.

... or enter in a valid regex validation string.

[29] &gt;</pre>
<p>Mit 29 (also return) geben wir an, dass wir keine besondere Überprüfung für dieses Feld durchführen wollen.</p>
<p>Als nächstes wird das Feld name angezeigt.</p>
<pre class="“code“">[29] &gt; 

Field: name

Type: string

---------------------------------------------------------------

Please select one of the following validation options:

---------------------------------------------------------------

1 - alphanumeric

2 - between

3 - blank

4 - boolean

5 - cc

6 - comparison

7 - custom

8 - date

9 - decimal

10 - email

11 - equalto

12 - extension

13 - inlist

14 - ip

15 - maxlength

16 - minlength

17 - money

18 - multiple

19 - notempty

20 - numeric

21 - phone

22 - postal

23 - range

24 - ssn

25 - time

26 - url

27 - userdefined

28 - uuid

29 - Do not do any validation on this field.

... or enter in a valid regex validation string.

[19] &gt;</pre>
<p>Die Cake Console ist ziemlich clever und schlägt und notempty vor. Also machen wir das so.<br />
Als nächstes fragt Die Cake Console uns ob wir weitere Überprüfungen durchführen wollen. Hier können wir vorerst mit Return (also nein) weitergehen.</p>
<pre class="“code“">[n] &gt; 

Field: email

Type: string

---------------------------------------------------------------

Please select one of the following validation options:

---------------------------------------------------------------

1 - alphanumeric

2 - between

3 - blank

4 - boolean

5 - cc

6 - comparison

7 - custom

8 - date

9 - decimal

10 - email

11 - equalto

12 - extension

13 - inlist

14 - ip

15 - maxlength

16 - minlength

17 - money

18 - multiple

19 - notempty

20 - numeric

21 - phone

22 - postal

23 - range

24 - ssn

25 - time

26 - url

27 - userdefined

28 - uuid

29 - Do not do any validation on this field.

... or enter in a valid regex validation string.

[10] &gt;</pre>
<p>Das nächste Feld ist die E-Mail Adresse. Hier erkennt Cake Console dass wir eine valide E-Mail Adresse eingeben wollen (also irgendwas mit BLA@BLUB.LULL).<br />
Wir akzeptieren die 10.<br />
Die Frage, ob wir noch weitere Validierungen angeben wollen, beantworten wir diesmal mit y.<br />
Jetzt geben wir noch isUnique als Validierungsregel an. Damit wird erreicht, dass jede E-Mail Adresse im System einmalig ist.</p>
<pre class="“code“">[10] &gt; isUnique

Would you like to add another validation rule? (y/n) 

[n] &gt;</pre>
<p>Jetzt können wir wieder return drücken.</p>
<p>Das letzte Feld, mit zu überprüfenden Eigenschaften, ist das Passwort.<br />
Hier können wir z.B. eine Minimallänge vorgeben.</p>
<pre class="“code“">[19] &gt; 16

Would you like to add another validation rule? (y/n) 

[n] &gt;</pre>
<p>Die Beschreibung lassen wir optional.</p>
<pre class="“code“">[n] &gt; 

Field: description

Type: text

---------------------------------------------------------------

Please select one of the following validation options:

---------------------------------------------------------------

1 - alphanumeric

2 - between

3 - blank

4 - boolean

5 - cc

6 - comparison

7 - custom

8 - date

9 - decimal

10 - email

11 - equalto

12 - extension

13 - inlist

14 - ip

15 - maxlength

16 - minlength

17 - money

18 - multiple

19 - notempty

20 - numeric

21 - phone

22 - postal

23 - range

24 - ssn

25 - time

26 - url

27 - userdefined

28 - uuid

29 - Do not do any validation on this field.

... or enter in a valid regex validation string.

[29] &gt;</pre>
<p>Als nächstes werden wir gefragt ob wir Verknüpfungen zu anderen Modellen haben wollen.<br />
Hier sagen wir ja, denn wir wollen unsere Personen mit vielen Gewichtsangaben versehen.</p>
<pre class="“code“">[29] &gt; 

Would you like to define model associations

(hasMany, hasOne, belongsTo, etc.)? (y/n) 

[y] &gt;</pre>
<p>Wenn du return drückst wird die weights Tabelle angezeigt. Diese beinhaltet eine user_id und kann daher eine Relation zu unserer users-Tabelle haben.</p>
<pre class="“code“">[y] &gt; 

One moment while the associations are detected.

---------------------------------------------------------------

Please confirm the following associations:

---------------------------------------------------------------

User hasMany Weight? (y/n) 

[y] &gt;</pre>
<p>Wir sagen bei dieser Frage ja (return)</p>
<pre class="“code“">[y] &gt; 

Would you like to define some additional model associations? (y/n) 

[n] &gt;</pre>
<p>Hier bleiben wir bei nein.<br />
Als letztes wird uns angezeigt was wir da so zusammenkonfiguriert haben:</p>
<pre class="“code“">[n] &gt; 

---------------------------------------------------------------

The following Model will be created:

---------------------------------------------------------------

Name:       User

DB Table:   `users`

Validation: Array

(

    [name] =&gt; Array

        (

            [notempty] =&gt; notempty

        )

    [email] =&gt; Array

        (

            [email] =&gt; email

            [isUnique] =&gt; isUnique

        )

    [password] =&gt; Array

        (

            [minlength] =&gt; minlength

        )

)

Associations:

	User hasMany Weight

---------------------------------------------------------------

Look okay? (y/n) 

[y] &gt;</pre>
<p>Das sieht gut aus! Also sagen wir ja.</p>
<pre class="“code“">[y] &gt; 

Baking model class for User...

Creating file /home/roland/workspace/weightapplication/app/models/user.php

Wrote `/home/roland/workspace/weightapplication/app/models/user.php`

SimpleTest is not installed. Do you want to bake unit test files anyway? (y/n) 

[y] &gt;</pre>
<p>Wie du sehen kannst, wird das Modell user.php in das Verzeichnis /app/models/users.php geschrieben.<br />
Die Frage ob wir die Unit-Tests für unser Modell erstellen wollen, können wir mit ja beantworten. Dann können wir später mit SimpleTest alles durchtesten.</p>
<p>Jetzt wird alles fertiggestellt und wir kommen wieder zur Startseite.</p>
<pre class="“code“">[y] &gt; 

You can download SimpleTest from http://simpletest.org

Baking test fixture for User...

Creating file /home/roland/workspace/weightapplication/app/tests/fixtures/user_fixture.php

Wrote `/home/roland/workspace/weightapplication/app/tests/fixtures/user_fixture.php`

Bake is detecting possible fixtures..

Creating file /home/roland/workspace/weightapplication/app/tests/cases/models/user.test.php

Wrote `/home/roland/workspace/weightapplication/app/tests/cases/models/user.test.php`

---------------------------------------------------------------

Interactive Bake Shell

---------------------------------------------------------------

[D]atabase Configuration

[M]odel

[V]iew

[C]ontroller

[P]roject

[F]ixture

[T]est case

[Q]uit

What would you like to Bake? (D/M/V/C/P/F/T/Q) 

&gt;</pre>
<p>Hier brechen wir mit Q ab und schauen uns zuerst unser Modell an.<br />
Gehe zur Validierung des Passworts und ändere die Validierung so ab, dass wir eine Minimallänge von sechs Zeichen vorsehen:</p>
<pre class="“code“">		'password' =&gt; array(

			'minlength' =&gt; array(

				'rule' =&gt; array('minlength', 6),

				//'message' =&gt; 'Your custom message here',

				//'allowEmpty' =&gt; false,

				//'required' =&gt; false,

				//'last' =&gt; false, // Stop validation after this rule

				//'on' =&gt; 'create', // Limit validation to 'create' or              'update' operations

			),</pre>
<p>Alle anderen vorgefertigten Definitionen lassen wir vorerst einfach mal so stehen.<br />
Das Modell ist jetzt erst einmal ausreichend konfiguriert.</p>
<hr /><h2>Ähnliche Beiträge</h2><ul></ul><hr /><small>www.baldenhofer.eu © seit 2009 <br />
Dieser Feed kommt vom <a href="http://www.baldenhofer.eu/blog">Guggat emol Blog</a>, viel Spa&#223; beim Lesen! &#220;ber  Links zu Artikeln freuen wir uns, jedoch bitte bindet nicht einfach unsere Inhalte in eure Seite ein, danke. Hinweis für Feedleser: Beiträge, die Quellcode enthalten sind auf der Webseite meist besser lesbar, als in einem Feed-Reader. 
<br /> 4e3744397ab2a417f811b29573bcbef4)</small>]]></content:encoded>
			<wfw:commentRss>http://www.baldenhofer.eu/blog/it/user-modell-fur-den-datenbankzugriff-in-cakephp-backen/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Namensänderungen im Newssystem Modell</title>
		<link>http://www.baldenhofer.eu/blog/it/programmieren/namensaenderungen-im-newssystem-modell</link>
		<comments>http://www.baldenhofer.eu/blog/it/programmieren/namensaenderungen-im-newssystem-modell#comments</comments>
		<pubDate>Wed, 17 Jun 2009 04:03:55 +0000</pubDate>
		<dc:creator>Roland</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[model]]></category>
		<category><![CDATA[Newssystem]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.baldenhofer.eu/blog/?p=1449</guid>
		<description><![CDATA[Ich bin dabei mir ein paar Gedanken zu den Modellen des Newssystems zu machen. Da ich diesmal CakePHP einsetzen will, habe ich ein paar Fragestellungenzu den Modellnamen zu beantworten. Beispiel: Bisher habe ich das Modell, welches die einzelnen News beinhaltet, sinnvollerweise NewsModell getauft. Nun, in CakePHP gilt die Namenskonvention, dass Modelle im Singular und Controller [...]]]></description>
			<content:encoded><![CDATA[<p>Ich bin dabei mir ein paar Gedanken zu den Modellen des Newssystems zu machen.<br />
Da ich diesmal CakePHP einsetzen will, habe ich ein paar Fragestellungenzu den Modellnamen zu beantworten.<br />
Beispiel:<br />
Bisher habe ich das Modell, welches die einzelnen News beinhaltet, sinnvollerweise NewsModell getauft.<br />
Nun, in CakePHP gilt die Namenskonvention, dass Modelle im Singular und Controller im Plural definiert werden sollen.<br />
Supi!<br />
News ist zwar eigentlich ein Singular, aber ich habe da ein New und ein &#8220;s&#8221;.<br />
Also wird das kluge CakePHP mir wohl sagen, dass ich hier einen Plural verwende.</p>
<h3>Was habe ich getan?</h3>
<p>Bevor ich mit dem CakePHP beim Backen ärger bekomme, habe ich mich entschieden die NewsModel Geschichte einfach umzubenennen.<br />
Im Prinzip ist ja jede News ein Artikel.<br />
Also heist das NewsModel ab sofort ArticleModel.</p>
<h3>Was muss jetzt geschehen?</h3>
<p>Da wir zur Zeit noch in der Konzeption sind, muss nicht viel umgewandelt werden.<br />
Wir müssen lediglich kurz durch alle Artikel durch, in denen das NewsModel vorkommt.<br />
Dank der Volltextsuche sollte das ja wirklich kein Problem darstellen <img src='http://www.baldenhofer.eu/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
Dann ersetzen wir in den Artikeln NewsModel in ArticleModel und schon sind wir auf alle Fälle CakePHP konform.</p>
<h3>Blogsoftware verwenden hat Vorteile bei der Dokumentation</h3>
<p>Die wirkliche Erkenntnis, die ich dank dieser Aktion erhalten habe, ist das es sich wirklich lohnt ein Content Management System, wie beispielsweise einen Blog, für die Dokumentation zu verwenden.<br />
Da alle Dokumente miteinander verlinkt sind, ist die Suche und das Abändern der einzelnen Artikel kein Problem.<br />
Mit der Kommentarfunktion kann man die Änderungen noch protokollieren und so ist die ganze Dokumentation richtig rund!</p>
<h3>Fazit</h3>
<p>Diese Aktion hat mir gezeigt, dass ein integriertes Tool für die ganze Dokumentation durchaus seinen Reiz hat.<br />
Wir sollten entsprechend über unsere Anforderungsdokumentation nachdenken.<br />
Wenn wir hier ein anderes Werkzeug einsetzen, werden wir sehr schnell inkonsistente Bezeichnungen erhalten.<br />
Die Inflation bei den Blogeinträgen ist zwar nicht unbedingt schön, aber dann haben wir den ganzen Brei auf einem System.<br />
Wir könnten ja noch über die Anforderungsclusterung nachdenken.<br />
Wir können z.B. alle Anforderungen zu einer bestimmten Komponente, oder zu einem bestimmten Thema, in jeweils einen Artikel schreiben.<br />
Damit werden wir deutlich weniger Artikel erhalten und dennoch alle Anforderungen im Blog ablegen können.<br />
Oder wir freuen uns über die vielen Anforderungsartikel.<br />
Eigentlich macht es ja nichts aus, wenn man in einem Blog ein paar hundert Artikel hat. Man kann über die Cloud, oder über die Serie sehr einfach filtern.</p>
<p>Habt ihr hierzu eine Meinung?</p>
<hr /><h2>Ähnliche Beiträge</h2><ul></ul><hr /><small>www.baldenhofer.eu © seit 2009 <br />
Dieser Feed kommt vom <a href="http://www.baldenhofer.eu/blog">Guggat emol Blog</a>, viel Spa&#223; beim Lesen! &#220;ber  Links zu Artikeln freuen wir uns, jedoch bitte bindet nicht einfach unsere Inhalte in eure Seite ein, danke. Hinweis für Feedleser: Beiträge, die Quellcode enthalten sind auf der Webseite meist besser lesbar, als in einem Feed-Reader. 
<br /> 4e3744397ab2a417f811b29573bcbef4)</small>]]></content:encoded>
			<wfw:commentRss>http://www.baldenhofer.eu/blog/it/programmieren/namensaenderungen-im-newssystem-modell/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
	
		<series:name><![CDATA[Newssystem]]></series:name>
	</item>
		<item>
		<title>UserModelFactory</title>
		<link>http://www.baldenhofer.eu/blog/it/programmieren/usermodelfactory</link>
		<comments>http://www.baldenhofer.eu/blog/it/programmieren/usermodelfactory#comments</comments>
		<pubDate>Fri, 01 May 2009 10:54:44 +0000</pubDate>
		<dc:creator>Roland</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[factory]]></category>
		<category><![CDATA[model]]></category>
		<category><![CDATA[Newssystem]]></category>
		<category><![CDATA[UserModel]]></category>

		<guid isPermaLink="false">http://www.baldenhofer.eu/blog/?p=976</guid>
		<description><![CDATA[Im System werden diverse Typen von Anwendern verwaltet. Jeder Anwendertyp erhält eine speziell ausgebildete Klasse. Damit übergeordnete Klassen sich nicht mit dem Suchen der passenden Klasse herumschlagen müssen, werden wir hierfür eine Factory Klasse einführen. Diese Factory Klasse definiert die im System bekannten Anwendertypen mit WEBUSER, EDITOR, MASTER_EDITOR und SYSADMIN. Falls ein Anwendermodell benötigt wird, [...]]]></description>
			<content:encoded><![CDATA[<p>Im System werden diverse Typen von Anwendern verwaltet. Jeder Anwendertyp erhält eine speziell ausgebildete Klasse.<br />
Damit übergeordnete Klassen sich nicht mit dem Suchen der passenden Klasse herumschlagen müssen, werden wir hierfür eine Factory Klasse einführen.<br />
<img alt="Die Factory Klasse um Anwendermodelle initialisieren zu können." src="/images/blog/newssystem/UserModelFactory.png" /><br />
Diese Factory Klasse definiert die im System bekannten Anwendertypen mit WEBUSER, EDITOR, MASTER_EDITOR und SYSADMIN.<br />
Falls ein Anwendermodell benötigt wird, ruft man die statische Methode <strong>getUserModel(userType)</strong> auf und initialisiert so die richtige Klasse.</p>
<hr /><h2>Ähnliche Beiträge</h2><ul></ul><hr /><small>www.baldenhofer.eu © seit 2009 <br />
Dieser Feed kommt vom <a href="http://www.baldenhofer.eu/blog">Guggat emol Blog</a>, viel Spa&#223; beim Lesen! &#220;ber  Links zu Artikeln freuen wir uns, jedoch bitte bindet nicht einfach unsere Inhalte in eure Seite ein, danke. Hinweis für Feedleser: Beiträge, die Quellcode enthalten sind auf der Webseite meist besser lesbar, als in einem Feed-Reader. 
<br /> 4e3744397ab2a417f811b29573bcbef4)</small>]]></content:encoded>
			<wfw:commentRss>http://www.baldenhofer.eu/blog/it/programmieren/usermodelfactory/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[Newssystem]]></series:name>
	</item>
		<item>
		<title>UserModel Beschreibung</title>
		<link>http://www.baldenhofer.eu/blog/it/programmieren/usermodel-beschreibung</link>
		<comments>http://www.baldenhofer.eu/blog/it/programmieren/usermodel-beschreibung#comments</comments>
		<pubDate>Thu, 30 Apr 2009 17:46:06 +0000</pubDate>
		<dc:creator>Roland</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[model]]></category>
		<category><![CDATA[Newssystem]]></category>

		<guid isPermaLink="false">http://www.baldenhofer.eu/blog/?p=974</guid>
		<description><![CDATA[Unser UserModel dient als Basisklasse für alle Anwendertypen. Wir designen es als Bean in dem die entsprechenden Attribute verwaltet werden. Attribute des UserModels Alle Attribute, die für jeden Anwender gespeichert werden müssen, sind hier abgelegt. name Der Name des Anwenders. Dieser Name muss mindestens ein Zeichen beinhalten und darf maximal 200 Zeichen lang sein. Falls [...]]]></description>
			<content:encoded><![CDATA[<p>Unser UserModel dient als Basisklasse für alle Anwendertypen.<br />
Wir designen es als Bean in dem die entsprechenden Attribute verwaltet werden.<br />
<img alt="Das UserModel" src="/images/blog/newssystem/UserModel.png" /></p>
<h3>Attribute des UserModels</h3>
<p>Alle Attribute, die für jeden Anwender gespeichert werden müssen, sind hier abgelegt.</p>
<h4>name</h4>
<p>Der Name des Anwenders. Dieser Name muss mindestens ein Zeichen beinhalten und darf maximal 200 Zeichen lang sein.<br />
Falls kein Name eingegeben wurde, soll mit der Information &#8220;Bitte einen Namen eingeben&#8221; abgebrochen werden.<br />
Falls der Name zu lange ist, soll mit der Information &#8220;Der Name beinhaltet zu viele Zeichen. Bitte korrigieren.&#8221; abgebrochen werden.<br />
Zum Setzen des Namens wird <strong>setName(name)</strong> verwendet.<br />
Zum Auslesen des Namens wird <strong>getName()</strong> verwendet.</p>
<h4>surname</h4>
<p>Der Vorname des Anwenders. Dieser Vorname muss mindestens ein Zeichen beinhalten und darf maximal 200 Zeichen lang sein.<br />
Falls kein Vorname eingegeben wurde, soll mit der Information &#8220;Bitte einen Vornamen eingeben&#8221; abgebrochen werden.<br />
Falls der Vorname zu lange ist, soll mit der Information &#8220;Der Vorname beinhaltet zu viele Zeichen. Bitte korrigieren.&#8221; abgebrochen werden.<br />
Zum Setzen des Nachnamens wird <strong>setSurname(surname)</strong> verwendet.<br />
Zum Auslesen des Nachnamens wird <strong>getSurname()</strong> verwendet.</p>
<h4>email</h4>
<p>Die E-Mail Adresse muss zumindest einen gültigen Aufbau haben.<br />
Also aaa.bbb@ccc.ddd<br />
oder bbb@ccc.ddd<br />
Falls eine falsch aufgebaute Adresse übergeben wird, muss mit einer Information &#8220;Dies ist keine gültige E-Mail Adresse&#8221; abgebrochen werden.<br />
Zum Setzen der E-Mail Adresse wird <strong>setEmail(email)</strong> verwendet.<br />
Zum Auslesen der E-Mail Adresse wird <strong>getEmail()</strong> verwendet.</p>
<h4>loginName</h4>
<p>Mit diesem Namen wird sich der Anwender am System anmelden. Der LoginName darf in der gesamten Newssysteminstanz nur einmal vorkommen.<br />
Der LoginName muss mindestens ein Zeichen haben und darf maximal 20 Zeichen beinhalten.<br />
Ein LoginName, wie <strong>bienchen87</strong>, ist zugelassen.<br />
Falls kein loginName eingegeben wird, soll mit der Information &#8220;Bitte geben Sie einen Loginnamen&#8221; abgebrochen werden.<br />
Falls der loginName länger als 20 Zeichen ist, soll mit der Information &#8220;Bitte einen kürzeren Loginnamen eingeben&#8221; abgebrochen werden.<br />
Falls der loginName im System schon vorhanden ist, wird mit der Information &#8220;Dieser Loginname ist im System nicht verfügbar, bitte einen anderen wählen.&#8221; abgebrochen.<br />
Zum Setzen des login-Namens wird <strong>setLoginName(loginName)</strong> verwendet.<br />
Zum Auslesen des Login-Namens wird <strong>getLoginName()</strong> verwendet.</p>
<h4>password</h4>
<p>Das Passwort wird verschlüsselt abgespeichert.<br />
Das Passwort wird mittels JavaScript auf dem Client verschlüsselt.<br />
Falls ein Webuser angelegt wird, wird kein Passwort angelegt. Der Webuser benötigt kein Passwort um sich am System anzumelden.<br />
Sonst müsste ja jeder Webseitenbesucher sich erst anmelden. Das wäre ziemlich doof <img src='http://www.baldenhofer.eu/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Für das DefaultPassword werden wir ein PropertyModel erstellen, von dem das DefaultPassword zur Laufzeit gezogen werden kann.<br />
Ein Anwender muss sein Passwort nach einer im System hinterlegten Password Change Time wechseln.<br />
Im Fall des UserModels wird der Passwortwechsel nie vorkommen. Das UserModel hat die Berechtigungen eines WEBUSER.<br />
Wenn das Passwort neu gesetzt wird, darf es nicht mit dem aktuellen oder dem zuvor verwendeten Passwort übereinstimmen. Deshalb wird das neue Passwort mit dem oldPassword verglichen.<br />
Hier habe ich die Überprüfung von alten Passwörtern nur auf das aktuelle und das letzte Passwort eingegrenzt. Falls weitere alte Passwörter berücksichtigt werden müssen, muss dies in der abgeleiteten Klasse entsprechend auscodiert werden. Meine Erfahrung sagt jedoch, dass die meisten Kunden gar keine höhere Sicherheit als zwei Passwörter verwenden wollen.<br />
Falls beim Setzen des Passworts kein Passwort eingegeben wurde, wird mit der Informationsmeldung &#8220;Bitte Passwort eingeben&#8221; abgebrochen.<br />
Falls beim Setzen des Passworts ein bereits verwendetes Passwort eingegeben wurde, wird mit der Informationsmeldung &#8220;Passwort schon in Gebrauch, bitte ein anderes verwenden.&#8221; abgebrochen.<br />
Je nach Anwendertyp muss dass Passwort eine bestimmte Länge aufweisen. Falls ein zu kurzes Passwort eingegeben wurde, wird mit der Informationsmelung &#8220;Bitte längeres Passwort verwenden.&#8221; abgebrochen.<br />
Je nach Anwendertyp muss das Passwort einen bestimmten Aufbau (benutzung von Sonderzeichen usw.) aufweisen. Ein Systemadministrator darf also nicht aaaaaaaa als sein Passwort verwenden. Falls ein nicht stark genuges Passwort verwendet wurde, wird mit der Informationsmeldung &#8220;Dieses Passwort ist nicht sicher genug, bitte verwenden Sie auch Sonderzeichen.&#8221; abgebrochen.<br />
Die Passwortüberprüfung wird pro UserType festgelegt Das bedeutet, dass das UserModel mit WEBUSER Rechten arbeitet. Es wird somit kein User-Passwort überprüft und jeder Anwender erhält Zugriff auf das System.<br />
Beim Einloggen wird mit der Methode <strong>checkPassword(loginName, password)</strong> geprüft, ob das Passwort vom User korrekt übergeben wurde.<br />
Zum Setzen eines neuen Passworts wird <strong>setPassword(password, repeatPassword)</strong> verwendet. Hierbei wird auch der Test, ob das Passwort sicher genug ist und nicht mit dem vorigen Passwort übereinstimmt durchgeführt.<br />
Beim Setzen des Passworts muss das neue Passwort zweimal eingegeben werden. Dies wird mit dem Parameter repeatPassword übergeben.<br />
Mit der Methode <strong>getPasswordLength()</strong> wird die Länge zurückgeliefert, die ein Passwort mindestens haben muss.</p>
<h4>passwordAge</h4>
<p>Angabe wie alt das aktuelle Passwort ist.<br />
Falls passwordAge älter ist, als das für den jeweiligen User definierte Passwortalter, wird der Anwender aufgefordert sein Passwort zu ändern.</p>
<h4>currentLoginTryCount</h4>
<p>Falls ein böser Mensch unser System angreifen will, wird er vermutlich mehrmals eine User-Passwort Kombination verwenden. Hier wäre es gut, wenn nach z.B. fünf Versuchen der Account gesperrt wird.<br />
Dann sollte eine entsprechende Mail an den betroffenen User und den Systemadministrator geschickt werden.<br />
Falls ein User sich nach z.B. zwei Versuchen erfolgreich angemeldet hat, wird der Zähler currentLoginTryCount wieder zurückgesetzt.<br />
Bei jedem nicht erfolgreichen Loginversuch wird er um eins erhöht.<br />
Dieser Zähler wird in der Methode <strong>checkPassword()</strong> verwendet.</p>
<h3>Aufgabe</h3>
<p>Liebe Ute, lieber Jozo. Dieses UserModel verarbeitet Passwörter in der Basisklasse selbst. Bei unseren bisherigen hirachischen Userverwaltungen haben wir dies außerhalb der User Klasse gehandhabt.<br />
Ich finde die Modellierung in dieser Klasse relativ elegant. Wir brauchen deutlich weniger Verwaltungsklassen.<br />
Komplexe Passwortüberprüfungen, wie in früheren Versionen unseres miradlo Frameworks, können wir durch Programmierung der Klassen abbilden.<br />
Bitte lest euch diese Beschreibung hier genau durch und versucht nachzuvollziehen ob wir hiermit eine saubere Lösung erhalten.<br />
Was für Nachteile hat dieses Vorgehen?<br />
Wie sollen wir bei einem Angriff vorgehen? Ist mein Vorschlag ok oder sollten wir den noch nachbessern?</p>
<hr /><h2>Ähnliche Beiträge</h2><ul></ul><hr /><small>www.baldenhofer.eu © seit 2009 <br />
Dieser Feed kommt vom <a href="http://www.baldenhofer.eu/blog">Guggat emol Blog</a>, viel Spa&#223; beim Lesen! &#220;ber  Links zu Artikeln freuen wir uns, jedoch bitte bindet nicht einfach unsere Inhalte in eure Seite ein, danke. Hinweis für Feedleser: Beiträge, die Quellcode enthalten sind auf der Webseite meist besser lesbar, als in einem Feed-Reader. 
<br /> 4e3744397ab2a417f811b29573bcbef4)</small>]]></content:encoded>
			<wfw:commentRss>http://www.baldenhofer.eu/blog/it/programmieren/usermodel-beschreibung/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[Newssystem]]></series:name>
	</item>
		<item>
		<title>ImageModel Beschreibung</title>
		<link>http://www.baldenhofer.eu/blog/it/programmieren/imagemodel-beschreibung</link>
		<comments>http://www.baldenhofer.eu/blog/it/programmieren/imagemodel-beschreibung#comments</comments>
		<pubDate>Fri, 10 Apr 2009 12:41:41 +0000</pubDate>
		<dc:creator>Roland</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[ImageModel]]></category>
		<category><![CDATA[model]]></category>
		<category><![CDATA[Newssystem]]></category>

		<guid isPermaLink="false">http://www.baldenhofer.eu/blog/?p=746</guid>
		<description><![CDATA[Mit diesem Modell werden die Informationen zu einem bestimmten Bild verwaltet. Jedes Bild wird durch eine ID, einen Namen, einen alternativ darzustellenden Text, einer Beschreibung und dem Typ des Bildes (jpeg, png, gif usw.) beschrieben. &#60;img alt=&#8221;Klasse ImageModel&#8221; src=&#8221;/images/blog/newssystem/ImageModel.png&#8221; /&#62; Die Setter und Getter Methoden werden für den Zugriff auf die einzelnen Attribute verwendet. Mit [...]]]></description>
			<content:encoded><![CDATA[<p>Mit diesem Modell werden die Informationen zu einem bestimmten Bild verwaltet.<br />
Jedes Bild wird durch eine ID, einen Namen, einen alternativ darzustellenden Text, einer Beschreibung und dem Typ des Bildes (jpeg, png, gif usw.) beschrieben.<br />
&lt;img alt=&#8221;Klasse ImageModel&#8221; src=&#8221;/images/blog/newssystem/ImageModel.png&#8221; /&gt;<br />
Die Setter und Getter Methoden werden für den Zugriff auf die einzelnen Attribute verwendet. Mit den Setter Methoden wird erreicht, dass kein Mist in das Modell eingeschrieben wird. Folgende Regeln müssen wir beachten:<br />
&lt;h4&gt;id&lt;/h4&gt;<br />
Um die ID zu generieren, wird über die Binärdaten des Bildes ein MD5 Hash Wert erzeugt. Zu diesem Wert wird der aktuelle Timestamp hinzugefügt. Damit wird sichergestellt, dass die ID des Bildes immer eindeutig ist.<br />
&lt;h4&gt;name&lt;/h4&gt;<br />
Ein für den Menschen sprechender Name. Hier können mehrere Bilder den gleichen Namen beinhalten. Der Name darf leer sein.<br />
&lt;h4&gt;altText&lt;/h4&gt;<br />
Ein Text der im HTML dargestellt werden soll, falls z.B. mit &lt;a href=&#8221;URL&#8221;&gt;Links&lt;/a&gt; auf das Dokument zugegriffen wird. Falls kein Bild dargestellt werden kann, soll wenigstens ein alternativer Text angezeigt werden.<br />
&lt;h4&gt;type&lt;/h4&gt;<br />
Angabe um welchen Typ von Bild es sich handelt. Wir sollten hier Konstanten einführe, also gif, jpeg, png und was weiss ich. Es können nicht unendlich viele Grafikformate verarbeitet werden. Der Typ muss einem der vordefinierten Werten genügen.<br />
&lt;h4&gt;description&lt;/h4&gt;<br />
Eine Beschreibung zum Bild. Dieser Text darf leer sein. Mehr als 1000 Zeichen sollte er nicht beinhalten. Eine Beschreibung kann zum Beispiel &#8220;Herbert, nachdem er die Katze vom Baum gerettet hat und sich dabei leider viele Schrammen zugezogen hat. Die Katze überlebte unverletzt. Der Baum ist leider gestorben.&#8221;<br />
&lt;h4&gt;Aufgabe&lt;/h4&gt;<br />
Häufig fällt bei der Modellierung einer Klasse auf, dass die Anwendungsfälle andere Attribute beschreiben. Damit alles rund wird, muss deshalb nochmals auf den Anwendungsfall zurückgegriffen werden und dieser angepasst werden.<br />
Die Beschreibung des Modells passt nicht mehr mit der Beschreibung der Image-Anwendungsfälle überein. Bitte schau dir die Image-Anwendungsfälle an und lass uns die dortigen Texte korrigieren.</p>
<hr /><h2>Ähnliche Beiträge</h2><ul></ul><hr /><small>www.baldenhofer.eu © seit 2009 <br />
Dieser Feed kommt vom <a href="http://www.baldenhofer.eu/blog">Guggat emol Blog</a>, viel Spa&#223; beim Lesen! &#220;ber  Links zu Artikeln freuen wir uns, jedoch bitte bindet nicht einfach unsere Inhalte in eure Seite ein, danke. Hinweis für Feedleser: Beiträge, die Quellcode enthalten sind auf der Webseite meist besser lesbar, als in einem Feed-Reader. 
<br /> 4e3744397ab2a417f811b29573bcbef4)</small>]]></content:encoded>
			<wfw:commentRss>http://www.baldenhofer.eu/blog/it/programmieren/imagemodel-beschreibung/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[Newssystem]]></series:name>
	</item>
		<item>
		<title>Geschäftsmodelle erkennen</title>
		<link>http://www.baldenhofer.eu/blog/it/programmieren/geschaeftsmodelle-erkennen</link>
		<comments>http://www.baldenhofer.eu/blog/it/programmieren/geschaeftsmodelle-erkennen#comments</comments>
		<pubDate>Wed, 08 Apr 2009 11:14:07 +0000</pubDate>
		<dc:creator>Roland</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[model]]></category>
		<category><![CDATA[Newssystem]]></category>

		<guid isPermaLink="false">http://www.baldenhofer.eu/blog/?p=744</guid>
		<description><![CDATA[Wir müssen die Daten für die Newseinträge, den Editor und die Kategorien schlussendlich irgendwie auf dem Server speichern. Damit wir die Datensätze mehr- oder weniger sinnvoll zusammenführen können, müssen wir die bisherigen Beschreibungen analysieren und entsprechend als Strukturen beschreiben. Diese Strukturierung führt dazu, dass wir die notwendigen Daten in Geschäftsmodelle (Businessmodels) zusammenführen. Für die Verwaltung [...]]]></description>
			<content:encoded><![CDATA[<p>Wir müssen die Daten für die Newseinträge, den Editor und die Kategorien schlussendlich irgendwie auf dem Server speichern. Damit wir die Datensätze mehr- oder weniger sinnvoll zusammenführen können, müssen wir die bisherigen Beschreibungen analysieren und entsprechend als Strukturen beschreiben.<br />
Diese Strukturierung führt dazu, dass wir die notwendigen Daten in Geschäftsmodelle (Businessmodels) zusammenführen.<br />
Für die Verwaltung der Geschäftsdaten werden wir entsprechende Methoden beschreiben und somit die Daten vor unsinnigen Zugriff schützen.<br />
Und schubs, wir haben ein wohldefiniertes Geschäftsmodell mit allen Abhängigkeiten zu den umliegenen Geschäftsmodellen.<br />
Easy oder?<br />
Wenn du die Anwendungsfälle durchgehst, wirst du feststellen dass bestimmte Komponenten irgendwie zusammengehören.<br />
Bei meinen Businessmodellen schreibe ich in den Namen des jeweiligen Modells und füge als Postfix &#8220;Model&#8221; hinzu. Dann weiss ich immer, dass es sich bei dieser Klasse um ein Modell handelt.<br />
Ich habe mal einen Versuch gestartet und folgende Datengruppen gefunden:<br />
<img alt="Businessmodelle Klassendiagram" src="/images/blog/newssystem/BusinessModels.png" /></p>
<dl>
<dt>CategoryModel</dt>
<dd>Beinhaltet alle Daten die zur Beschreibung einer Kategorie und der dazugehörigen Editoren gehört.</dd>
<dt>EditorModel</dt>
<dd>Speichert alle Elemente, die einen Editor umfassend beschreibt.</dd>
<dt>MasterEditorModel</dt>
<dd>Hat alle Eigenschaften eines Editor, darf darüber hinaus jedoch noch tollere Sachen mit dem System machen. Die Beschreibung der tolleren Sachen legen wir im MasterEditor ab. Das MasterEditorModel leiten wir vom EditorModel ab.</dd>
<dt>SysAdminModel</dt>
<dd>Der Systemadministrator hat wiederum andere Eigenschaften als der Editor. Es bietet sich daher an, ihm ein eigenes Modell zu gönnen.</dd>
<dt>WebUserModel</dt>
<dd>Der Webuser hat zwar keine speziellen Daten, die wir abspeichern müssen, jedoch ergibt es Sinn seine Eigenschaften in einer Modellklasse zu kapseln. Wenn wir für dieses Modell keine Daten abspeichern müssen, macht das im Prinzip ja nichts aus. Hauptsache wir können auf ein wohldefiniertes Modell zugreifen.</dd>
<dt>UserModel</dt>
<dd>Wir haben einen Editor, einen MasterEditor und einen SysAdmin im System. Von jedem dieser Akteure wollen wir den Vor- und Nachnamen, ein Passwort und einen Loginnamen. Die e-Mailadresse wäre auch noch schick, sonst wird die Kommunikation mit dem Anwender etwas schwierig <img src='http://www.baldenhofer.eu/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Aus diesem Grund habe ich die Eigenschaften, die bei jedem UserModell identisch sind, in eine eigene Klasse verbannt. Dann müssen wir das nur einmal programmieren.</dd>
<dt>NewsListModel</dt>
<dd>Wir werden (hoffentlich) ganz viele News im System haben. Wenn wir beim Suchen immer durch alle Newseinträge einzeln durchscrollen müssen, werden wir vermutlich Performanceprobleme bekommen. Bei diesem Modell stelle ich mir eine Liste vor, in der die jeweiligen NewsModelle verlinkt werden.</dd>
<dt>NewsModel</dt>
<dd>Hier werden die einzelnen Newseinträge abgelegt und verwaltet. Jede News erhält ein solches Modell.</dd>
<dt>ImageModel</dt>
<dd>Verwaltet die einzelnen Datensätze eines Bildes. Ein Bild ist ein relativ komplexes Gebilde bei dem der Link zum Bild, der alternative Text und ein Titel abgespeichert werden sollen. Da ist ein Modell sicherlich sinnvoll.</dd>
<dt>ImageListModel</dt>
<dd>Einzelne Bilder werden in verschiedenen Newseinträgen vorkommen. Irgendwie habe ich das Gefühl, dass es sinnvoll wäre wenn wir uns die Information, wo ein Bild verwendet wird, irgendwie zugreifbar verwalten. Bei Löschen eines Bildes können wir so darauf hinweisen, dass dieses Bild eigentlich noch benötigt wird. Weiterhin können wir Bilder darstellen, die in keinem Newseintrag verwendet werden. (Hups! ein neuer Anwendungsfall <img src='http://www.baldenhofer.eu/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  )</dd>
</dl>
<hr /><h2>Ähnliche Beiträge</h2><ul></ul><hr /><small>www.baldenhofer.eu © seit 2009 <br />
Dieser Feed kommt vom <a href="http://www.baldenhofer.eu/blog">Guggat emol Blog</a>, viel Spa&#223; beim Lesen! &#220;ber  Links zu Artikeln freuen wir uns, jedoch bitte bindet nicht einfach unsere Inhalte in eure Seite ein, danke. Hinweis für Feedleser: Beiträge, die Quellcode enthalten sind auf der Webseite meist besser lesbar, als in einem Feed-Reader. 
<br /> 4e3744397ab2a417f811b29573bcbef4)</small>]]></content:encoded>
			<wfw:commentRss>http://www.baldenhofer.eu/blog/it/programmieren/geschaeftsmodelle-erkennen/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[Newssystem]]></series:name>
	</item>
		<item>
		<title>Newssytem Daten Modellieren</title>
		<link>http://www.baldenhofer.eu/blog/guggat_emol/newssytem-daten-modellieren</link>
		<comments>http://www.baldenhofer.eu/blog/guggat_emol/newssytem-daten-modellieren#comments</comments>
		<pubDate>Mon, 06 Apr 2009 20:48:49 +0000</pubDate>
		<dc:creator>Roland</dc:creator>
				<category><![CDATA[Guggat emol]]></category>
		<category><![CDATA[model]]></category>
		<category><![CDATA[Newssystem]]></category>
		<category><![CDATA[Programmieren]]></category>

		<guid isPermaLink="false">http://www.baldenhofer.eu/blog/?p=734</guid>
		<description><![CDATA[Ich bin der Meinung wir können so allmählich mal mit der Datenmodellierung anfangen. Falls sich dann während der Beschreibung unserer technischen Anwendungsfälle noch was ändert, wissen wir ja wo der &#8220;Edit&#8221; Button ist Wie gehe ich beim Datenmodellieren vor? Ich bin da ziemlich einfach strukturiert. Ich nehme die beschriebenen Anwendungsfälle und schau mir an welche [...]]]></description>
			<content:encoded><![CDATA[<p>Ich bin der Meinung wir können so allmählich mal mit der Datenmodellierung anfangen. Falls sich dann während der Beschreibung unserer technischen Anwendungsfälle noch was ändert, wissen wir ja wo der &#8220;Edit&#8221; Button ist <img src='http://www.baldenhofer.eu/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>Wie gehe ich beim Datenmodellieren vor?</h3>
<p>Ich bin da ziemlich einfach strukturiert. Ich nehme die beschriebenen Anwendungsfälle und schau mir an welche Objekte ich mir im System vorstelle.<br />
Diese Objekte stelle ich grafisch, z.B. mit Visio, oder Enterprise Architect, dar. Dann schaue ich mit die Relationen zwischen den Objekten an und sammle aus den Anwendungsfällen heraus die bekannten Attribute.<br />
Kurz gesagt: Ich sichte die bisherigen Definitionen und sammle die zu speichernden Elemente.</p>
<h3>Wo fangen wir an?</h3>
<p>Ich habe die Beschreibung des Newssystems als Serie gestaltet. Wir können also einfach die Serie aufrufen und den Roman von Anfang an durchlesen.<br />
Wenn du das machst, wirst du über den Artikel <a href="http://www.baldenhofer.eu/blog/it/programmieren/anwendungsfall-add-category">Anwendungsfall Add Category</a> stolpern.<br />
Ja wirklich! Ich will das bisher geschriebene wirklich nochmal lesen und anwenden <img src='http://www.baldenhofer.eu/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h3>Was können wir aus der Anwendungsfallbechreibung herausholen?</h3>
<p>In dem Anwendungsfall habe ich viele Attribute beschrieben, die wir zum Verwalten haben.</p>
<ul>
<li>Kategorie ID<br />
Eine eindeutige ID mit der diese Kategorie später in den jeweiligen Seiten aufgerufen werden kann. Wenn diese ID angelegt wurde, kann sie nicht mehr verändert werden. Erst wenn die Kategorie gelöscht wird, wird auch diese eindeutige ID aus dem System entfernt.</li>
<li>Kategorie Bezeichnung<br />
Kurze Bezeichnung anhand derer diese Kategorie wiedergefunden werden kann. Diese Bezeichnung soll nicht länger als 100 Zeichen beinhalten.</li>
<li>Kategorie Beschreibung<br />
Ein freier Text mit dem die Kategorie genauer beschrieben wird. Die Beschreibung soll nicht länger als 1000 Zeichen lang sein.</li>
<li>Editoren der Kategorie<br />
Die einzelnen Editoren, die zu einer Kategorie Texte schreiben dürfen, werden hier aufgelistet. Vom jeweiligen Editor werden die Editor ID hier abgelegt.</li>
<li>Archivsuche<br />
Angabe, ob News die in dieser Kategorie eingetragen wurden, als Archiveinträge dargestellt werden dürfen oder nicht. Falls dieses Attribut gesetzt ist, können News mit den Anwendungsfällen “Navigate Archive News Shortentries” und “Show Archive Newsentry” dargestellt werden. Nicht mehr aktive Newseinträge können ansonsten nur von den Anwendungsfällen “Editor Use Case” eingesehen werden.</li>
<li>Bildgröße<br />
Angabe wie groß ein Bild für diese Kategorie sein soll. Diese Angabe ist eine Breiten und Höhenangabe.</li>
</ul>
<p>Diese Attribute geben schon einmal Anhaltspunkte was für Daten wir zu speichern haben.<br />
Bevor wir jedoch ganz tief in die Attributebene eintauchen, gehen wir zuerst einmal in den Anwendungsfällen weiter und schauen welche Attribute und Objekte wir sonst noch so haben.<br />
Ich nehme mir die einzelnen Objekte heraus und versuche eine erste Modellierung.</p>
<hr /><h2>Ähnliche Beiträge</h2><ul></ul><hr /><small>www.baldenhofer.eu © seit 2009 <br />
Dieser Feed kommt vom <a href="http://www.baldenhofer.eu/blog">Guggat emol Blog</a>, viel Spa&#223; beim Lesen! &#220;ber  Links zu Artikeln freuen wir uns, jedoch bitte bindet nicht einfach unsere Inhalte in eure Seite ein, danke. Hinweis für Feedleser: Beiträge, die Quellcode enthalten sind auf der Webseite meist besser lesbar, als in einem Feed-Reader. 
<br /> 4e3744397ab2a417f811b29573bcbef4)</small>]]></content:encoded>
			<wfw:commentRss>http://www.baldenhofer.eu/blog/guggat_emol/newssytem-daten-modellieren/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<series:name><![CDATA[Newssystem]]></series:name>
	</item>
	</channel>
</rss>

