Forum: Projekte & Code PART-DB RW 1.2


von Gelöscht (kami89)


Lesenswert?

So, jetzt siehts gut aus. Ich habe die Änderungen nun doch direkt ins 
SVN geladen, mit "RabbitVCS" ist das ja echt komfortabel :-)

Da der Footprint Ordner "zzz_obsolete" nun nicht mehr gebraucht wird, 
habe ich den gelöscht (bzw. RabbitVCS ist dran, sofern er sich nicht 
aufgehängt hat^^)

Ich hoffe jetzt mal dass das Update bei allen einwandfrei funktioniert 
und die Footprints immernoch korrekt angezeigt werden.

Übrigens haben Bert (b.r.) und ich heute mal Gedanken zu einigen 
geplanten Änderungen (Footprints, Dateiupload, ...) gemacht. Ich werde 
in unseren Issues auf Google Code noch reinschreiben wie wir uns das so 
vorstellen.

Ausserdem werde ich beim Footprint-Issue noch vermerken was ich jetzt 
schon gemacht habe und was noch fehlt.

P.S.
Mit den Variablennamen hatte ich manchmal ein ganz schönes 
Durcheinander. Meiner Meinung nach würde es nicht schaden, wenn wir die 
Variablen etwas aussagekräftiger gestalten würden ;-)

von tb-netbook (Gast)


Lesenswert?

Jap hört sich alles gut an schaue es mir heute Abend an, die Alten FP 
gibt es ja noch als Archiv im DL bereich, also raus damit.

Irgentwas muss trotzdem an den FP Parser geändert werden ab 40 Listen 
einträgen scheitert das ganze an der PHP-Runtime (30s), das ist extrem 
langsam, man sieht das recht gut an der Demo-DB.

Die Tage habe ich auch wieder etwas Zeit, auf Arbeit ist so gut wie 
nichts zu tun gut das ich fast unkündbar bin, da werde ich mir dann 
wieder mit der Part-DB die Zeit vertreiben.

von Udo N. (weinbauer73)


Lesenswert?

@tb-netbook

An welcher Stelle ist das mit dem FP-Parser zu finden? Vielleicht finde 
ich beim schnellen Drüberschauen das Problem.

@Urban

Es bezog sich ja auf den aktuellen Stand meiner Umsetzung :-)

von Gelöscht (kami89)


Lesenswert?

tb-netbook schrieb:
> Irgentwas muss trotzdem an den FP Parser geändert werden ab 40 Listen
> einträgen scheitert das ganze an der PHP-Runtime (30s), das ist extrem
> langsam, man sieht das recht gut an der Demo-DB.

Das liegt daran, dass momentan die Footprint-Bilder noch im ganzen 
tools/footprints Ordner rekursiv gesucht werden. Da haben Bert und ich 
aber auch eine Lösung parat, ich schreib sie nachher gleich in unsere 
Issues Liste hinein.

Udo Neist schrieb:
> @Urban
>
> Es bezog sich ja auf den aktuellen Stand meiner Umsetzung :-)

OK das habe ich nun vermutet :-D

von Udo N. (weinbauer73)


Lesenswert?

Urban B. schrieb:
> tb-netbook schrieb:
>> Irgentwas muss trotzdem an den FP Parser geändert werden ab 40 Listen
>> einträgen scheitert das ganze an der PHP-Runtime (30s), das ist extrem
>> langsam, man sieht das recht gut an der Demo-DB.
>
> Das liegt daran, dass momentan die Footprint-Bilder noch im ganzen
> tools/footprints Ordner rekursiv gesucht werden. Da haben Bert und ich
> aber auch eine Lösung parat, ich schreib sie nachher gleich in unsere
> Issues Liste hinein.

Mit folgendem Code durchsuche ich ein Verzeichnis rekursiv nach Dateien. 
Das geht recht fix, da die Funktion sich bei jedem Unterverzeichnis 
wieder selbst aufruft. Hab ich irgendwo im Netz gefunden. Die Funktion 
ist aus einer Klasse, daher das "$this->" ;-)
1
function readDir($path = '.',$search = '',$options=array('mime'=>array(),'recursive'=>true,'onlyfiles'=>false)) {
2
/*
3
  Durchforstet das übergebene Verzeichnis rekursiv nach Dateien
4
5
  * Variablen
6
  $this -> files (array): Container für Dateien
7
  $path (string): Suchpfad (Default: .)
8
  $search (string): Suchmuster für preg_match()
9
  $options (array):
10
    recursive (bool): Rekursiv suchen
11
    onlyfiles (bool): Nur Dateien
12
    mime (string): Mimetyp
13
14
  * Rückgabe
15
  $this -> files (array): Liste der Ergebnisse mit absoluten Pfad
16
17
  * Anforderung
18
  Kein Datenbanklink erforderlich!
19
20
  * Anmerkung
21
  Der Punkt ist das aktuelle Verzeichnis, ".." kennt man als "Verzeichnis höher" und "dir/" als "Verzeichnis tiefer".
22
23
*/
24
25
  // $this->files wird initialisiert, falls noch nicht geschehen
26
  if (!is_array($this -> file)) $this -> file = array();
27
28
  // Pfad setzen
29
  $dir = dir($path);
30
  // Pfad durchsuchen
31
  while (($file = $dir->read()) !== false) {
32
    // Verzeichnisebenen überspringen
33
    if ($file =='.' || $file =='..') continue;
34
    if (is_dir($path."/".$file) && $options['recursive']===true) {
35
      // Falls Verzeichnis, dann rekursiv die Funktion nochmal aufrufen
36
      $this -> readDir($path."/".$file,$search,$options);
37
    }else{
38
      if (count($options['mime'])>0 && is_file($path."/".$file)) {
39
        if (function_exists(finfo_file)) {
40
          $finfo = finfo_open(FILEINFO_MIME); // return mime type ala mimetype extension
41
          $mime = finfo_file($finfo, $path."/".$file);
42
          finfo_close($finfo);
43
          $mime = explode('; ',$mime);
44
          if (!in_array($mime[0],$options['mime'])) continue;
45
        }elseif (function_exists(mime_content_type)) {
46
          if (!in_array(mime_content_type($path."/".$file),$options['mime'])) continue;
47
        }
48
      }
49
      if (preg_match('/'.$search.'/i',$file)==1) {
50
        // Bei Treffer in das Array $this->files aufnehmen,
51
        // aber abhängig von $options['onlyfiles'] wird entweder alles oder nur Files aufgenommen
52
        if (($options['onlyfiles']===true && !is_dir($path."/".$file)) || $options['onlyfiles']===false) $this -> files[] = $path."/".$file;
53
      }
54
    }
55
  }
56
  // Verzeichnishandler schliessen
57
  $dir->close();
58
}

von Gelöscht (kami89)


Lesenswert?

So, ich denke das Wichtigste aus der Diskussion von Bert und mir hab ich 
jetzt in unsere Issues übertragen. Es geht um die Issues 12 und 14.

@Udo Neist
Danke für den code, aber ich denke der ist nicht notwendig, weil eben 
eigentlich gar nicht mehr nach den Bildern gesucht werden muss, sobald 
die noch anstehenden Änderungen durchgeführt wurden.

von Udo N. (weinbauer73)


Lesenswert?

Wenn man es besser machen kann, dann ist jeder Code zuviel ;-)

von b.r (Gast)


Lesenswert?

Hallo Udo,

Udo Neist schrieb:
> Der Server
> erlaubt keine Ausführung von shell_execute(). Ich habe die Funktion
> durch folgendes ersetzt:
Die Zeichenkette in .svn/entries ist leider nicht das selbe wie 
"svnversion".
Auf einem Webspace, wo das Projekt nur ausgecheckt und nicht verändert 
wird passt es. Aber lokal zeigt mir svnversion z.B. Folgendes an:
1
$ svnversion 
2
476M

Vielleicht kann man erst prüfen, ob shell_exec geht und dann in 
.svn/entries reinschauen?

Grüße
b

von Udo N. (weinbauer73)


Lesenswert?

Ein bisschen umgestellt und schon funktioniert es :)
1
if ( ! $repo_version = shell_exec( 'svnversion') )
2
{
3
  if ( file_exists('.svn/entries') )
4
  {
5
    $svn = File('.svn/entries');
6
    $repo_version = $svn[3];
7
    unset($svn);
8
  }
9
}
10
return( $repo_version );

von b.r (Gast)


Lesenswert?

Udo Neist schrieb:
> An welcher Stelle ist das mit dem FP-Parser zu finden? Vielleicht finde
> ich beim schnellen Drüberschauen das Problem.
In lib.php.
Das Problem bisher ist, die Footprints sind über einige Verzeichnisse 
verteilt und müssen über den Dateinamen gesucht werden. Und das kann bei 
vielen Einträgen/langen Listen dauern.

Urban und ich arbeiten aber gerade an dem Problem. Der Fundort wird 
demnächst mit in der Datenbank abgelegt. Dann sollte das 
Geschwindigkeitsproblem erledigt sein.

Grüße
b

von Udo N. (weinbauer73)


Lesenswert?

Das mit der Datenbank wäre auch meine Idee. Einmal über ein Menüpunkt in 
den Einstellunge und bei der ersten Inbetriebnahme das Verzeichnis 
scannen und dann dürfte das auch schneller gehen. Diese Daten dürften 
sich ja nicht sonderlich oft ändern.

von b.r (Gast)


Lesenswert?

Udo Neist schrieb:
> Ein bisschen umgestellt und schon funktioniert es :)
Wunderbar. Revision -> 477

b

von b.r (Gast)


Lesenswert?

Udo Neist schrieb:
> Mit folgendem Code durchsuche ich ein Verzeichnis rekursiv nach Dateien.
Es wird momentan schon rekursiv gesucht. Wo alles noch in einem 
Verzeichnis lag, war das auch akzeptabel. Wie gesagt, es wird dran 
gearbeitet :-)

b

von b.r (Gast)


Lesenswert?

Urban B. schrieb:
> P.S.
> Mit den Variablennamen hatte ich manchmal ein ganz schönes
> Durcheinander. Meiner Meinung nach würde es nicht schaden, wenn wir die
> Variablen etwas aussagekräftiger gestalten würden ;-)
Nur zu!

Udo Neist schrieb:
> Bei mir steht nur das Grundgerüst und die ersten Umstellungen. Ich kam
> diese Woche noch nicht dazu weiter zu machen.
Wie wäre es, wenn Du die Template-Geschichte als Branch im 
SVN-Repository anlegst? Da bleibt der Code an einer zentralen Stelle und 
per "svn switch" kann man ihn auch schnell mal ausprobieren.

Grüße
b

von Udo N. (weinbauer73)


Lesenswert?

Ich hab mit SVN und Co leider kaum gearbeitet. Wenn mir das einer mal 
kurz erklärt, dann gerne :)

von Jens Fischer (Gast)


Lesenswert?

Udo Neist schrieb:
> Ich hab mit SVN und Co leider kaum gearbeitet. Wenn mir das einer mal
> kurz erklärt, dann gerne :)
Womit entwickelst Du? Linux? Mac? Windows?
Diverse Tutorials gestern da durch's Netz...

b

von Udo N. (weinbauer73)


Lesenswert?

Unter Linux. Ich hatte mal ein SVN eingerichtet, aber kaum genutzt. 
Bisher hab ich immer mindestens zwei Kopien gehabt und kein Repo 
benötigt.

Ich werde mir aber mal ein paar Howtos anschauen. Eventuell habt ihr ja 
ein vernünftiges, da ja so mancher Schrott im Inet existiert.

von Gelöscht (kami89)


Lesenswert?

@b.r und an alle :-)

Ich habe jetzt in der tools/footprints.php die Checkbox zum 
hinzufügen/löschen von Footprints vorübergehend mal deaktiviert.

Ich denke es ist besser, wenn wir die Funktion erst wieder aktivieren 
wenn es eine gescheite Sicherheitsabfrage beim Löschen gibt :-)

Und eine Anpassung an die neue Datenbankstruktur (Spalte "filename") ist 
auch noch notwendig.

@Udo Neist
Ich habe heute auch zum ersten mal mit SVN gearbeitet. Dazu habe ich im 
Internet "RabbitVCS" gefunden, das integriert sich in Nautilus und macht 
es einem echt leicht, kann ich nur empfehlen :-)

von Udo N. (weinbauer73)


Lesenswert?

Ich hab hier Dolphin (KDE4) und irgendwo ein kdesvn. Aber sowas mach ich 
am liebsten von der Konsole aus :-)

Ich denke, ich brauch auch noch Zugangsdaten?

von b.r (Gast)


Lesenswert?

Udo Neist schrieb:
> Ich hab hier Dolphin (KDE4) und irgendwo ein kdesvn. Aber sowas mach ich
> am liebsten von der Konsole aus :-)
Ich nehm auch (fast) immer die Konsole. Außer unter Windows. Da 
integriert sich TortoiseSVN sehr gelungen in den Explorer.

> Ich denke, ich brauch auch noch Zugangsdaten?
Frag mal bei K.J.
Evtl. geht es nur mit goole-Account.

Grüße
b

von Udo N. (weinbauer73)


Lesenswert?

Google Account hab ich :-) Ich kann es ja mal auf meinem eigenen Server 
austesten.

von Gelöscht (kami89)


Lesenswert?

Kennt von euch zufälligerweise jemand einen Datei-Öffnen-Dialog, bei dem 
man eine Datei, die auf dem Server liegt, auswählen kann?
Bilder sollen wenn möglich auch gleich im Dialog angezeigt werden, 
sofern eine Bilddatei angewählt wird.

Im Internet finde ich überhaupt nichts derartiges...

von Udo N. (weinbauer73)


Lesenswert?

Urban B. schrieb:
> Kennt von euch zufälligerweise jemand einen Datei-Öffnen-Dialog, bei dem
> man eine Datei, die auf dem Server liegt, auswählen kann?
> Bilder sollen wenn möglich auch gleich im Dialog angezeigt werden,
> sofern eine Bilddatei angewählt wird.
>
> Im Internet finde ich überhaupt nichts derartiges...

Ist mir auch keines bekannt. Mach ich über eine Listbox, die ich zuvor 
gefüllt habe.

von Gelöscht (kami89)


Angehängte Dateien:

Lesenswert?

Also für die Zuweisung eines Bildes zu einem Footprint brauchen wir 
jetzt ja einen Dialog, bei dem man die Serververzeichnisse durchsuchen 
kann. Da man dafür wohl am besten gleich den Dialog für den universellen 
Dateiupload (der noch nicht existiert xD) benutzt, habe ich mir mal 
Gedanken gemacht wie der etwa aussehen könnte (siehe Anhang). 
Kritik/Verbesserungsvorschläge sind erwünscht.

Der Dialog müsste beim Schliessen einfach dem aufrufenden Fenster den 
Dateipfad der markierten Datei übermitteln.

Ich hab mal selber ein bisschen probiert sowas zu bauen, aber mit meinen 
mageren php-Kenntnissen wird das nichts ;-)

Gibts Freiwillige? :-D

EDIT:
Ach ja, das Umbenennen/Löschen/Kopieren/Hochladen ist nur im Ordner 
media/ erlaubt. Auf die anderen beiden Ordner hat der User nur 
Lesezugriff.

von Udo N. (weinbauer73)


Lesenswert?

Sowas wäre wohl ein Fall für Ajax (Javascript) :-) Das wäre dann auch 
der Grund für die Beseitigung der Frames (sind obsolete und sollen 
irgendwann von den Browsern nicht mehr unterstützt werden).

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
> Sowas wäre wohl ein Fall für Ajax (Javascript) :-) Das wäre dann auch
> der Grund für die Beseitigung der Frames (sind obsolete und sollen
> irgendwann von den Browsern nicht mehr unterstützt werden).

Okay, also definitiv nichts für mich :-)

Ich habe übrigens jetzt (r479) unter Konfiguration/Datenbank die 
Möglichkeit eingefügt, direkt ein Backup von der Datenbank zu erzeugen 
und auf dem Server unter backup/ abzulegen. Auch kann man jedes 
existierende Backup herunterladen oder löschen.

Ich hoffe das funktioniert bei euch auch ;-)

von Gelöscht (kami89)


Lesenswert?

Ist ja richtig ruhig hier im Moment :-D

Ich war mal wieder fleissig am Arbeiten, und ich muss schon sagen, so 
langsam fang ich an PHP zu mögen :-)

Die Umstellung auf die vollständigen Dateinamen habe ich jetzt ins SVN 
geladen (r480). Die Footprintbilder werden jetzt nicht mehr im ganzen 
footprint-Ordner gesucht, sondern es wird direkt die Datei genommen, 
deren Pfad in der Datenbank abgelegt ist (beim entsprechenden 
Footprint).

Das Laden der Liste sollte jetzt also einiges schneller gehen.

Nach dem Update funktionieren kurzfristig jedoch alle Footprint-Bilder 
nicht mehr. Aber keine Panik, das ist nicht schlimm :-) Auf der 
Startseite sollte gleich der Hinweis kommen, dass es fehlerhafte 
Dateinamen für die Footprintbilder gibt. Unter Bearbeiten/Footprints 
werden all diese fehlerhaften Footprints aufgelistet und falls 
vorhanden, gleich passende Dateien vorgeschlagen.

Eigentlich müsst ihr diese Vorschläge gar nicht überprüfen. Wenn ihr 
einfach auf "Alle Übernehmen" klickt sollte nachher alles wieder genau 
so sein wie vor der Umstellung. Dass einige Pfade gelöscht werden sieht 
zwar schlimm aus, ist es aber nicht, da die entsprechenden Footprints 
schon vorher kein Bild sollten gehabt haben.

Wenn ihr aber auf "markierte übernehmen" klickt, werden schonmal alle 
Footprints, die vorher ein Bild hatten, wieder mit dem richtigen Bild 
verknüpft. Danach habt ihr gleich noch eine Liste von Footprints, die 
schon vorher kein Bild hatten. Diese können dann mit den Dropdown-Listen 
ganz einfach mit einem Bild verknüpft werden, falls gewünscht.

Ich habe es bei mir gründlich durchgetestet, und ich konnte keine Fehler 
mehr entdecken. Eine Datenbanksicherung vor der Übernahme kann aber 
trotzdem nicht schaden ;-)

mfg

von Udo N. (weinbauer73)


Lesenswert?

Ich hab mir die 479er gezogen und werde die Änderungen dort einpflegen. 
Die Version 12 der Datenbank habe ich auch schon als create.sql 
gesichert, damit man nicht erst die alte Version installieren und dann 
updaten muss. Ich werde wohl noch eine install.php erstellen, die die 
Ersteinrichtung erleichtert.

Wenn ich die Migration von 446 auf 479 abgeschlossen habe, werde ich 
diese dann auch ins SVN kopieren.

Grüße
Udo

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
> Ich hab mir die 479er gezogen und werde die Änderungen dort einpflegen.

Heisst das, die Änderungen von r480 sind dann wieder weg?
Die Revision 480 ist eigentlich relativ wichtig, da dort das neue 
Footprintsystem mehr oder weniger fertig implementiert ist (sobald der 
neue Upload-Dialog vorhanden ist, muss der noch mit dem Footprintsystem 
"verknüpft" werden, aber sonst ist es soweit fertig).

Ich wäre noch froh um Feedback ob die Umstellung aufs neue 
Footprintsystem problemlos funktioniert hat, und vor allem ob nun die 
Auflistung vieler Teile viel schneller geht als vorher (einige hatten ja 
Probleme dass bereits Timeouts eingesetzt haben, die hatte ich jedoch 
nicht).

mfg

von Udo N. (weinbauer73)


Lesenswert?

Ich kann auch die 480 nehmen, hab die 479 am Donnerstag auf mein Büro-PC 
geladen. Hab ja nur einen kleinen Teil anpassen können bisher.

von Gelöscht (kami89)


Lesenswert?

ah okay das wär nicht schlecht ;-)
Oder auch gleich r481, aber da hab ich nur der Hinweis bei den 
Footprints eingefügt, dass es empfohlen wäre vor dem automatischen 
Korrigieren der Dateinamen eine Datenbanksicherung durchzuführen :-D
Den hab ich sicherheitshalber mal eingefügt damit man theoretisch wieder 
aufs alte System wechseln könnte, falls irgendwas schiefgelaufen wäre.

Ach ja, sofern niemand reklamiert ich hätte mit r480 seine Datenbank 
zerschossen, werde ich das SVN in nächster Zeit in Ruhe lassen ;-) Du 
kannst also deine Migration durchführen ohne dass ich wieder dazwischen 
funke ;-)

von Udo N. (weinbauer73)


Lesenswert?

Warum nicht gleich bei einem Update der Datenbank ein Backup 
durchführen? Da muss der User nicht das per Hand anwerfen.

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
> Warum nicht gleich bei einem Update der Datenbank ein Backup
> durchführen? Da muss der User nicht das per Hand anwerfen.

Die Idee hatte ich auch schon. Aber die Revision 480 beinhaltet gar kein 
Datenbankupdate, würde dann also keine automatische Sicherung auslösen 
;-)
Und extra ein DB-Update "simulieren" finde ich nicht sehr schön...

Die Umstellung der Footprint-Dateinamen auf vollständige Pfadangaben 
passiert ja eh nicht automatisch, sondern muss manuell durchgeführt 
werden. Daher denke ich reicht auch ein kleiner Hinweis inkl. Link auf 
die Seite, auf der man jetzt ja ganz einfach per Mausklick eine 
Sicherung erstellen lassen kann.

von Udo N. (weinbauer73)


Lesenswert?

Urban B. schrieb:
> Udo Neist schrieb:
>> Warum nicht gleich bei einem Update der Datenbank ein Backup
>> durchführen? Da muss der User nicht das per Hand anwerfen.
>
> Die Idee hatte ich auch schon. Aber die Revision 480 beinhaltet gar kein
> Datenbankupdate, würde dann also keine automatische Sicherung auslösen
> ;-)

Ich würde in dem Fall zwei DB-Updates definieren. Ein Major-Update mit 
Versionsänderung und ein Minor-Update mit Änderungen auf 
System-/Datenebene.

> Und extra ein DB-Update "simulieren" finde ich nicht sehr schön...

Geht schneller als man denkt. Einfach ein mysqldump vor dem Update auf 
der Kiste durchführen und nach dem Update schauen, ob alles geht. Wenn 
nicht einfach den Dump mit "mysql <dump.sql" zurückspielen (User, 
Passwort und Datenbank angeben nicht vergessen). Dazu braucht man kein 
phpMyAdmin.

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
> Ich würde in dem Fall zwei DB-Updates definieren. Ein Major-Update mit
> Versionsänderung und ein Minor-Update mit Änderungen auf
> System-/Datenebene.

Wär auch eine Möglichkeit. Ich notier das mal in unseren Issues.

> Geht schneller als man denkt. Einfach ein mysqldump vor dem Update auf
> der Kiste durchführen und nach dem Update schauen, ob alles geht. Wenn
> nicht einfach den Dump mit "mysql <dump.sql" zurückspielen (User,
> Passwort und Datenbank angeben nicht vergessen). Dazu braucht man kein
> phpMyAdmin.

Jo, stimmt. Eine Sicherung durchführen geht jetzt ja auch schon ohne 
phpMyAdmin, falls du das noch nicht mitgekriegt hast ;-) Die 
Möglichkeit, eine Sicherung wiederherzustellen kommt auch noch.

von Udo N. (weinbauer73)


Lesenswert?

Ich habe heute die Revision 483 angefangen umzustellen und bereits einen 
Teil geschafft. Nur klappt es mit dem Anlegen eines Branches nicht. 
Google wirft mich mit Fehler 405 raus. Ich denke, man müsste mich noch 
in die Liste der Committer aufnehmen :(

von Udo N. (weinbauer73)


Lesenswert?

Nachdem ich ein paar Infos über Googlecode und Subversion gelesen und 
noch einen Gmail-Account erstellt habe, werde ich beim Kopieren des 
Hauptzweiges in ein Branch bzw. beim Import mit "access forbidden" 
rausgeworfen. Ich arbeite auf der Konsole.

von b.r (Gast)


Lesenswert?

Udo Neist schrieb:
> Ich denke, man müsste mich noch
> in die Liste der Committer aufnehmen :(
Bist Du denn hier schon drin: 
http://code.google.com/p/part-db/people/list
Falls nicht, schick doch theborg mal 'ne Mail.

Grüße
b

von Udo N. (weinbauer73)


Lesenswert?

Ne, deswegen ja :) Ich stell morgen erstmal die neue Version auf "mein" 
Webspace, bis ich ein Zugang habe.

Udo

von K. J. (Gast)


Lesenswert?

haste ;-)

von Udo N. (weinbauer73)


Lesenswert?

Danke :-) Werde nachher die heutige Version ins Repo einstellen.

von Udo N. (weinbauer73)


Lesenswert?

Ich hab die Revision 483 in der Version 20120711 nach 
http://part-db.googlecode.com/svn/branches/uneist/ hochgeladen (-> 
Revision 484) und versuche gerade die Version 20120713 als Update 
einzustellen. Noch klappt das nicht, bin mit svn noch am kämpfen.

von Udo N. (weinbauer73)


Lesenswert?

Update erfolgreich. Version 20120713 als Revision 485 gespeichert.

Die Anleitungen zu svn sind teilweise unbrauchbar oder schwer 
verständlich. Warum schreibt denn niemand was vernünftiges? Arbeitskopie 
ist die lokale Kopie, die nach dem ersten Checkout entsteht. Führt zur 
Verwirrung, wenn man die Begriffe nicht kennt.

Hier mal ein kurze Zusammenfassung meiner Vorgehensweise für 
Konsolenfanatiker ;-)

A. Erster Import (wichtig, falls man neu beginnt)
1
svn import LOCALDIR URL
B. Kopie (Fork, Branch) erstellen (wenn man mit einer bestehenden 
Revision starten will)
1
svn copy URL URL2

Startet man komplett neu und hat bereits ein Repo angelegt (z.b. bei 
googlecode.com), so würde man mit Variante A beginnen. Startet man einen 
neuen Zweig, so würde sich Variante B anbieten.

Anschliessend erfolgt der erste Checkout.
1
svn checkout URL LOCALDIR

Für die tägliche Arbeit sind die nachfolgenden Schritte einzuhalten.

1. Einbindung neuer Dateien/Verzeichnisse im lokalen Verzeichnis
1
svn add * --force
2. Löschen einer Datei oder eines Verzeichnisses im lokalen Verzeichnis
1
svn delete FILE/DIR
3. Synchronisiert des lokalen Verzeichnises mit der URL (wird durch das 
Checkout gespeichert)
1
svn update
4. Freigabe des Updates
1
svn commit -m COMMENT

Die Schritte 1 und 2 werden nur benötigt, wenn sich im Verzeichnisbaum 
was ändert. Ändert man nur bestehende Dateien, so kann man direkt mit 
Schritt 3 beginnen. Allerdings gilt bei mehreren Committer im gleichen 
Zweig, dass man den Schritt 3 zuerst ausführt, um Änderungen im Repo 
auch in die eigene Arbeitskopie einfliessen zu lassen. Konflikte müssen 
dann mit den Werkzeugen von svn aufgelöst werden, bevor man weiter 
arbeitet. Danach führt man die Schritte 1 bis 4 aus.

Links: http://svnbook.red-bean.com/nightly/de/svn-book.html

Ich hoffe, ich habe die üblichen Schritte für svn recht gut rüber 
gebracht. Man könnte natürlich auch einen Wiki-Artikel daraus machen, da 
es hier ja auch einen svn -Server gibt.

von Stefan (Gast)


Lesenswert?

Ich habe heute abend mal die partDB installiert und finde sie wirklich 
prima. Super easy aufzusetzen und einfach zu durchschauen. Bis auf 
Kleinigkeiten ist es genau das, was ich immer gesucht habe !
Ich werde mal die "Kleinigkeiten" in loser Abfolge auflisten, so dass 
sich evtl. eine Diskussion über deren Sinnhaftigkeit ergibt.
- Footprint (1): das Bild in der ersten Spalte nervt -mich zumindest und 
an dieser Position- sehr, da immer wenn die Maus auf dem Weg zum Eintrag 
darüber kommt, das Bild groß aufpoppt und dann im Weg steht. Evtl. 
könnte das in die letzte Spalte verschieben.
- Footprint (2): Da an sich immer Abbildungen fehlen werden (SC70, SC74, 
MLF, Diode in 0603, ...) und nicht jeder Wert auf eine Abbildung legt, 
wäre ein alternatives Eingabefeld sinnvoll; damit kann man auch ohne 
Vorhandensein eines Footprints das Gehäuse für die Listenansicht 
spezifizieren.
- Eingabefeld Preis: ich hätte gern noch eine Menge, auf die sich der 
Preis bezieht. Prima wäre zusätzlich zum Preisfeld noch ein Feld 
'Kalkulationspreis' und 'Kalkulationsmenge', sowie 'Bestellmenge'. Dann 
könnte man eingeben: 49 Euro je 100 Stück, bei Bestellmenge 4000 Stück. 
Wenn sich der Stückpreis dann automatisch aus 49/100 ergibt, ware das 
nicht uncool ;)
- Ich wünschte mir eine Art Log, das anzeigt, wann und wie viele einer 
Baugruppe gebucht wurden. Dort könnte man eine Buchung -hoffentlich- 
auch rückgängig machen, sofern man aus Versehen mal 'was Falsches 
eingegeben hat.

Eine Frage noch: wenn man spendet, wem kommt das zu gute ?

Gruß, Stefan

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
> Die Anleitungen zu svn sind teilweise unbrauchbar oder schwer
> verständlich.

Deshalb nutze ich lieber GUIs, da braucht man keine Anleitung, da kann 
man einfach mal wild drauflosklicken und schauen was passiert :-D Und 
wenn sich der SVN-Client sogar noch in den Dateibrowser integriert und 
bei jeder einzelnen Datei anzeigt ob sie der aktuellsten SVN-Revision 
entspricht, ist das sogar auch noch sehr nützlich :-D

Stefan schrieb:
> - Footprint (1): das Bild in der ersten Spalte nervt -mich zumindest und
> an dieser Position- sehr, da immer wenn die Maus auf dem Weg zum Eintrag
> darüber kommt, das Bild groß aufpoppt und dann im Weg steht. Evtl.
> könnte das in die letzte Spalte verschieben.

Okay, das wäre dann also eine zusätzliche Konfigurationsmöglichkeit. Da 
die Konfiguration sowieso aus der config.php verschwinden und in die 
SQL-Datenbank verschoben werden soll, denke ich wir warten noch mit 
diesem Feature.
Da käme mir nämlich gerade eine ganz coole Idee in den Sinn: Es soll ja 
in Zukunft auch eine Benutzerverwaltung geben. Das würde dann 
ermöglichen, dass jeder Benutzer seine Spalten selber konfigurieren 
kann. Ich denke danach sollte jeder zufrieden sein mit der Tabelle :-)

Stefan schrieb:
> - Footprint (2): Da an sich immer Abbildungen fehlen werden (SC70, SC74,
> MLF, Diode in 0603, ...) und nicht jeder Wert auf eine Abbildung legt,
> wäre ein alternatives Eingabefeld sinnvoll; damit kann man auch ohne
> Vorhandensein eines Footprints das Gehäuse für die Listenansicht
> spezifizieren.

Ich denke das ist eine eher weniger gute Idee. Mal abgesehen davon, dass 
es etwas mühsam/unschön zum programmieren ist, hat man einige Nachteile. 
Wenn du nämlich mehreren Bauteilen den gleichen Footprint per manueller 
Eingabe zuordnest, sind sie voneinander völlig unabhängig, obwohl es 
immer um den gleichen Footprint geht. Du kannst also den Footprint nicht 
bei allen betroffenen Bauteilen auf einmal umbenennen, oder falls später 
mal das fehlende Bild dazukommt, kannst du es nicht direkt allen 
betroffenen Bauteilen zuordnen. Viel besser ist es, wenn du beim Anlegen 
eines neuen Bauteiles das Eingabefeld rechts benutzt um gleich einen 
neuen Footprint anzulegen. Das geht genau so einfach wie das von dir 
gewünschte Feature, hat aber die genannten Nachteile nicht.

Stefan schrieb:
> Eingabefeld Preis: ich hätte gern noch eine Menge, auf die sich der
> Preis bezieht. Prima wäre zusätzlich zum Preisfeld noch ein Feld
> 'Kalkulationspreis' und 'Kalkulationsmenge', sowie 'Bestellmenge'. Dann
> könnte man eingeben: 49 Euro je 100 Stück, bei Bestellmenge 4000 Stück.
> Wenn sich der Stückpreis dann automatisch aus 49/100 ergibt, ware das
> nicht uncool ;)

Die Angabe der Stückzahl habe ich auch schon im Sinn gehabt. Ich denke 
das lässt sich so einbauen. Wie der Preis dann in den Tabellen angezeigt 
wird ist halt Geschmackssache. Vermutlich wäre das beste, wenn dort nur 
der Einzelpreis steht, ohne Stückzahl. Das mit der Bestellmenge wird 
dann etwas komplizierter, wenn man es mit dem Preis verknüpfen will. 
Dann müsste es eigentlich ja fast die Möglichkeit geben, pro Bauteil 
mehrere Preise anzugeben (für verschiedene Bestellmengen). Wäre sicher 
nützlich für den professionellen Einsatz, aber gibt viel Aufwand. Mal 
schauen ob das was wird ;-)

Stefan schrieb:
> - Ich wünschte mir eine Art Log, das anzeigt, wann und wie viele einer
> Baugruppe gebucht wurden. Dort könnte man eine Buchung -hoffentlich-
> auch rückgängig machen, sofern man aus Versehen mal 'was Falsches
> eingegeben hat.

Keine schlechte Idee, vorallem auch im Bezug auf die Benutzerverwaltung 
die ja noch kommen soll. Dann könnten die "Admins" auch nachvollziehen 
was andere Leute so in der Datenbank "rumfummeln" und können 
Fehlbuchungen rückgängig machen. Würde ich als durchaus nützlich 
betrachten.

Stefan schrieb:
> Eine Frage noch: wenn man spendet, wem kommt das zu gute ?

Gute Frage ;-) Ich denke die Frage geht an K.J.

Danke für die Vorschläge, ich nehme sie mal in unsere TODO-Liste auf.

mfg

von Stefan . (xin)


Lesenswert?

> Das würde dann ermöglichen, dass jeder Benutzer seine Spalten selber
> konfigurieren kann. Ich denke danach sollte jeder zufrieden sein mit der
> Tabelle :-)
Würde ich auch als die beste Lösung betrachten. Zumal sich mein Problem 
mit den Abbildungen der Footprints wahrscheinlich eh' erledigt hat.

> Du kannst also den Footprint nicht bei allen betroffenen Bauteilen auf
> einmal umbenennen, oder falls später mal das fehlende Bild dazukommt,
> kannst du es nicht direkt allen betroffenen Bauteilen zuordnen.
> ...
> Viel besser ist es, wenn du beim Anlegen eines neuen Bauteiles das
> Eingabefeld rechts benutzt ...
Also 'Bild hochladen' erzeugt einen neuen Footprint ?  Dann ist ja alles 
in Ordnung. Ich finde -und jetzt nicht böse sein- dass hier eh' zu viel 
Wert auf die Abbildungen gelegt wird; 2/3 des Threads scheinen sich mit 
Footprints auseinanderzusetzen. Da ich weiß, wie ein 0603er oder ein 
MSOP10 aussieht, reicht mir die Angabe des FP im Klartext, also 
KERKO_0402 oder KERKO_0603. Deshalb werde ich einfach weiße-1-pixel-gifs 
als FP benutzen. Damit sollte sich dann auch meine Problematik mit den 
aufpoppenden Bildern erledigt haben.

Also mehrere Preise brauche ich nicht; alternative Bauteile anderer 
Hersteller könnte ich ggf. in den Kommentaren unterbringen, nur ist eben 
die Preisangabe so wie bisher umgesetzt, eher auf den Reichelt-Besteller 
ausgerichtet. Das soll nicht abwertend sein (!), sondern nur 
verdeutlichen, dass andere Anwender auch andere Anforderungen haben :) 
Bei der von mir vorgeschlagenen Erweiterung handelt es sich im Grunde 
genommen ja auch nur um 3 neue Datenbankfelder und Minimalarithmetik. 
Jedoch geben viele Anbieter den Preis bezogen auf 100 an. Und zu 
vermerken, ab welcher Stückzahl der genannte Preis gilt, ist immer 
hilfreich, da Mouser, Farnell, Digikey, Schukat und eigentlich alle 
außer Reichelt mit Staffelpreisen arbeiten.
Btw: kann man eigentlich einstellen, dass der Preis in Cent angegeben 
wird ?  0.0011 Euro liest sich einfach bescheiden. Da muss ich immer 
erst lange nachdenken, bevor ich weiß, was das Bauteil wirklich kostet 
;)

Eine Log-Tabelle für abgebuchte Baugruppen, mit Korrekturmöglichkeit, 
halte ich für sehr wichtig und würde für die Implementierung auch 
bezahlen.

André hat geschrieben:
> Mich hatt es gestört, dass ich die Datenblätter nicht vom aktuellen
> Rechner hochladen konnte, sodass ich den Code in Anlehnung an die Bilder
> umgeändert habe, so dass man zusätzlich Datenblätter in den Ordner
> hochladen kann der in der config.php als datasheet_path angegeben ist.
> Es wäre bei den Datenblättern noch gut, wenn man einen Titel eingeben
> könnte (der originale Dateiname würde meist schon reichen), vielleicht
> passe ich das noch an. (datasheet.patch)

Stört mich auch sehr. Ich habe die V2.2 installiert, bei der diese 
Funktion leider nicht vorhanden ist. Ist dieser Patch nie eingeflossen ?

von K. J. (Gast)


Lesenswert?

Urban B. schrieb:
> Stefan schrieb:
>> Eine Frage noch: wenn man spendet, wem kommt das zu gute ?
>
> Gute Frage ;-) Ich denke die Frage geht an K.J.
>
> Danke für die Vorschläge, ich nehme sie mal in unsere TODO-Liste auf.
>
> mfg

Hm ist bis jetzt noch nicht Passiert ;-) da hab ich mir noch keine 
Gedanken drum gemacht, ich würde es einfach erstmal sammeln, 
ursprünglich war es gedacht damit ich damit meinen Server Finanzieren 
kann jetzt wo so viele andere mitmachen müsste man sich da was 
überlegen.

von Gelöscht (kami89)


Lesenswert?

Stefan --- schrieb:
>> Du kannst also den Footprint nicht bei allen betroffenen Bauteilen auf
>> einmal umbenennen, oder falls später mal das fehlende Bild dazukommt,
>> kannst du es nicht direkt allen betroffenen Bauteilen zuordnen.
>> ...
>> Viel besser ist es, wenn du beim Anlegen eines neuen Bauteiles das
>> Eingabefeld rechts benutzt ...
> Also 'Bild hochladen' erzeugt einen neuen Footprint ?  Dann ist ja alles
> in Ordnung.

Nein, nicht "Bild hochladen". Wenn du ein neues Bauteil anlegst gibt es 
auf der rechten Seite die Möglichkeit den gewünschten Footprint in das 
Feld "Direkteingabe/Neu" einzutippen. Ist der eingetippte Footprint 
schon in der Datenbank vorhanden (ob mit oder ohne Bild) wird dieser dem 
Bauteil zugewiesen. Ist der Footprint noch nicht vorhanden, wird er 
direkt neu angelegt und dann dem Bauteil zugewiesen. Verstehst du wie 
ich meine? Oder habe ich dich irgendwie falsch verstanden?

Footprint und Footprint-Bild haben erstmal nichts miteinander zu tun, 
das wissen viele nicht. Die Footprintverwaltung ist einfach dazu da, 
dass die Footprints auch gescheit mit den Bauteilen verknüpft sind. Also 
dass alle Bauteile im DIP08 Gehäuse auf den genau gleichen Footprint 
zeigen. Optional kann man den Footprints dann aber zusätzlich auch noch 
Bilder zuweisen, damit sie direkt in den Tabellenansichten als Icon 
erscheinen. Das ist kein muss sondern ein dürfen.

> Ich finde -und jetzt nicht böse sein- dass hier eh' zu viel
> Wert auf die Abbildungen gelegt wird; 2/3 des Threads scheinen sich mit
> Footprints auseinanderzusetzen. Da ich weiß, wie ein 0603er oder ein
> MSOP10 aussieht, reicht mir die Angabe des FP im Klartext, also
> KERKO_0402 oder KERKO_0603. Deshalb werde ich einfach weiße-1-pixel-gifs
> als FP benutzen. Damit sollte sich dann auch meine Problematik mit den
> aufpoppenden Bildern erledigt haben.

Naja ich persönlich finde die Bilder sehr nützlich. Man sieht schon auf 
den ersten Blick gleich bildlich mit was man es zu tun hat. Aber wie 
gesagt, die Bilder sind ja freiwillig - du musst sie nicht benutzen. Du 
musst aber auch kein eigenes weisses Bild hochladen, wenn du ein 
Footprint wählst der kein Bild hat, dann wird auch kein Bild in der 
Tabelle angezeigt.

Stefan --- schrieb:
> Also mehrere Preise brauche ich nicht; alternative Bauteile anderer
> Hersteller könnte ich ggf. in den Kommentaren unterbringen, nur ist eben
> die Preisangabe so wie bisher umgesetzt, eher auf den Reichelt-Besteller
> ausgerichtet. Das soll nicht abwertend sein (!), sondern nur
> verdeutlichen, dass andere Anwender auch andere Anforderungen haben :)
> Bei der von mir vorgeschlagenen Erweiterung handelt es sich im Grunde
> genommen ja auch nur um 3 neue Datenbankfelder und Minimalarithmetik.
> Jedoch geben viele Anbieter den Preis bezogen auf 100 an. Und zu
> vermerken, ab welcher Stückzahl der genannte Preis gilt, ist immer
> hilfreich, da Mouser, Farnell, Digikey, Schukat und eigentlich alle
> außer Reichelt mit Staffelpreisen arbeiten.

Jo aber ich denke wenn wir jetzt noch die zusätzlichen Felder einbauen 
wird früher oder später auch der Wunsch kommen, pro Lieferanten mehrere 
Preise (für unterschiedliche Stückzahlen) eingeben zu können. Ausserdem 
macht es das ganze viel professioneller. Wer weiss, vielleicht habe ich 
später mal eine eigene kleine Firma, und dann möchte ich auch ein 
"richtiges" Lagerverwaltungssystem haben :-D

> Btw: kann man eigentlich einstellen, dass der Preis in Cent angegeben
> wird ?  0.0011 Euro liest sich einfach bescheiden. Da muss ich immer
> erst lange nachdenken, bevor ich weiß, was das Bauteil wirklich kostet
> ;)

Bisher noch nicht. Aber könnte man ja noch einbauen.

Stefan --- schrieb:
> Eine Log-Tabelle für abgebuchte Baugruppen, mit Korrekturmöglichkeit,
> halte ich für sehr wichtig und würde für die Implementierung auch
> bezahlen.

Ich habe es in unsere ToDo-Liste geschrieben, aber es wird wohl schon 
ein Weilchen dauern bis das implementiert ist ;-)

Stefan --- schrieb:
> Stört mich auch sehr. Ich habe die V2.2 installiert, bei der diese
> Funktion leider nicht vorhanden ist. Ist dieser Patch nie eingeflossen ?

Der Upload aller möglichen Dateien wird eh noch umgebaut, da tut sich 
also schon noch was. Bezüglich Version: Du solltest dir jeweils die 
neuste per SVN herunterladen, die Archive sind nicht sehr aktuell: 
http://code.google.com/p/part-db/source/checkout

von Stefan . (xin)


Lesenswert?

> Ist der Footprint noch nicht vorhanden, wird er direkt neu angelegt und
> dann dem Bauteil zugewiesen. Verstehst du wie ich meine? Oder habe ich
> dich irgendwie falsch verstanden?

Hallo,

du hattest mich schon richtig verstanden. Da diese Felder nicht 
bezeichnet waren und die Zuordnung mir als nicht eindeutig erschien, 
habe ich erst einmal nichts damit probiert. Aber vielen Dank für die 
Info, das wird es in Zukunft einfacher machen.

> wenn du ein Footprint wählst der kein Bild hat, dann wird auch kein Bild in
> der Tabelle angezeigt.
Funktioniert - bin zufrieden, vielen Dank !

> die Archive sind nicht sehr aktuell:
> http://code.google.com/p/part-db/source/checkout
Damit bin ich dann doch überfordert :(

von Gelöscht (kami89)


Lesenswert?

Stefan --- schrieb:
>> die Archive sind nicht sehr aktuell:
>> http://code.google.com/p/part-db/source/checkout
> Damit bin ich dann doch überfordert :(

Was für ein Server hast du? Linux? Windows?
Bei Linux kannst du einfach den Befehl
1
svn checkout http://part-db.googlecode.com/svn/trunk/ part-db
im Terminal eingeben, dann wird die neuste Version nach ~/part-db/ 
heruntergeladen. Eventuell musst du erst noch das Paket "subversion" 
installieren. Bei Debian oder Ubuntu mit
1
sudo apt-get install subversion

Bei Windows weiss ich grad nicht wie das geht, müsstest mal nach einem 
SVN Client für Windows suchen.

von Stefan . (xin)


Lesenswert?

> Was für ein Server hast du? Linux? Windows?

Im Moment läuft das auf irgendeinem Webspace; da hab' ich leider keinen 
Konsolenzugriff. Ich muss mal bei uns auf dem lokalen Server eine VM mit 
Linux einrichten und die DB dort einspielen.

Sollten nicht im Interesse aller die nicht an der Entwicklung beteiligt 
sin von Zeit zu Zeit mal Archive aktualisiert werden ?

von Gelöscht (kami89)


Lesenswert?

Stefan --- schrieb:
>> Was für ein Server hast du? Linux? Windows?
>
> Im Moment läuft das auf irgendeinem Webspace; da hab' ich leider keinen
> Konsolenzugriff. Ich muss mal bei uns auf dem lokalen Server eine VM mit
> Linux einrichten und die DB dort einspielen.

Dann kannst du auch bei dir lokal eine Kopie aus dem SVN herunterladen, 
und diese Dateien dann auf den Webspace hochladen.

> Sollten nicht im Interesse aller die nicht an der Entwicklung beteiligt
> sin von Zeit zu Zeit mal Archive aktualisiert werden ?

Ja wäre nicht schlecht, aber das geht halt gerne ein bisschen vergessen 
:-) Wobei ich jetzt aber gar nicht weiss wie alt das letzte Archiv 
eigentlich ist. In unserer ToDo-Liste steht aber auch schon eine 
Updatemöglichkeit direkt aus Part-DB heraus, das wär dann das 
Non-Plus-Ultra wenn das was wird ;-)

Es stehen einige schöne Dinge in unserer ToDo-Liste, aber wir können 
halt auch nicht zaubern ;-)

von Stefan . (xin)


Lesenswert?

> Dann kannst du auch bei dir lokal eine Kopie aus dem SVN herunterladen,
> und diese Dateien dann auf den Webspace hochladen.
Genau das habe ich eben nicht hin bekommen ...

Die letzte Version ist vom 12. Juni, wenn ich mich recht erinnere.

Danke für die Hilfestellung !

von Gelöscht (kami89)


Lesenswert?

Stefan --- schrieb:
>> Dann kannst du auch bei dir lokal eine Kopie aus dem SVN herunterladen,
>> und diese Dateien dann auf den Webspace hochladen.
> Genau das habe ich eben nicht hin bekommen ...

Wo liegt denn das Problem? Für Windows müsstest du halt mal schauen was 
es da für SVN-Clients gibt. Mit einem gescheiten Programm sollte es 
eigentlich keine grosse Sache sein part-db aus dem SVN zu beziehen.

> Die letzte Version ist vom 12. Juni, wenn ich mich recht erinnere.

Okay, das geht ja noch. Aber auch seit dem 12. Juni hat sich schon 
wieder einiges getan.

> Danke für die Hilfestellung !

Kein Problem ;-)

@Udo Neist

Ich habe mir dein branch mal angeschaut. Scheint wirklich nicht so 
kompliziert zu sein wie ich mir das vorgestellt habt. Im Grunde genommen 
trennt man ja einfach html und php.

Was ich aber noch nicht verstanden habe: Ist es nicht auch der Sinn von 
Templates, dass man für die gleiche Seite mehrere (verschiedene) *.tmpl 
Dateien erstellen kann, um dann eben ein anderes "Design" zu erreichen? 
Oder soll es nur ein einziges Template geben?
Falls es mehrere Templates geben soll, sollte man doch im Ordner 
templates/ noch Unterordner für die verschiedenen Templates erstellen 
oder?

Im Ordner /class/vlib/ sind keine part-db spezifischen Dinge drin, das 
ist so unverändert "aus dem Internet heruntergeladen" nehme ich an? Geht 
uns quasi also überhaupt nichts an was da drin ist?

Und was schätzt du, wie lange brauchtst du noch bis du fertig bist?
Also ich wäre dafür, dass wir dann den branch in den trunk übernehmen, 
sobald du fertig bist. Ich weiss momentan auch gar nicht wo ich meine 
Änderungen einpflegen soll, die ich noch gemacht habe.

Übrigens habe ich mal die JavaScript Dialoge wie confirm() und alert() 
angeschaut. Die sind ja extrem einfach anzuwenden, damit könnte man 
locker unsere komischen Weiterleitungen ersetzen.

Kleines Beispiel: Dieser Button
1
<input type="submit" name="delete_file" value="L&ouml;schen">
wird ganz einfach zu:
1
<input type="submit" name="delete_file" value="L&ouml;schen" onclick="return confirm('Achtung!\nDas Backup wird unwiederruflich gel&ouml;scht.')">
Und schon hat man eine Sicherheitsabfrage per JavaScript Dialog drin ;-)

Von mir aus kann ich das überall noch einbauen. Aber ich warte erstmal 
noch ab wie es mit dem branch von Udo weitergeht.

von Udo N. (weinbauer73)


Lesenswert?

> Ich habe mir dein branch mal angeschaut. Scheint wirklich nicht so
> kompliziert zu sein wie ich mir das vorgestellt habt. Im Grunde genommen
> trennt man ja einfach html und php.

Jau, ist eigentlich sehr simple. Vorallem sieht man dann den Code mal 
wieder und muss sich nicht durch HTML-Wust durchwühlen ;-)

> Was ich aber noch nicht verstanden habe: Ist es nicht auch der Sinn von
> Templates, dass man für die gleiche Seite mehrere (verschiedene) *.tmpl
> Dateien erstellen kann, um dann eben ein anderes "Design" zu erreichen?
> Oder soll es nur ein einziges Template geben?
> Falls es mehrere Templates geben soll, sollte man doch im Ordner
> templates/ noch Unterordner für die verschiedenen Templates erstellen
> oder?

Man kann es so machen, aber Sinn von dieser Templates ist eigentlich nur 
die Trennung von Code und Darstellung. Das Design würde ich ganz CSS 
überlassen. Die Basis stellt standard/partdb.css dar. Alle Varianten 
werden zusätzlich geladen und ergänzen/überschreiben die vorherigen 
Definitionen. Wenn es gewünscht wäre, könnte man neben dem CSS auch noch 
die Templates freigeben und würde dann analog zum CSS ein 
Unterverzeichnis in templates/ anlegen.

> Im Ordner /class/vlib/ sind keine part-db spezifischen Dinge drin, das
> ist so unverändert "aus dem Internet heruntergeladen" nehme ich an? Geht
> uns quasi also überhaupt nichts an was da drin ist?

Da ist die Template-Engine drin. Zusätzlich noch vlibDate und 
vlibMimeMail, die hier zwar nicht gebraucht werden, aber zu der Engine 
gehören. Gibts so im Paket.

> Und was schätzt du, wie lange brauchtst du noch bis du fertig bist?
> Also ich wäre dafür, dass wir dann den branch in den trunk übernehmen,
> sobald du fertig bist. Ich weiss momentan auch gar nicht wo ich meine
> Änderungen einpflegen soll, die ich noch gemacht habe.

Ich werde diese Woche im Büro noch die Änderungen machen. Könnte bis 
Ende der Woche klappen, je nach Arbeit.

> Übrigens habe ich mal die JavaScript Dialoge wie confirm() und alert()
> angeschaut. Die sind ja extrem einfach anzuwenden, damit könnte man
> locker unsere komischen Weiterleitungen ersetzen.
>
> Kleines Beispiel: Dieser Button
>
1
<input type="submit" name="delete_file"
2
> value="L&ouml;schen">
> wird ganz einfach zu:
>
1
<input type="submit" name="delete_file" value="L&ouml;schen"
2
> onclick="return confirm('Achtung!\nDas Backup wird unwiederruflich
3
> gel&ouml;scht.')">
> Und schon hat man eine Sicherheitsabfrage per JavaScript Dialog drin ;-)

Eventuell einfach ein div-Element bauen, das die Dialoge aufnimmt. So 
können wir die nicht immer gerade hübschen Dialoge der Browser umgehen. 
Wäre dann auch für die PopUps nutzbar. Nur lasse ich das erstmal weg. 
Die Änderungen dazu würden erstmal stören.

> Von mir aus kann ich das überall noch einbauen. Aber ich warte erstmal
> noch ab wie es mit dem branch von Udo weitergeht.

Naja, muss so einiges noch aufräumen. Hier mal den HTML-Code außerhalb 
von PHP, dort mal mit print() ausgegeben. Manche Routinen rufen sich 
selbst wieder auf und ich muss da erstmal die Ausgabe abfangen und 
aufarbeiten. Erst wenn ich alles gemacht habe, kann ich diese Dinge 
umbauen. Was ich in dem Zug auch noch machen werde, ist die Aufteilung 
der lib.php in verschiedene Bibliotheken. Wird dann übersichtlicher :)

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
> Man kann es so machen, aber Sinn von dieser Templates ist eigentlich nur
> die Trennung von Code und Darstellung. Das Design würde ich ganz CSS
> überlassen. Die Basis stellt standard/partdb.css dar. Alle Varianten
> werden zusätzlich geladen und ergänzen/überschreiben die vorherigen
> Definitionen. Wenn es gewünscht wäre, könnte man neben dem CSS auch noch
> die Templates freigeben und würde dann analog zum CSS ein
> Unterverzeichnis in templates/ anlegen.

OK. Aber wenn es theoretisch möglich ist, durch vlib verschiedene 
Templates zu erstellen, würde es vielleicht auch nicht schaden wenn man 
das soweit schonmal vorbereiten würde. Also einfach das, was jetzt im 
template/ Ordner liegt, einfach noch eine Ebene tiefer schieben, also 
z.B. template/standard/. Sollte ja nicht weiter stören, würde aber eine 
spätere Nachrüstung von zusätzlichen Templates erleichtern.

> Eventuell einfach ein div-Element bauen, das die Dialoge aufnimmt. So
> können wir die nicht immer gerade hübschen Dialoge der Browser umgehen.
> Wäre dann auch für die PopUps nutzbar. Nur lasse ich das erstmal weg.
> Die Änderungen dazu würden erstmal stören.

Stimmt, im IE sehen die Dialoge nicht gerade hübsch aus. Im FF finde ich 
sie aber eigentlich sehr schön.

> Naja, muss so einiges noch aufräumen. Hier mal den HTML-Code außerhalb
> von PHP, dort mal mit print() ausgegeben. Manche Routinen rufen sich
> selbst wieder auf und ich muss da erstmal die Ausgabe abfangen und
> aufarbeiten. Erst wenn ich alles gemacht habe, kann ich diese Dinge
> umbauen. Was ich in dem Zug auch noch machen werde, ist die Aufteilung
> der lib.php in verschiedene Bibliotheken. Wird dann übersichtlicher :)

Daran habe ich auch schon gedacht, die lib.php ist echt schon ziemlich 
umfangreich. Auch würde ich vielleicht noch ein paar Dateinamen ändern, 
z.B. config_page.php ist ein etwas komischer Name für diese Seite.

von Udo N. (weinbauer73)


Lesenswert?

Urban B. schrieb:
> OK. Aber wenn es theoretisch möglich ist, durch vlib verschiedene
> Templates zu erstellen, würde es vielleicht auch nicht schaden wenn man
> das soweit schonmal vorbereiten würde. Also einfach das, was jetzt im
> template/ Ordner liegt, einfach noch eine Ebene tiefer schieben, also
> z.B. template/standard/. Sollte ja nicht weiter stören, würde aber eine
> spätere Nachrüstung von zusätzlichen Templates erleichtern.

Kann ich machen, ist ja kein großes Thema. Ich werde dann aber die 
Variable $css in $theme umbenennen.

> Stimmt, im IE sehen die Dialoge nicht gerade hübsch aus. Im FF finde ich
> sie aber eigentlich sehr schön.

Am besten mal in die ToDo-Liste aufnehmen, das man die Dialoge/PopUps 
ändern sollte. Auch gleich mal daran denken, die Frame-Sache 
umzustellen, da diese ja schon seit Jahren als Auslaufmodell gelten und 
irgendwann nicht mehr unterstützt werden. Per XMLHttpRequest lässt es 
sich leichter arbeiten (GET, POST) und in ein DIV-Element reinschreiben 
(Suchbegriff: Ajax)

> Daran habe ich auch schon gedacht, die lib.php ist echt schon ziemlich
> umfangreich. Auch würde ich vielleicht noch ein paar Dateinamen ändern,
> z.B. config_page.php ist ein etwas komischer Name für diese Seite.

setup_db.php und setup_system.php?

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
> Kann ich machen, ist ja kein großes Thema. Ich werde dann aber die
> Variable $css in $theme umbenennen.

Wie würdest du die Idee finden, wenn wir die CSS-Dateien gleich in die 
jeweiligen template-Ordner verschieben würden? Dann hat quasi jedes 
Template (falls es mal noch andere geben wird) seine eigenen 
CSS-Dateien. So wäre man dann relativ flexibel was die Gestaltung 
angeht.

Muss ja nicht sein dass es mal noch andere Templates gibt. Aber ich bin 
da jeweils der Meinung man sollte sich alle Möglichkeiten offenhalten. 
Was im jetztigen Moment nur eine kleine Änderung bedeutet, kann später 
mal vier Arbeit geben das umzurüsten.

Udo Neist schrieb:
> Am besten mal in die ToDo-Liste aufnehmen, das man die Dialoge/PopUps
> ändern sollte. Auch gleich mal daran denken, die Frame-Sache
> umzustellen, da diese ja schon seit Jahren als Auslaufmodell gelten und
> irgendwann nicht mehr unterstützt werden. Per XMLHttpRequest lässt es
> sich leichter arbeiten (GET, POST) und in ein DIV-Element reinschreiben
> (Suchbegriff: Ajax)

Kann ich so mal in die ToDO-Liste aufnehmen.

Udo Neist schrieb:
> setup_db.php und setup_system.php?

Ja, oder noch näher ans Menü angelehnt config_db.php und 
config_system.php
Vielleicht könnte man das auch für die anderen Dateien so übernehmen, 
also edit_footprints.php, edit_supplier.php usw.

von Udo N. (weinbauer73)


Lesenswert?

Urban B. schrieb:
> Wie würdest du die Idee finden, wenn wir die CSS-Dateien gleich in die
> jeweiligen template-Ordner verschieben würden? Dann hat quasi jedes
> Template (falls es mal noch andere geben wird) seine eigenen
> CSS-Dateien. So wäre man dann relativ flexibel was die Gestaltung
> angeht.
>
> Muss ja nicht sein dass es mal noch andere Templates gibt. Aber ich bin
> da jeweils der Meinung man sollte sich alle Möglichkeiten offenhalten.
> Was im jetztigen Moment nur eine kleine Änderung bedeutet, kann später
> mal vier Arbeit geben das umzurüsten.

Ich habe es derzeit so umgesetzt, das CSS und Templates getrennt sind. 
Aber ich kann prüfen, ob es in den Templates auch eine partdb.css gibt 
und die zusätzlich zum Standard laden. Alternativ wird die 
standardmäßige CSS-Datei in die Theme-CSS integriert und man lädt in der 
vlib_head.tmpl nur noch ein CSS.

>> Am besten mal in die ToDo-Liste aufnehmen, das man die Dialoge/PopUps
>> ändern sollte. Auch gleich mal daran denken, die Frame-Sache
>> umzustellen, da diese ja schon seit Jahren als Auslaufmodell gelten und
>> irgendwann nicht mehr unterstützt werden. Per XMLHttpRequest lässt es
>> sich leichter arbeiten (GET, POST) und in ein DIV-Element reinschreiben
>> (Suchbegriff: Ajax)
>
> Kann ich so mal in die ToDO-Liste aufnehmen.

:-)

>> setup_db.php und setup_system.php?
>
> Ja, oder noch näher ans Menü angelehnt config_db.php und
> config_system.php
> Vielleicht könnte man das auch für die anderen Dateien so übernehmen,
> also edit_footprints.php, edit_supplier.php usw.

config_db.php existiert bereits. Darin hab ich die 
Datenbankkonfiguration ausgelagert, um schneller zwischen verschiedenen 
Rechner/Datenbanken umswitchen zu können (entwickel ja nicht nur hier zu 
Hause ;-) ).

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
> Ich habe es derzeit so umgesetzt, das CSS und Templates getrennt sind.
> Aber ich kann prüfen, ob es in den Templates auch eine partdb.css gibt
> und die zusätzlich zum Standard laden. Alternativ wird die
> standardmäßige CSS-Datei in die Theme-CSS integriert und man lädt in der
> vlib_head.tmpl nur noch ein CSS.

Oder man macht es wie bisher, aber man soll dann in der Konfiguration 
Template und CSS separat, voneinander unabhängig wählen können. Zuerst 
dachte ich man soll einfach Template und CSS gleichnamig machen um sie 
so quasi miteinander verknüpfen zu können, aber das ist auch nichts weil 
es dann auch für jede CSS ein eigenes Template geben muss...

Udo Neist schrieb:
> config_db.php existiert bereits. Darin hab ich die
> Datenbankkonfiguration ausgelagert, um schneller zwischen verschiedenen
> Rechner/Datenbanken umswitchen zu können (entwickel ja nicht nur hier zu
> Hause ;-) ).

Ah ja daran habe ich gar nicht gedacht dass es die Datei schon gibt. 
Allerdings wenn man sich überlegt dass der grösste Teil der 
Konfiguration eh in die Datenbank ausgelagert werden soll, würde 
schlussendlich eh nur noch die Datenbankkonfiguration übrig bleiben, und 
die könnte man ja in der config.php belassen.

von Udo N. (weinbauer73)


Lesenswert?

Urban B. schrieb:
> Oder man macht es wie bisher, aber man soll dann in der Konfiguration
> Template und CSS separat, voneinander unabhängig wählen können. Zuerst
> dachte ich man soll einfach Template und CSS gleichnamig machen um sie
> so quasi miteinander verknüpfen zu können, aber das ist auch nichts weil
> es dann auch für jede CSS ein eigenes Template geben muss...

Ich habe jetzt CSS und Template zusammengeführt. Das Thema "Greenway" 
setzt das Thema "standard" vorraus. Wenn man das CSS eines Themas 
anpassen will, so sollte man jetzt ein neues Thema erstellen (kopieren 
des alten). Ein Alternativ-CSS geht derzeit nicht.

> Ah ja daran habe ich gar nicht gedacht dass es die Datei schon gibt.
> Allerdings wenn man sich überlegt dass der grösste Teil der
> Konfiguration eh in die Datenbank ausgelagert werden soll, würde
> schlussendlich eh nur noch die Datenbankkonfiguration übrig bleiben, und
> die könnte man ja in der config.php belassen.

Ich würde nicht alles in die Datenbank auslagern, sondern eine 
Basisinstallation machen. Damit ist das System immer lauffähig und zudem 
hat man die Defaults für einen neuen User auch gleich :)

PS: Revision 486 ist zwar hochgeladen, aber irgendwas ist schief 
gelaufen. Da fehlen einige Dateien :(

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
> Ich würde nicht alles in die Datenbank auslagern, sondern eine
> Basisinstallation machen. Damit ist das System immer lauffähig und zudem
> hat man die Defaults für einen neuen User auch gleich :)

Also wenn ich mir die config.php (aus dem trunk) so anschaue, sehe ich 
da ausser dem Datenbankzeugs und dem Zeichensatz keine wichtigen 
Einstellungen. Die Seite würde auch ohne diesen ganzen Kram laufen, also 
auch wenn die Einstellungen in der Datenbank fehlen würden. Viele von 
diesen Einstellungen würden vor allem auch benutzerbezogen Sinn machen, 
also müssten sie sowieso aus der config.php raus. Und defaults können 
direkt bei der Auswertung gesetzt werden, so ist es jetzt ja 
(teilweise?) auch schon gemacht. Ist eine Einstellung in der config.php 
nicht vorhanden, wird einfach ein default-Wert genommen. Theoretisch 
könnte man dazu sogar noch eine zusätzliche Datei defaults.php anlegen, 
in der die Standardwerte stehen (und da drin hat der User nichts zu 
suchen).

Bei der Benutzerverwaltung würde es Sinn machen wenn man den Gruppen 
alle benutzerspezifischen Einstellungen zuordnen kann. Wird dann ein 
neuer Benutzer angelegt, soll man bei jeder benutzerspezifischen 
Einstellung wählen können ob die Einstellung von der entsprechenden 
Gruppe übernommen werden soll, oder ob man die Einstellung manuell 
setzen möchte.

von Udo N. (weinbauer73)


Lesenswert?

Urban B. schrieb:
> Ist eine Einstellung in der config.php
> nicht vorhanden, wird einfach ein default-Wert genommen. Theoretisch
> könnte man dazu sogar noch eine zusätzliche Datei defaults.php anlegen,
> in der die Standardwerte stehen (und da drin hat der User nichts zu
> suchen).

In einer defaults.php könnten wir alle Überprüfungen der Einstellungen 
einbauen und mit den gültigen Möglichkeiten vergleichen. Alles was nicht 
passt oder fehlt wird dort entsprechend gesetzt.

> Bei der Benutzerverwaltung würde es Sinn machen wenn man den Gruppen
> alle benutzerspezifischen Einstellungen zuordnen kann. Wird dann ein
> neuer Benutzer angelegt, soll man bei jeder benutzerspezifischen
> Einstellung wählen können ob die Einstellung von der entsprechenden
> Gruppe übernommen werden soll, oder ob man die Einstellung manuell
> setzen möchte.

Was Gruppen- und was Userrechte sein sollen, das müssen wir eh noch 
zusammentragen. Dann erst sehen wir, was über die config.php geladen 
wird und was wir über die Benutzerverwaltung an Variablen setzen müssen. 
Solange macht es keinen Sinn, über diese Baustelle zu reden.

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
> In einer defaults.php könnten wir alle Überprüfungen der Einstellungen
> einbauen und mit den gültigen Möglichkeiten vergleichen. Alles was nicht
> passt oder fehlt wird dort entsprechend gesetzt.

Klingt gut. Aber ich frage mich gerade was da drin dann noch landet wenn 
eh fast alle Einstellungen in der Datenbank stehen. Diese Einstellungen 
werden dann ja eh über eine Funktion, so wie jetzt in der lib.php, an 
einer zentralen Stelle aus der Datenbank gelesen. Würde in der Datenbank 
was fehlerhaftes stehen, würde dies gleich in dieser Funktion drin 
korrigiert werden.

Udo Neist schrieb:
> Was Gruppen- und was Userrechte sein sollen, das müssen wir eh noch
> zusammentragen. Dann erst sehen wir, was über die config.php geladen
> wird und was wir über die Benutzerverwaltung an Variablen setzen müssen.
> Solange macht es keinen Sinn, über diese Baustelle zu reden.

Ja, ich wollte nur mitteilen, dass ich es als wenig sinnvoll betrachte 
die Konfiguration auf zwei verschiedene Dateien aufzuteilen, wenn es 
später eh nur noch eine handvoll hardgecodete Einstellungen geben wird. 
Dann wäre die config_db.php wieder frei für die Einstellungsseite der 
Datenbank :-D

von Udo N. (weinbauer73)


Lesenswert?

Revision 487 mit den obigen Änderungen und einigen weiteren Umstellungen 
auf Templates hochgeladen :-) Ich werde noch die IC-Logos und Footprints 
heute umstellen. Dann ist für heute Feierabend.

von Udo N. (weinbauer73)


Lesenswert?

Letztes Update für heute ;-) Revision 488 mit den geänderten 
footprints.php und iclogos.php. Bei letzterem würde ich auch eine 
Übertragung in die Datenbank empfehlen, denn dann könnte man mehrere 
Dinge machen:

- Ausgabe der Logos in einer Schleife anstelle einer statischen Datei
- Mehrere Logos einer Firma in einer Zeile ausgeben
- Zuordnung von Bauteilen zu einer Firma, insbesondere wenn ganz 
bestimmte Eigenschaften dieses Bauteils wichtig sind und kein 2nd Source 
gewünscht ist (Projektverwaltung)

Ab morgen werde ich die restlichen Dateien auf Templates umstellen und 
dann die Funktionen noch bereinigen. Ich werde abends das Ergebnis 
hochladen und hier kurz beschreiben, was geändert wurde.

von Gelöscht (kami89)


Lesenswert?

Ja, das wäre keine schlechte Idee mit den Herstellerlogos. Eigentlich 
könnte man doch da mehr oder weniger das Footprintsystem einfach 
kopieren oder?
Es soll nicht nur auf die Hersteller beschränkt sein, von denen wir die 
Logos haben. Es sollen auch eigene Hersteller hinzugefügt werden können.

von Udo N. (weinbauer73)


Lesenswert?

Meine Rede :-)

Noch ein paar Ideen zu den IC-Logos:
- Webseite
- Info zu welcher Firma die Firma jetzt gehört oder ob sie nicht mehr 
existiert

Daneben können wir doch noch die Logos und Footprints mit einer 
Versionsnummer versehen und per Updatefunktion holen. Die Infos kann man 
in der Datenbank unterbringen. Die Webseite selbst gibt alle Versionen 
in einer Liste aus und ein Script lädt aufsteigend bis zur letzten 
Version alle Updates. Das lässt sich eventuell auf der Konsole per 
cronjob automatisieren.

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
> Meine Rede :-)
>
> Noch ein paar Ideen zu den IC-Logos:
> - Webseite
> - Info zu welcher Firma die Firma jetzt gehört oder ob sie nicht mehr
> existiert

Hab daraus mal "Issue 26" gestrickt.

Udo Neist schrieb:
> Daneben können wir doch noch die Logos und Footprints mit einer
> Versionsnummer versehen und per Updatefunktion holen. Die Infos kann man
> in der Datenbank unterbringen. Die Webseite selbst gibt alle Versionen
> in einer Liste aus und ein Script lädt aufsteigend bis zur letzten
> Version alle Updates. Das lässt sich eventuell auf der Konsole per
> cronjob automatisieren.

Das versteh ich jetzt nicht ;-)
Die Bilder werden ja durch das SVN stets aktualisiert?
Und wozu soll eine Versionsnummer gut sein?

von Udo N. (weinbauer73)


Lesenswert?

Urban B. schrieb:
>> Noch ein paar Ideen zu den IC-Logos:
>> - Webseite
>> - Info zu welcher Firma die Firma jetzt gehört oder ob sie nicht mehr
>> existiert
>
> Hab daraus mal "Issue 26" gestrickt.

:-)

> Das versteh ich jetzt nicht ;-)
> Die Bilder werden ja durch das SVN stets aktualisiert?
> Und wozu soll eine Versionsnummer gut sein?

SVN ist gut, aber nicht zu allem zu gebrauchen. In der Praxis wird man 
einmal installieren und über eine Update-Funktion auf dem Laufenden 
bleiben wollen. Hier sind die meisten doch eher konservativ und wollen 
nur von uns freigebene Versionen haben. Das SVN gibt aber nur die 
Entwicklerversion her, das ist denen zu unsicher. Mit den Updates von 
Script, Logo und Footprints in getrennten Aktionen haben wir zudem auch 
noch Vorteile bei der Bandbreite. Und ob wir nur Script oder auch noch 
die Grafiken als weiteres Update anbieten, dürfte doch kein Problem 
sein. Die Versionsnummer ist nur für den Abgleich gedacht. Kann ja auch 
einfach nur das Releasedatum des Paketes sein. Zudem können wir ja auch 
ein Release aus der Datenbank herausnehmen und ein Downgrade 
veranlassen.

So in etwa werden auch AddOns bei diversen Softwarepaketen gehandhabt 
:-)

von Gelöscht (kami89)


Lesenswert?

Ah, so meinst du das. Das würde dann zum Issue 4 gehören 
(http://code.google.com/p/part-db/issues/detail?id=4).

Ich würde dann schon eher nur das Releasedatum der Pakete als 
Versionskontrolle nehmen, jedes Bild / jede Datei einzeln finde ich 
übertrieben.

von Udo N. (weinbauer73)


Lesenswert?

Genau. Es ist Teil des Updates. Ich meinte aber nicht das jedes einzelne 
Bild upgedatet wird. Wäre irrsinnig. Ne, wenn ein Update bei den Logos 
oder Footprints gemacht werden soll, dann werden alle neuen Grafiken in 
ein (!) Update-Archiv gepackt. So gibt es entweder zwei Updatevarianten 
(Script und Grafiken) oder drei (Script, Logos, Footprints). Damit man 
aber weiß, welche Grafikpakete installiert sind, sollen diese Pakete 
eine unabhängige Nummer bekommen. Ein Update des Scripts erzwingt dann 
aber auch eine Aktualisierung der Grafiken.

Ein Beispiel:

Installiert sind Script R488, Logo R3, Footprints R3. Es stehen Script 
R495, Logo R5 und Footprints R8 zur Verfügung. Das Script-Update holt 
R495, die Logos R4 bis R5 und die Footprints R4 bis R8. Würde man nur 
die Grafiken updaten, würden R4 bis R5 bzw. R4 bis R8 geladen.

Ich hoffe, es ist verständlich geworden :)

von Gelöscht (kami89)


Lesenswert?

Naja aber da würde ich dann nur ein einziges Update anbieten, und zwar 
gleich für alles zusammen. Ich finde es macht keinen Sinn nur ein Teil 
von Part-DB zu aktualisieren. Das macht es doch nur unnötig kompliziert.

von Udo N. (weinbauer73)


Lesenswert?

Ist ja nur ein Vorschlag von mir :-) Ich entscheide ja nicht, was ihr zu 
machen habt. Ich bin ja der Neuling in eurem Projekt.

Ich hab noch einen Fehler entdeckt. Die Funktion get_svn_revision() 
läuft anscheinend nach der Änderung vor einigen Tagen immer noch nicht 
richtig. Ich teste gleich mal ein Bugfix aus.
1
/** edit: 20120715 Udo Neist **/
2
3
global $conf;
4
5
if ( function_exists('shell_exec') )
6
{
7
     $repo_version = shell_exec('svnversion');
8
}
9
elseif ( file_exists( BASE.'/.svn/entries') )
10
{
11
     $svn = File( BASE.'/.svn/entries');
12
     $repo_version = $svn[ 3];
13
     unset($svn);
14
}
15
16
return( $repo_version . $conf['version']['string'] );
17
18
/** end: 20120715 Udo Neist **/

Okay läuft :) -> Revision 490

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
> Ist ja nur ein Vorschlag von mir :-) Ich entscheide ja nicht, was ihr zu
> machen habt. Ich bin ja der Neuling in eurem Projekt.

Naja so viel länger bin ich auch nicht dabei ;-)

Bezüglich automatisches Update habe ich mir mal ein paar Gedanken 
gemacht:

In einer Funktion wird eine Textdatei direkt von Google Code 
heruntergeladen. In dieser Textdatei steht die Versionsnummer des 
aktuellsten zur Verfügung stehenden Pakets, und die URL zum Paket. Ist 
die Versionsnummer neuer als die installierte Version, wird das gepackte 
Archiv heruntergeladen. Danach einfach per exec("gzip ...") entpackt und 
alle veralteten Dateien werden mit den neuen überschrieben.

Stelle ich mir das zu einfach vor, oder wäre das so tatsächlich möglich? 
gzip sollte eigentlich ziemlich jeder Hoster anbieten oder?

von Udo N. (weinbauer73)


Lesenswert?

So etwa dachte ich mir das auch. Ob gzip auf jedem Server installiert 
ist, kann ich nicht beurteilen. Man sollte vielleicht mehrere Archive 
anbieten?

Mir fällt gerade noch was ein. Warum sind eigentlich die Grafiken im 
Verzeichnis tools und nicht in img?

von Christian R. (holle)


Lesenswert?

Das mit den Mouse-Over Footprints stört mich ehrlich gesagt auch etwas. 
Vielleicht kann das das Mouse-Over durch einfache Links ersetzen?

Wenn das mit der Benutzerverwaltung fertig ist erübrigt sich ja eine 
"einfache" Upgradefunktion, da ein normaler User damit dann ja nichts 
mehr zu tun hat. Die Upgrades würden dann ja von den Entwicklern 
eingepflegt nachdem diese getestet wurden.

Stefan schrieb:
> - Ich wünschte mir eine Art Log, das anzeigt, wann und wie viele einer
> Baugruppe gebucht wurden. Dort könnte man eine Buchung -hoffentlich-
> auch rückgängig machen, sofern man aus Versehen mal 'was Falsches
> eingegeben hat.

Ja, das wäre praktisch.


Urban B. schrieb:
> Keine schlechte Idee, vorallem auch im Bezug auf die Benutzerverwaltung
> die ja noch kommen soll. Dann könnten die "Admins" auch nachvollziehen
> was andere Leute so in der Datenbank "rumfummeln" und können
> Fehlbuchungen rückgängig machen. Würde ich als durchaus nützlich
> betrachten.

Naja, die User hätten doch eh alle ihre eigenen Lagerplätze und 
Stückzahlen, somit hätten die Admins damit ja garnichts zu tun.
Die Admins hätten ja nur damit was zu tun, was "global" benutzt wird 
(Footprints, Datasheets, usw.), aber Benutzerspezifische Dinge wie 
"Lagerort oder Stückzahl" ändert ja jeder User nur für sich selber.

von Udo N. (weinbauer73)


Lesenswert?

Christian R. schrieb:
> Naja, die User hätten doch eh alle ihre eigenen Lagerplätze und
> Stückzahlen, somit hätten die Admins damit ja garnichts zu tun.
> Die Admins hätten ja nur damit was zu tun, was "global" benutzt wird
> (Footprints, Datasheets, usw.), aber Benutzerspezifische Dinge wie
> "Lagerort oder Stückzahl" ändert ja jeder User nur für sich selber.

Es müssen ja nicht die eigentlichen Admins eingreifen, es könnten ja 
auch Gruppenadmins geben, die das für ihren Bereich dürfen.

von Christian R. (holle)


Lesenswert?

Aber was genau soll ein Gruppenadmin da dann machen?
Wenn ein User seinen Bestand 330-Ohm-Widerstände von 100 auf 50 ändert 
oder seine Lagerfächer umstrukturiert ist das doch seine Sache, das 
betrifft auch nur den User selber. Wenn ein User hingegen den 
Conrad-Preis dieses Widerstandes ändert, sich dabei jedoch vertan hat, 
dann betrifft das alle User ...und somit ist das ein Fall für die 
Admins.

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
> Mir fällt gerade noch was ein. Warum sind eigentlich die Grafiken im
> Verzeichnis tools und nicht in img?

Das weiss ich auch nicht. Würde eigentlich Sinn machen, das nach img zu 
verschieben...

Christian R. schrieb:
> Wenn das mit der Benutzerverwaltung fertig ist erübrigt sich ja eine
> "einfache" Upgradefunktion, da ein normaler User damit dann ja nichts
> mehr zu tun hat. Die Upgrades würden dann ja von den Entwicklern
> eingepflegt nachdem diese getestet wurden.

Naja die meisten Leute werden wohl ihre Lagerverwaltung auf ihrem 
eigenen Server laufen lassen wollen, für diejenigen sind sie 
Update-Pakete gedacht.

Christian R. schrieb:
> Naja, die User hätten doch eh alle ihre eigenen Lagerplätze und
> Stückzahlen, somit hätten die Admins damit ja garnichts zu tun.
> Die Admins hätten ja nur damit was zu tun, was "global" benutzt wird
> (Footprints, Datasheets, usw.), aber Benutzerspezifische Dinge wie
> "Lagerort oder Stückzahl" ändert ja jeder User nur für sich selber.

Die Benutzerverwaltung soll (wie ich finde) in erster Linie dazu da 
sein, dass man seine eigene Part-DB-Installation auch anderen Leuten 
(Kumpels, Mitarbeiter, ...) zur Verfügung stellen kann. Und vor allem 
für den (mehr oder weniger) professionellen Einsatz in einer (kleinen) 
Firma ist es unverzichtbar, da sollen nunmal Einkäufer, Verkäufer, 
Lagerist und Elektroniker unterschiedliche Rechte haben, und der 
Lagerist soll nachvollziehen (und rückgängig machen) können, was die 
anderen (falsch) gemacht haben :-)

von Christian R. (holle)


Lesenswert?

Achso, dann habe ich das falsch verstanden.

Ich dachte dabei halt an myparts.info , wo eine große Datenbank von 
vielen vielen Usern genutzt werden soll. Die meisten der User werden 
vermutlich normale "Hobbyelektroniker" sein, welche keinen Server haben 
und ein relativ kleines Lager.

Für die professionelle Anwendung sieht das natürlich wieder ganz anders 
aus.

von Udo N. (weinbauer73)


Lesenswert?

Japp. Wir müssen beide Fälle betrachten. Im Normalfall wird es also nur 
eine Gruppe geben, in der auch nur ein User arbeitet (Standalone). Hier 
brauchen wir keine Benutzerverwaltung. In einer Firma wird es 
unterschiedliche Gruppen geben, die unterschiedliche Arbeiten tun 
sollen. Das Lager bearbeitet nur Lager und kennt die Baugruppen nicht. 
Auf unserem Server müssen wir quasi eine Firma nachbilden, in der es 
nicht nur eine Gruppe mit verschiedenen Rechten gibt, sondern mehrere. 
Wobei in einer Gruppe alle Personen mit gleichen Rechten und in einer 
anderen verschiedene Rechte bzw. Rollen geben könnte.

Mir schwebt sowas wie folgt vor:
1
- Firma bzw. Projekt
2
 -> Entwicklergruppe/Projekt bzw. Unterprojekt
3
  -> Rolle (Lagerist, Einkäufer, Entwickler, Verkäufer etc.)
4
   -> User

Gute Nacht :-)

von Christian R. (holle)


Lesenswert?

Dann gibt es aber noch den dritten Fall, für den ich extra myparts.info 
registriert habe.
Das ist für "Normal-User", die sich eine Datenbank teilen.
Da ist eine Benutzerverwaltung ebenfalls erforderlich.

Geplant ist das ja so:

Ein User meldet sich an und kann dann auf die vorhandene Datenbank 
zugreifen. Er sieht viele bereits angelegten Bauteile (samt Footprints, 
Datenblätter, Preise,...) und braucht nur noch seine Lagerfächer 
einzurichten und die Stückzahlen einzugeben. Solle er Bauteile haben 
welche noch nicht angelegt sind gibt es entweder die Möglichkeit dass er 
das Bauteil selber anlegen kann, oder dass er es auf eine Liste schreibt 
und Moderatoren dieses dann anlegen. Das war noch nicht geklärt wie man 
das dann handhaben will.

Auf jeden Fall hat das gegenüber der Einzelversion folgende Vorteile:
-Ein User benötigt keinen Webspace und auch keinen virtuellen Server
-Ein User erspart sich eine Menge Arbeit beim anlegen der Bauteile, der 
Suche nach dem Datenblatt, Zuordnung der Footprints usw. , denn diese 
sind größtenteils schon angelegt.
-Wenn ein User einen Preis aktualisiert profitieren alle User davon, 
somit sind die Daten allgemein aktueller.

von Udo N. (weinbauer73)


Lesenswert?

Revision 491: orderparts.php umgeschrieben. Infolge dessen auch die 
lib.php angepasst. print_http_charset() wird nach dem Umschreiben 
entfallen, da diese Funktion als Variable in vlib_head.tmpl steckt.

von Udo N. (weinbauer73)


Lesenswert?

So, ein kleines Update für die Reihenfolge der Arbeit mit SVN:

Arbeitskopie mit dem Server abgleichen
1
svn up
Konflikte mit den Mitteln von SVN lösen und ggfs. in die eigene 
Arbeitskopie einpflegen.

Backupdateien löschen (mein Editor ist Quanta+ und der legt Backups mit 
der Tilde am Ende an)
1
find . -name "*~" -exec rm {} \;
Neue Dateien und Verzeichnisse aufnehmen
1
svn add * --force
Commit der Version mit COMMENT als Kommentar
1
svn commit -m "COMMENT"
Arbeitskopie mit dem Server abgleichen, um die Revision upzudaten. Gibt 
sonst ein Konflikt bei einem weiteren commit.
1
svn up

von Udo N. (weinbauer73)


Lesenswert?

Revision 492: Woher die als fehlerhaft eingestufte und veraltete 
get_svn_revision kommt, weiß ich nicht. Ist behoben.

von Gelöscht (kami89)


Lesenswert?

@Christian R.
Ja, ich weiss dass diese Art von Benutzerverwaltung noch geplant ist. 
Aber ich denke in erster Linie sollte es mal eine Benutzerverwaltung für 
den Einsatz in einer kleinen Firma geben. Du musst etwas Geduld haben, 
es dauert halt bis neue Features eingebaut werden ;-D

@Udo Neist
hmm jetzt hast du für das greenway-css extra ein neues Template erzeugt? 
Eigentlich wollte ich das vermeiden weil es umso aufwändiger wird eine 
Änderung einfliessen zu lassen... Deshalb dachte ich man sollte auch 
mehrere CSS-Dateien zu einem Template zuordnen können, das würde die 
Wartung einfacher machen.

Übrigens habe ich festgestellt, dass auf Win7 (IE und FF) das Suchfeld 
nur gerade etwa halb so gross ist wie auf Linux (FF). Könnt ihr das auch 
nachvollziehen?
Ich habe nämlich extra mal die Feldlänge ein bisschen reduziert damit 
das Feld und der "Los"-Button noch nebeneinander Platz haben. Wenn es 
jetzt aber auf Win7 einfach viel zu kurz ist, ist das auch nicht das was 
ich erreichen wollte ;-)

von Gelöscht (kami89)


Angehängte Dateien:

Lesenswert?

Ich habe heute wiedermal ein bisschen um Part-DB herumstudiert. Zwei 
Sachen haben mich beschäftigt:

Einerseits denke ich es wäre von (grossem) Vorteil, wenn wir auf 
objektorientierte Programmierung umrüsten. Das würde das Ganze viel 
übersichtlicher, weniger fehleranfällig und einfacher wartbar machen 
(denke ich zumindest :-). Für die ganzen Klassen könnten wir gleich das 
Verzeichnis class/ benutzen, dass Udo für die vlib angelegt hat. Dann 
könnten wir unsere lib.php durch folgende Dateien ersetzen:
1
class/footprint.php
2
class/storeloc.php
3
class/supplier.php
4
usw.

Und dann habe ich mir noch ein paar Gedanken zur Benutzerverwaltung 
gemacht. Aus den Gedanken heraus sind dann die zwei Tabellen im Anhang 
entstanden.

Für die Rechte habe ich mir überlegt, wir machen das ähnlich wie bei den 
Unix-Dateirechten. Diese sind aber eher nicht passend genug für unseren 
Einsatz um sie einfach 1:1 zu übernehmen. Stattdessen dachte ich, es 
soll statt der drei Attributen (Lesen, Schreiben, Ausführen) diese sechs 
Attribute geben:
1
- Erben von übergeordnetem Element (schliesst die nachfolgenden Attribute aus)
2
- Betrachten
3
- Bearbeiten
4
- Erstellen
5
- Löschen
6
- Verschieben

Mit diesen Attributen könnten wir schon sehr viel erreichen. Dort wo es 
nicht genügt und spezielle Attribute notwendig sind (oder eine feinere 
Unterteilung möglich sein soll) (wie z.B. bei den "perms_parts_*") 
verwendet man halt für jedes einzelne Element eine Datenbankspalte.

Ich finde es wichtig, dass man das Attribut "Erben" einstellen kann. So 
kann man einer Gruppe die Rechte zuteilen, und jeder Benutzer dieser 
Gruppe erhält automatisch die selben Rechte (sofern "Erben" eingestellt 
ist).

Diese Attribute könnten wir wie beim Unix-Rechtesystem einfach als 
Integer in der Datenbank abspeichern. Wie es genau codiert werden soll 
(Reihenfolge) habe ich noch nicht festgelegt. Im Anhang habe ich noch 
den Wert "-1" für das Attribut "Erben" und "255" für "vollumfängliche 
Rechte" verwendet, ist aber erstmal uninteressant wofür das nun stehen 
soll.

Für die Benutzerverwaltung für myparts.info habe ich mir überlegt, man 
soll jedem Benutzer (bzw. Gruppe) die Tabellen für Baugruppen, Lagerorte 
usw. zuordnen können. Dazu sind die "dataset_*" Einträge da. Für die 
Kategorien, Lieferanten und Footprints wird es auf myparts.info 
vermutlich nur ein solches Datenset für alle Benutzer geben 
(Vollständigkeitshalber habe ich sie trotzdem mal als "variabel" 
angenommen und in die Tabelle aufgenommen). Man könnte aber auch einer 
Gruppe ein anderes Datenset zuweisen, dann teilen nur die User innerhalb 
dieser Gruppe alle Datensätze.

Das Datenset sollte übrigens besser nur beim Anlegen eines Benutzers 
zugewiesen werden. Wird nachträglich was verändert an diesen IDs, wird 
es zu einem ziemlichen Durcheinander kommen.

Natürlich fehlt in meinen Überlegungen noch einiges (z.B. die Anpassung 
der bestehenden Tabellen an das DatenSet-System). Vielleicht habe ich 
sogar noch einen groben Überlegungsfehler gemacht, so dass das System 
gar nicht so funktionieren kann wie ich es hier beschreibe.

Ich wäre froh wenn ihr euch das mal kurz (oder besser lange :-) 
anschauen könntet und berichtet was ihr davon haltet.

mfg

EDIT: Die Gruppe "Administratoren" könnte man auch löschen. Würde ich 
schöner finden :-) Der Benutzer "admin" braucht ja nicht unbedingt eine 
Gruppe denke ich...

von Gelöscht (kami89)


Lesenswert?

Urban B. schrieb:
> Übrigens habe ich festgestellt, dass auf Win7 (IE und FF) das Suchfeld
> nur gerade etwa halb so gross ist wie auf Linux (FF). Könnt ihr das auch
> nachvollziehen?

Lag wohl daran dass die Anzahl Zeichen als Breite angegeben war. Die 
Breitenangabe in Pixel soll da zuverlässiger sein (im Internet gelesen), 
hab das nun mal so ins SVN geladen. Bei mir funktionierts jetzt 
jedenfalls auf Win7 (FF / IE) und Linux (IE).

Bitte melden wenns bei jemanden nicht passt, dann machen wir das Feld 
halt noch ein bisschen schmaler.

von Udo N. (weinbauer73)


Lesenswert?

Die Aufteilung der lib.php sollte man schon angehen. Für den Anfang 
würde ich die Teile der lib.php in ein neues Verzeichnis lib/ 
unterbringen und später die OO-Teile in die Klasse verschieben. Für die 
Übergangszeit würde in der libs/xxx.php dann ein Wrapper für die 
entsprechende Klasse existieren, bis dieser Aufruf dann aus allen 
Bereichen auf OO umgestellt wurde. So haben wir einen Überblick über die 
Umstellung.

Ich habe mich noch nicht mit der Datenbankstruktur befasst, daher kann 
ich zur Benutzerverwaltung noch nichts konkretes beisteuern. Ich habe 
bisher eine Hierachie genutzt, bei der Gruppen nur für die Eingrenzung 
der Datensätze gedacht waren. Ob es sich lohnt, jeder Gruppe eigene 
Tabelle(n) zu geben oder nur einfach pro Ebene eine Spalte mehr nimmt, 
weiß ich nicht. Man könnte ja eine Arbeitsgruppe 1 mit Untergruppen 1, 2 
und 3 haben, die ihren jeweiligen Bestand bearbeiten, aber die anderen 
UG nur einsehen können. Das könnte man auch auf Arbeitsgruppen 
ausweiten, so dass am Ende die nächst höhere Instanz alle Bereiche 
unterhalb sehen kann. Das wäre eine Zuordnungstabelle für die 
Arbeitsgruppen bzw. noch eine für die Hierachie und zwei Spalten in den 
anderen Tabellen. Der Nutzer könnte innerhalb der Hierachie auch UGs aus 
verschiedenen AGs angehören und beim Einloggen die passende UG wählen. 
So in etwa funktioniert auch meine Chemiekalienverwaltung.

Hab noch keine weiteren Änderungen machen können. Wahrscheinlich kann 
ich morgen die nächste Version hochladen.

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
> Die Aufteilung der lib.php sollte man schon angehen. Für den Anfang
> würde ich die Teile der lib.php in ein neues Verzeichnis lib/
> unterbringen und später die OO-Teile in die Klasse verschieben. Für die
> Übergangszeit würde in der libs/xxx.php dann ein Wrapper für die
> entsprechende Klasse existieren, bis dieser Aufruf dann aus allen
> Bereichen auf OO umgestellt wurde. So haben wir einen Überblick über die
> Umstellung.

Naja ich weiss nicht ob es sinnvoll ist, jetzt noch eine Übergangslösung 
anzugehen. Da würde ich lieber noch einen Moment warten und dann die 
Umstellung auf OO gleich in einem Mal machen.

Udo Neist schrieb:
> Ich habe mich noch nicht mit der Datenbankstruktur befasst, daher kann
> ich zur Benutzerverwaltung noch nichts konkretes beisteuern. Ich habe
> bisher eine Hierachie genutzt, bei der Gruppen nur für die Eingrenzung
> der Datensätze gedacht waren. Ob es sich lohnt, jeder Gruppe eigene
> Tabelle(n) zu geben oder nur einfach pro Ebene eine Spalte mehr nimmt,
> weiß ich nicht.

Eigene Tabellen würde ich nicht machen, finde ich "unschön", dann 
explodiert unsere Datenbank für myparts.info. Mit den Datensets dachte 
ich einfach an eine zusätzliche Spalte in den bestehenden Tabellen, mit 
der ID des Datensets, dem die Einträge angehören.

Ich denke, das was ich "Datenset" nenne ist mehr oder weniger das, was 
du unter "Arbeitsgruppe" verstehst. Dass ein User auch mehreren 
Datensets angehören kann (und dieses beim Einloggen wählt), daran dachte 
ich bisher noch gar nicht. Würde eigentlich Sinn machen, da hast du 
recht.

Wir müssen nur aufpassen, dass es durch die Datensets kein Durcheinander 
gibt. Ein Bauteil muss dann z.B. nicht mehr nur die ID des Footprints 
haben, sondern auch noch die ID des Datensets der entsprechenden 
Footprint-Datensätzen. NACHTRAG: wobei, wenn die ID des Footprints ja 
eindeutig ist, bräuchte es das gar nicht. Die zusätzliche Spalte in der 
Footprint-Tabelle aber natürlich schon.

Es wird auf jeden Fall nicht ganz trivial :-D

Übrigens habe ich eine Seite gefunden, auf der es ziemlich coolen 
Ajax/DHTML Kram gibt, auch unter der GPL Lizenz: 
http://dhtmlx.com/docs/products/dhtmlxTree/index.shtml
Viellecht können wir davon in Zukunft noch was gebrauchen (Sichworte: 
Dateiupload-Dialog, Frames)

von Udo N. (weinbauer73)


Lesenswert?

Urban B. schrieb:
> Naja ich weiss nicht ob es sinnvoll ist, jetzt noch eine Übergangslösung
> anzugehen. Da würde ich lieber noch einen Moment warten und dann die
> Umstellung auf OO gleich in einem Mal machen.

Solange das in meinem Branch passiert, wäre das ja kein Problem. Erst 
wenn die Umstellung komplett ist, würde das dann in die offizielle 
Version einfliessen. Schliesslich müssen wir nicht alle Dinge im 
Hauptzweig testen.

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
> Solange das in meinem Branch passiert, wäre das ja kein Problem. Erst
> wenn die Umstellung komplett ist, würde das dann in die offizielle
> Version einfliessen. Schliesslich müssen wir nicht alle Dinge im
> Hauptzweig testen.

Ja, das habe ich mir auch irgendwie so vorgestellt.

von Udo N. (weinbauer73)


Lesenswert?

Man könnte ja erstmal mit den Datenbankabfragen beginnen. Das lohnt sich 
auf alle Fälle.

von Stefan . (xin)


Lesenswert?

wenn ich mit TortoiseSVN auf http://part-db.googlecode.com/svn/trunk/ 
part-db
einen 'Fully Recursive' Checkout mache, bekomme ich folgende 
Fehlermeldung:
URL 'http://part-db.googlecode.com/svn/trunk/%20part-db'; doesn't exist

Hat jemand einen Tip für mich ?

von Gelöscht (kami89)


Lesenswert?

Stefan --- schrieb:
> wenn ich mit TortoiseSVN auf http://part-db.googlecode.com/svn/trunk/
> part-db
> einen 'Fully Recursive' Checkout mache, bekomme ich folgende
> Fehlermeldung:
> URL 'http://part-db.googlecode.com/svn/trunk/%20part-db'; doesn't exist
>
> Hat jemand einen Tip für mich ?

Ja, den Befehl, den ich dir oben mal geschickt habe, hat nach dem 
Internetpfad noch ein Leerzeichen, und dann kommt der lokale Ordner wo 
das Zeug heruntergeladen werden soll. So gibt man das im Terminal ein 
für den "svn checkout" Befehl. Ich denke mal bei TortoiseSVN brauchst du 
den lokalen Pfad nicht, sondern nur die reine URL:
1
http://part-db.googlecode.com/svn/trunk/

von Stefan . (xin)


Lesenswert?

> sondern nur die reine URL:
Perfekt !  Danke :)

von Gelöscht (kami89)


Lesenswert?

Also ich habe mal mit den Klassen angefangen. Vor allem an einer Klasse 
für den Datenbankzugriff habe ich gearbeitet. Dazu habe ich was ziemlich 
nützliches gefunden: http://www.peterkropff.de/site/php/pdo.htm

Diese Klasse macht es möglich, dass wir später auch ganz einfach andere 
Datenbanken einsetzen können. Ausserdem gibt es einige Features, die SQL 
Injections stark erschweren.

Alles in allem denke ich wäre das eine gute Basis für unsere 
Datenbankklasse. Ein Nachteil ist halt, dass es mindestens PHP 5.1 
voraussetzt. Da aber seit PHP5 das ganze OOP nochmal verbessert wurde, 
denke ich es macht schon wegen den Klassen Sinn, dass wir nun halt PHP4 
nicht mehr unterstützen.

Ich denke damit kann man leben. Wer hat denn heutzutage noch PHP4? ;-)

Was mir aber noch ein bisschen Kopfzerbrechen macht, sind 
Datenbankeinträge mit Zeichen wie " oder ' im Namen. Irgendwo gibts 
einfach immer Konflikte. Sei es beim JavaScript Menü oder bei HTML 
Elementen.
Momentan werden alle Datenbankeinträge ja noch mit 
mysql_real_escape_string() bearbeitet. Aber brauchts das eigentlich? So 
wie ich die Klasse momentan programmier habe, kann man problemlos 
Variablen mit " und ' im Namen in der Datenbank ablegen. Die werden dann 
in phpmyadmin auch genau so angezeigt, also ohne Backslashes. Auch das 
holen von diesen Daten ist kein Problem. Ein Problem gibts erst wenn so 
ein String als HTML Code ausgegeben wird ;-)

Einfach diese beiden Zeichen verbieten finde ich aber nicht so toll, es 
kann sicher mal vorkommen dass man solche Zeichen auch wirklich 
verwenden will.

Weiss jemand wie man sowas am besten löst? Vor allem wenn beide von 
diesen Zeichen erlaubt sind sehe ich ein Problem. Würde man nur eines 
davon verbieten, könnte man gezielt das andere Zeichen abfangen, das 
wäre wohl kein grosses Problem mehr.

von Udo N. (weinbauer73)


Lesenswert?

Normalerweise reicht das Escapen bei den Zeichen aus, um diese zu 
speichern. Wenn nicht, dann als HTML kodieren und übertragen. Als letzte 
Möglichkeit wäre BLOB mit base64 oder ähnliches, nur das halte ich für 
übertrieben.

Ich selbst habe mir auch eine eigene Datenbankklasse geschrieben. PDO 
ist dort allerdings noch ein Dummy. Die SQL-Statements werden in meiner 
Klasse in ein Array gespeichert und von der Klasse dann zusammen 
gesetzt. Somit wären auch Prepared Statements möglich.

von Gelöscht (kami89)


Lesenswert?

Ich glaub das mit dem escapen schaue ich mir später nochmal an, dafür 
habe ich keine Nerven mehr...

Übrigens habe ich jetzt mal einen neuen Branch "kami89" angelegt für die 
Entwicklung der Klassen. So könnt ihr schonmal schauen was ich gemacht 
habe.

Diese Version dort ist soweit lauffähig dass die ganze Startseite 
aufgebaut wird inklusive dem Kategorien-Menü. Mehr läuft noch nicht. 
Damit diese Kleinigkeit aber überhaupt läuft, müsst ihr eure config.php 
etwas abändern (siehe template) und per phpmyadmin die Spalte 
'parentnode' von der Tabelle 'categories' in 'parent_id' umbenennen ;-) 
(Grund siehe class/structural_db_element.php)

In dieser Datei habe ich ein paar Notizen gemacht die mir beim 
programmieren einfach so eingefallen sind.

Die wichtigsten Dateien, an denen ich gearbeitet habe, sind system.php, 
database.php, structural_db_element.php und category.php. Anhand dieser 
Dateien solltet ihr erkennen wie ich mir das ganze System etwa 
vorstelle.

In nav.php seht ihr wie die Klassen dann später verwendet werden.

Ich arbeite noch nicht lange mit OOP (und schon gar nicht mit php^^), 
also meldet euch einfach wenn euch komische Sachen auffallen :-)

Ahja, wie die Datenbank-Klasse verwendet wird ist am Anfang vielleicht 
etwas schwierig zu verstehen. Es ist jetzt halt nicht mehr nur ein 
mysql_query() mit dem man auf die Datenbank zugreift (und jeder weiss 
wie es geht).
In meiner Klasse gibt es jetzt zwei Funktionen: exec() für Anfragen, bei 
denen man keine Datenrückgabe erwartet, und query() für Anfragen mit 
Datenrückgabe (also eigentlich nur SELECT).

Da es schnell passiert ist, dass man die Rückgabewerte nicht ganz sauber 
verarbeitet (z.B. 0 und false nicht getrennt behandelt), habe ich 
vorgefertigte Funktionen für die wichtigsten Anfragen [insert(), 
delete_record(), set_data_field(), ...] erstellt. Bei diesen muss man 
dann nur noch auf false oder true prüfen, was anderes geben die nicht 
zurück.

Ein Nachteil davon, dass in der Klasse alles mit prepared statements 
erledigt wird, ist halt dass eine Abfrage nur noch Fragezeichen als 
Platzhalter für Werte enthält, und die Werte selber dann separat 
übergeben werden. Ich denke aber damit kann man leben (es kommt ja auch 
der Sicherheit zugute).

von Udo N. (weinbauer73)


Lesenswert?

Ich habe an der editpartsinfo.php und startup.php gearbeitet. Die 
Autoren hab ich in eine authors.php reingeschoben, damit diese in einer 
Schleife in startup.php verarbeitet werden können. Das mit den Themen 
ist jetzt auch geändert. Man kann eine alternative CSS in css/ angeben, 
wobei diese Datei nach dem entsprechenden Thema genannt werden muss, 
z.B. Greenway -> css/Greenway.css. -> Revision 498

Deine Arbeiten an der Datenbankklasse übernehme ich später, wenn ich die 
Templates fertig habe.

von Udo N. (weinbauer73)


Lesenswert?

Ich habe mal auf die schnelle eine neues Install-Script (install.sh) 
geschrieben, dass das Anlegen der Datenbank (in der Version 12) 
vereinfacht. In dem SQL-Script habe ich die Befehle für die Erstellung 
und Rechtevergabe eingebaut.
1
DROP DATABASE IF EXISTS `DB_NAME`;
2
CREATE DATABASE `DB_NAME` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
3
GRANT USAGE ON *.* TO `DB_NAME`@`DB_HOST` IDENTIFIED BY "DB_PASS";
4
GRANT ALL PRIVILEGES ON `DB_NAME`.`*` TO `DB_USER`@`DB_HOST`;
5
USE `DB_NAME`;

Die vier Platzhalter DB_NAME, DB_HOST, DB_USER und DB_PASS werden im 
Script definiert und durch den sed (Stream EDitor) ersetzt und dann 
MySQL übergeben. Das SQL-Script muss mit passenden Rechten aufgerufen 
werden (Create, Grant). Es läuft unter Linux, dürfte aber auch auf 
anderen Un*xen laufen.
1
#!/bin/sh
2
3
# MySQL-user with rights to create a database
4
ADMIN_USER=root
5
ADMIN_PASS=
6
7
# Database
8
DB_HOST=localhost
9
DB_NAME=part-db
10
DB_USER=part-db
11
DB_PASS=part-db
12
13
# Install
14
SQL_INSTALL="readme/createtables-FOR-V0.2.1-rev12.sql"
15
16
sed "s/DB_NAME/$DB_NAME/g;s/DB_HOST/$DB_HOST/g;s/DB_USER/$DB_USER/g;s/DB_PASS/$DB_PASS/g" <$SQL_INSTALL | mysql -u$ADMIN_USER -p$ADMIN_PASS -h$DB_HOST

Das Update liegt als Revision 499 vor.

von Gelöscht (kami89)


Lesenswert?

Ist ja richtig viel los hier, sind denn alle in den Ferien? :-)

Ich könnte mal eure Hilfe gebrauchen. Und zwar will ich das neue System, 
dass man einem Bauteil mehrere Lieferanten+Preise zuordnen kann, gleich 
in die neuen Klassen einbauen.

Jetzt habe ich gedacht, für diese Einkaufsinformationen benutze ich 
einfach die Tabelle "preise" und ändere dessen Name in "orderdetails" ab 
(dann sind auch gleich alle Tabellennamen englisch^^). Da drin können 
dann also pro Bauteil mehrere Einträge vorhanden sein.

Soweit, sogut. Nur muss ich jetzt mit einem Datenbankupdate die Spalten 
"id_supplier" und "supplierpartnr" aus der Tabelle "parts" in diese (bis 
jetzt) "preise" Tabelle hineinkriegen, ohne dass dabei etwas kaputt 
geht.
Da bis jetzt in der Tabelle "preise" nur Einträge von Teilen existieren, 
denen mal ein Preis zugewiesen wurde, müssen jetzt teilweise also auch 
neue Einträge angelegt werden, für diejenigen Teile denen zwar ein 
Lieferant, aber kein Preis zugewiesen wurde. Bei Teilen mit Preis muss 
der bereits vorhandene Eintrag in "preise" einfach überschrieben werden.

Tja, nun kenne ich mich mit SQL leider etwas zu wenig aus um das 
hinzukriegen. Kann mir da jemand auf die Sprünge helfen?

Die Spalten "id_supplier" und "supplierpartnr" existieren 
interessanterweise schon in der Tabelle "preise", haben aber kein 
Inhalt...Ob da wohl schonmal was vorbereitet wurde für genau das, was 
ich jetzt machen will?

Zum Thema Klassen:
So langsam nimmt das Ganze Form an. Allerdings ist es gar nicht so 
einfach, eine saubere objektorientierte Programmierung hinzubekommen 
ohne dass die Performance stark leidet. Die ganzen (komplizierten) 
SQL-Abfragen, wie sie bisher genutzt werden, sind halt performancemässig 
einfach unschlagbar.
Ich möchte nun aber eigentlich viel mehr mit Objekten herumhantieren 
statt nur mir den Daten (Arrays), die von den SQL-Abfragen zurückkommen. 
Und da kommt halt schnell mal einiges an Overhead zusammen.

Naja, ich habs jetzt mal so gemacht dass die zeitintensiven Funktionen 
wirklich erst bei Bedarf aufgerufen werden, und dann bis zum nächsten 
Abrufen zwischengespeichert werden. Zum Beispiel die Attribute "level" 
oder "full_path" von den Kategorien, Footprints usw. werden beim 
Erzeugen eines neuen Objektes noch nicht zugewiesen. Erst wenn diese 
Attribute das erste Mal abgerufen werden, dann werden sie "berechnet" 
und auch gleich gespeichert bis zur nächsten Abfrage.
Damit kann man schon noch einiges an Zeit sparen, da häufig halt auch 
ganze Objekt-Arrays erzeugt werden bei denen viele Objektattribute 
nachher gar nie abgefragt werden.

Oder habt ihr da eine bessere Idee? Ich lad gleich nochmal die neuste 
Version in meinen SVN Branch damit ihr meinen aktuellen Stand seht.

Ach ja, wofür ist eigentlich die Tabelle "pending_orders"? Ist die bei 
euch auch leer? Die wird doch (noch?) gar nicht benutzt, oder?

von Gelöscht (kami89)


Angehängte Dateien:

Lesenswert?

Ich hab mal noch ein UML Diagramm erstellt damit man ein bisschen den 
Überblick über die Klassen hat. Es entspricht nicht ganz dem aktuellen 
Stand des Codes. Und die Klassen User und Group sind nicht komplett.

Die meisten Funktionen haben natürlich Argumente und Rückgabewerte, sind 
aber einfach im Diagramm nicht eingezeichnet.

Ausserdem habe ich nur die Verbindungen für die Vererbungen 
eingezeichnet.

P.S.
Ich wäre echt froh wenn mir noch jemand wegen dem Datenbankupdate für 
die Lieferinformationen (siehe letzter Beitrag) helfen könnte.

von Udo N. (weinbauer73)


Lesenswert?

HTMLTable? Das ganze wird doch über die vlibTemplate-Klasse abgebildet 
und benötigt keine weitere Kapselung. Genauso kann die 
build_html_tree()-Funktion durch eine einfach Array-Rückgabe ersetzt 
werden, denn die LOOP-Funktion in den Templates braucht einfach ein 
Array des Typs
1
$array[x]['name']

Dabei ist x eine Zählvariable (kann durch [] beim Aufbau ersetzt werden, 
was ein Anhängen der Daten an das Array bewirkt) und 'name' der Name 
(Schlüssel).

Ansonsten sieht das gut aus :-) Ich werde morgen mal wieder an die 
Templates rangehen, dann können wir anfangen, beide Versionen zu 
verschmelzen.

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
> HTMLTable? Das ganze wird doch über die vlibTemplate-Klasse abgebildet
> und benötigt keine weitere Kapselung. Genauso kann die
> build_html_tree()-Funktion durch eine einfach Array-Rückgabe ersetzt
> werden, denn die LOOP-Funktion in den Templates braucht einfach ein
> Array des Typs
> $array[x]['name']
>
> Dabei ist x eine Zählvariable (kann durch [] beim Aufbau ersetzt werden,
> was ein Anhängen der Daten an das Array bewirkt) und 'name' der Name
> (Schlüssel).

Ach so, okay das ist natürlich super! Ich habe selber auch schon gedacht 
dass da teilweise noch etwas zu viel HTML drin ist in den Klassen.

Aber bezüglich HTMLTable hatte ich eben noch eine spezielle Idee, das 
mit unserem Issue 22 
(https://code.google.com/p/part-db/issues/detail?id=22) zusammenhängt:
Ich dachte da bei der HTMLTable an eine Klasse, der man einfach ein 
Array aus Objekten (v.a. Teile und Bestellinformationen), den Typ der 
Tabelle (showparts, orderparts, nopriceparts,...) und eine Referenz auf 
den aktuellen Benutzer übergeben kann. Wie in Issue 22 beschrieben, soll 
ja jeder Benutzer seine Tabellenspalten individuell gestalten können. 
Und genau das soll dann diese Klasse HTMLTable erledigen. Damit könnte 
man dann also extrem individuelle Tabellen erzeugen lassen.

Allerdings bin ich selber auch noch nicht ganz zufrieden mit diesem 
System, weil dann eben die Tabellen nicht durchs Templatesystem 
gestaltet werden.

Hast du grad eine gescheite Idee wie wir das am besten lösen?

von Udo N. (weinbauer73)


Lesenswert?

Urban B. schrieb:
> Aber bezüglich HTMLTable hatte ich eben noch eine spezielle Idee, das
> mit unserem Issue 22
> (https://code.google.com/p/part-db/issues/detail?id=22) zusammenhängt:
> Ich dachte da bei der HTMLTable an eine Klasse, der man einfach ein
> Array aus Objekten (v.a. Teile und Bestellinformationen), den Typ der
> Tabelle (showparts, orderparts, nopriceparts,...) und eine Referenz auf
> den aktuellen Benutzer übergeben kann. Wie in Issue 22 beschrieben, soll
> ja jeder Benutzer seine Tabellenspalten individuell gestalten können.
> Und genau das soll dann diese Klasse HTMLTable erledigen. Damit könnte
> man dann also extrem individuelle Tabellen erzeugen lassen.
>
> Allerdings bin ich selber auch noch nicht ganz zufrieden mit diesem
> System, weil dann eben die Tabellen nicht durchs Templatesystem
> gestaltet werden.
>
> Hast du grad eine gescheite Idee wie wir das am besten lösen?

Da die einzelnen Tabellen ja in den Templates vorhanden sind, brauchen 
wir ja nur das Array und die Tabelle zu übergeben und die HTML-Klasse 
würde das entsprechend veranlassen. Genauso können wir dann Kopf- und 
Fußzeilen übernehmen.
1
$html -> put_html_header($meta)
2
$html -> put_html_table($template,$array)
3
$html -> put_html_footer()

In dem Beispiel würde also zuerst der Header generiert ($meta ist ein 
Array und enthält alle Kopfdaten, die derzeit alle per Hand über 
$tmpl->setVar() gesetzt werden), dann die Templatevorlage geladen und 
mit den Array verbunden und am Schluss noch der Footer ausgegeben. 
Intern kann die Klasse die einzelnen Templates in privaten Funktionen 
(nur innerhalb der Klasse sichtbar) bearbeiten, um es übersichtlicher zu 
halten. Ich kann ja mal morgen eine HTML-Klasse erzeugen, die obiges 
implementiert.

Die Benutzerklasse würde ihre Daten in eine Session kopieren und diese 
Daten stehen global allen Klassen und Funktionen zur Verfügung. Die 
SQL-Abfragen würden dann auf $_SESSION zurückgreifen, um die Userdaten 
einzubauen. Sowas nutze ich in meinem eigenen CMS-Framework.

Für unsere eigenen Klassen- und Funktionsbenennung sollten wir auf alle 
Fälle ein festes Namensschema einführen, sonst kommen wir irgendwann 
durcheinander. Da du hier schon angefangen hast, wäre also 
Kleinschreibung und Trennung mit "_" für alle verbindlich? Zudem könnten 
wir auch Maintainer für die einzelnen Bereiche benennen :-) Templates 
und Benutzerverwaltung wäre dann wohl meine Sache? Das Tabellendesign 
bis auf die eigentliche Usertable und die Anforderungen an die anderen 
Tabellen überlasse ich dann anderen.

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
> In dem Beispiel würde also zuerst der Header generiert ($meta ist ein
> Array und enthält alle Kopfdaten, die derzeit alle per Hand über
> $tmpl->setVar() gesetzt werden), dann die Templatevorlage geladen und
> mit den Array verbunden und am Schluss noch der Footer ausgegeben.
> Intern kann die Klasse die einzelnen Templates in privaten Funktionen
> (nur innerhalb der Klasse sichtbar) bearbeiten, um es übersichtlicher zu
> halten. Ich kann ja mal morgen eine HTML-Klasse erzeugen, die obiges
> implementiert.

Also ich habe jetzt nicht alles zu 100% verstanden, aber ich denke mal 
das kommt gut so :-) Das wäre super wenn du da mal eine solche Klasse 
bauen könntest.

Udo Neist schrieb:
> Die Benutzerklasse würde ihre Daten in eine Session kopieren und diese
> Daten stehen global allen Klassen und Funktionen zur Verfügung. Die
> SQL-Abfragen würden dann auf $_SESSION zurückgreifen, um die Userdaten
> einzubauen. Sowas nutze ich in meinem eigenen CMS-Framework.

OK dazu kann ich noch nicht viel sagen, von Sessions usw. habe ich noch 
nicht viel Ahnung.

Udo Neist schrieb:
> Für unsere eigenen Klassen- und Funktionsbenennung sollten wir auf alle
> Fälle ein festes Namensschema einführen, sonst kommen wir irgendwann
> durcheinander. Da du hier schon angefangen hast, wäre also
> Kleinschreibung und Trennung mit "_" für alle verbindlich?

Ja das wäre sicher vorteilhaft wenn wir uns da einigen. Da bisher der 
grösste Teil der Funktionen nach diesem Schema benannt wurde, habe ich 
das einfach mal so übernommen. Die Klassennamen habe ich aber gross 
geschrieben, ich denke das hat sich ja mehr oder weniger so 
eingebürgert.

Übrigens muss ich in den nächsten paar Wochen die Zeit fürs 
Programmieren etwas reduzieren, es sind bald Semesterprüfungen... ;-)
Ich bin aber eigentlich eh der Meinung dass wir jetzt an der ultimativen 
Version Eins Punkt Null (Part-DB v1.0) arbeiten, und Gut Ding will ja 
bekanntlich Weile haben :-D

von Udo N. (weinbauer73)


Lesenswert?

Update auf Revision 505: class_html.php erstellt.

Die HTML-Klasse (nicht HTMLTable wie im Schema, da einfach zu 
universell) kapselt jetzt die vlibTemplate-Klasse und stellt einige 
Funktionen bereit.

1
class HTML {
2
        function __construct()
3
        function set_html_meta ($meta = array())
4
        function set_html_variable ($key = '',$var = ''[optional $type = '',$format = array()])
5
        function unset_html_variable ($key = '')
6
        function clr_html_variable ()
7
        function set_html_loop ($key = '',$array = array())
8
        function unset_html_loop ($key = '')
9
        function clr_html_loop ()
10
        function print_html_header ()
11
        function print_html_footer ()
12
        function load_html_template ($template = '')
13
        function parse_html_template ($template = '',$array = array())
14
        function parse_html_table ($array = array())
15
        function print_html_template ()
16
        function print_error_state ($error = 0)
17
}

Ich habe die startup.php und config_system.php auf diese Klasse 
umgeschrieben. Beide Scripte zeigen dabei die zwei Ansätze, wie man die 
neue Klasse benutzen kann. Erstes Script nutzt statt der vlib-Funktionen 
setVar()/setLoop() die neuen Funktionen set_html_*(). 
set_html_variable() ist zudem noch etwas mächtiger als setVar(): 
optional kann man den Variablentyp setzen (wird beispielhaft gesetzt) 
oder die Formatierung nach number_format() oder sprintf() nutzen. Das 
andere Script verwendet parse_html_template(), welches 
load_html_template(), set_html_*() und print_html_template() 
zusammenfast.

Den HTML-Kopf wird durch print_html_header() ausgegeben, der Abschluss 
durch print_html_footer().

In der Klasse sind die Funktionen erklärt.

von Gelöscht (kami89)


Angehängte Dateien:

Lesenswert?

Okay, sieht ja ganz gut aus, aber wie man damit nun individuelle 
Tabellen zeichnen kann, habe ich noch nicht verstanden :-)

Übrigens ist mir noch aufgefallen dass du deutsche, und ich englische 
Kommentare verwende. Vielleicht sollten wir uns da auch noch einigen. 
Also ich bevorzuge eigentlich englisch, weil es halt einfach DIE Sprache 
für Programmierer ist, und für ein OpenSource Projekt sowieso. Und 
ausserdem kann ich so mein bescheidenes Englisch noch ein bisschen 
verbessern :-)

Und übrigens, in der config.php solltest du noch das define "LANGUAGE" 
in Anführungszeichen setzen (bekomme immer eine Fehlermeldung deswegen). 
Was hat es damit eigentlich auf sich? Soll das ermöglichen, dass part-DB 
in verschiedenen Sprachen angezeigt werden kann? Das wäre ja cool! Aber 
wo würde man dann die verschiedenen Übersetzungstexte definieren?

Ich habe nochmal ein neues Klassendiagramm angehängt, diesmal mit 
Parametern und Rückgabewerte. Ausserdem ist jetzt die Klasse "File" neu. 
Diese soll alle möglichen Dateianhänge von irgendwelchen Objekten 
vereinheitlichen. Man könnte dann also jedem Subelement von 
"FilesContainingElement" unbeschränkt viele Dateien anhängen.

Und die Klasse "Export" ist dazu gedacht, dass man die mit allen 
möglichen Objekten befüllen kann (Teile, Bestellinformationen, 
Lagerorte,...), ein Exportformat wählt, und dann eine CSV-Datei oder was 
auch immer bekommt. Später wäre natürlich dann noch schön wenn man 
bequem eigene Exportformate definieren kann, ist bisher aber noch nicht 
vorgesehen.

Nachtrag:
Ach ja, und die class_html.php würde ich noch in html.php umbenennen, 
dann hättest du das gleiche Namensschema wie ich. Die Dateien liegen ja 
eh alle im Ordnert "class", sollte also eh klar sein dass es sich dort 
um Klassen handelt.

von Udo N. (weinbauer73)


Lesenswert?

Urban B. schrieb:
> Okay, sieht ja ganz gut aus, aber wie man damit nun individuelle
> Tabellen zeichnen kann, habe ich noch nicht verstanden :-)

An dieser Stelle bin ich noch nicht. Aber ich hatte es so vorgesehen, 
das man den Namen des Templates zusammen mit einem Array übergibt und 
die entsprechende Funktion die Tabelle erzeugt. Im Grunde macht das 
print_html_table() ja schon, in dem ich dort das Template fest auf 
"vlib_table.tmpl" setze und der Aufruf von load_html_template() den 
Scriptnamen in den Pfad übernimmt.

> Übrigens ist mir noch aufgefallen dass du deutsche, und ich englische
> Kommentare verwende. Vielleicht sollten wir uns da auch noch einigen.
> Also ich bevorzuge eigentlich englisch, weil es halt einfach DIE Sprache
> für Programmierer ist, und für ein OpenSource Projekt sowieso. Und
> ausserdem kann ich so mein bescheidenes Englisch noch ein bisschen
> verbessern :-)

Man kann ja die Kommentare später übersetzen :) Solange lass ich die 
erstmal in Deutsch.

> Und übrigens, in der config.php solltest du noch das define "LANGUAGE"
> in Anführungszeichen setzen (bekomme immer eine Fehlermeldung deswegen).

Erledigt.

> Was hat es damit eigentlich auf sich? Soll das ermöglichen, dass part-DB
> in verschiedenen Sprachen angezeigt werden kann? Das wäre ja cool! Aber
> wo würde man dann die verschiedenen Übersetzungstexte definieren?

Erstmal ist das nur für LC_ALL 
(http://php.net/manual/de/function.setlocale.php) interessant, später 
könnte man damit auch die Templates internationalisieren. Nur wer 
übersetzt die Templates in andere Sprachen? gettext() wäre zwar 
interessant, aber für mich noch eine Spur zu hoch.

> Nachtrag:
> Ach ja, und die class_html.php würde ich noch in html.php umbenennen,
> dann hättest du das gleiche Namensschema wie ich. Die Dateien liegen ja
> eh alle im Ordnert "class", sollte also eh klar sein dass es sich dort
> um Klassen handelt.

Umbenennen geht immer :-) Ist eine Angewohnheit von mir, die Klassen und 
Libraries mit "class_" bzw. "class." oder "lib_" bzw. "lib." noch extra 
zu kennzeichnen, um Verwechselungen zu vermeiden. Könnte ja jemand 
meinen, Libraries und Klassen gehören in das gleiche Verzeichnis ;-)

Ich habe config_page.php auch auf mod_xsendfile erweitert. Noch 
funktioniert es nicht perfekt, aber wenn, dann lohnt es sich das in die 
File-Klasse zu verschieben.

von Gelöscht (kami89)


Angehängte Dateien:

Lesenswert?

Okay alles klar :-)

Das mit der Internationalisierung können wir ja mal machen wenn uns 
langweilig ist ;-) Momentan stehen aber wichtigere Sachen an...

Hast du eigentlich schon Erfahrung mit Doxygen? Meinst du, es würde sich 
lohnen bzw. Sinn machen den Sourcecode mit Doxygen zu dokumentieren? Ich 
bin mir nicht sicher ob das vielleicht erst bei viel grösseren Projekten 
beginnt Sinn zu machen.

Und kennst du dich eigentlich mit SQL gut aus? Könntest du mir beim 
Datenbankupdate fürs neue Lieferantendetails-System helfen? :-)

Anbei übrigens nochmal eine neuere version des Klassendiagrammes.

von Udo N. (weinbauer73)


Lesenswert?

Ich hab irgendwann mal mit Doxygen experimentiert, hab dann aber mal ein 
anderes System getestet. Hat mich beides nicht überzeugt. So hab ich die 
gesamte Doku über Dokuwiki gemacht, das keine Datenbank benötigt.

SQL ist für mich kein Buch mit sieben Siegeln, auch wenn ich nicht jede 
Möglichkeit kenne oder nutze.

Bin gerade an der print_table_row() aus der lib.php dran. Wenn das 
funktioniert, kann ich die beiden Aufrufe aus search.php und 
showparts.php auf die LOOPs umschreiben. Dann sieht man die Vorteile der 
neuen HTML-Klasse. Derzeit wird der Output abgefangen und als fertiger 
HTML-Block einfach eingefügt.

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
> SQL ist für mich kein Buch mit sieben Siegeln, auch wenn ich nicht jede
> Möglichkeit kenne oder nutze.

Das heisst, du könntest mal probieren ein Datenbankupdate zu schreiben? 
:-) Was man machen müsste, habe ich ja hier geschrieben: 
Beitrag "Re: PART-DB RW 1.2"

Udo Neist schrieb:
> Bin gerade an der print_table_row() aus der lib.php dran. Wenn das
> funktioniert, kann ich die beiden Aufrufe aus search.php und
> showparts.php auf die LOOPs umschreiben. Dann sieht man die Vorteile der
> neuen HTML-Klasse. Derzeit wird der Output abgefangen und als fertiger
> HTML-Block einfach eingefügt.

OK das würde mich interessieren wie das dann ausschaut. Ich finde es 
einfach wichtig, dass man so eine Tabelle mit Objekten wie "Part", 
"Orderinformations", "Footprint", "File" usw. erzeugen kann. Dann muss 
man noch entscheiden, was für ein Tabellentyp es sein soll 
(nopriceparts, obsoleteparts, defectfilenamefiles, ...), und die 
Tabellenspalten werden dann in Abhängigkeit vom aktuellen Benutzer 
gestaltet (Sichtbarkeit und Reihenfolge der Spalten).

von Udo N. (weinbauer73)


Lesenswert?

Urban B. schrieb:
> Udo Neist schrieb:
>> SQL ist für mich kein Buch mit sieben Siegeln, auch wenn ich nicht jede
>> Möglichkeit kenne oder nutze.
>
> Das heisst, du könntest mal probieren ein Datenbankupdate zu schreiben?
> :-) Was man machen müsste, habe ich ja hier geschrieben:
> Beitrag "Re: PART-DB RW 1.2"

Schaue ich mir die Tage mal an :-)

> OK das würde mich interessieren wie das dann ausschaut. Ich finde es
> einfach wichtig, dass man so eine Tabelle mit Objekten wie "Part",
> "Orderinformations", "Footprint", "File" usw. erzeugen kann. Dann muss
> man noch entscheiden, was für ein Tabellentyp es sein soll
> (nopriceparts, obsoleteparts, defectfilenamefiles, ...), und die
> Tabellenspalten werden dann in Abhängigkeit vom aktuellen Benutzer
> gestaltet (Sichtbarkeit und Reihenfolge der Spalten).

Ganz so einfach geht das nicht. Zwar kann man die Reihenfolge der 
Spalten fast beliebig machen, aber dazu muss man das Template anders 
aufbauen und viele Funktionen in den Code überführen. Das würde derzeit 
ich in die ToDo- oder Wunschliste aufnehmen. Ich würde es bei im Moment 
bei den jetzigen Tabellen belassen. Durch die Templates wird so manches 
entschlackt, aber nicht an jeder Stelle flexibel.

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
> Schaue ich mir die Tage mal an :-)

Danke :-)

Udo Neist schrieb:
> Ganz so einfach geht das nicht. Zwar kann man die Reihenfolge der
> Spalten fast beliebig machen, aber dazu muss man das Template anders
> aufbauen und viele Funktionen in den Code überführen. Das würde derzeit
> ich in die ToDo- oder Wunschliste aufnehmen. Ich würde es bei im Moment
> bei den jetzigen Tabellen belassen. Durch die Templates wird so manches
> entschlackt, aber nicht an jeder Stelle flexibel.

Hmm okay. Naja, Voraussetzung für die flexiblen Tabellen ist ja sowieso 
die Implementierung der Benutzerverwaltung, und die braucht ja noch ein 
bisschen Zeit.

von Udo N. (weinbauer73)


Lesenswert?

Revision 506: search.php und showparts.php sind auf Templates 
umgestellt. Die Funtion print_table_row() gibt nur noch ein Array von 
Daten zurück.

Kurze Einführung in die HTML-Klasse:

Der HTML-Kopf ist in der vlib_head.tmpl gespeichert und ist in 
print_html_header() fest kodiert. Die verschiedenen Variablen werden 
durch set_html_meta() gesetzt.
1
$html = new HTML;
2
$html -> set_html_meta ( array(
3
  'title'         =>  'Deviceinfo',
4
  'http_charset'  =>  $http_charset,
5
  'theme'         =>  $theme,
6
  'css'           =>  $css,
7
  'menu'          =>  true,
8
  'popup'         =>  true,
9
  'hide_id'       =>  $hide_id
10
  )
11
);
12
$html -> print_html_header();

Das Herzstück der Klasse ist die Behandlung der einzelnen Templates. Es 
werden zwei Herangehensweisen unterstützt. Wer mit vlibTemplates schon 
vertraut ist, der kennt die Funktion setVar(). Diese wird durch 
set_html_variable() ersetzt. Zusätzlich beherrscht sie einige 
Formatierungen mittels number_format() und sprintf(). Die kürze und 
etwas elegantere Methode nutzt parse_html_template(). Man übergibt den 
Namen des Templates und ein assoziatives Array. Ist der Wert eines 
Paares ein Array, so wird dieses als Loop für die Templates 
interpretiert. Ein Beispiel ist folgender Code aus showparts.php:
1
$table = array(array('new_category'=>true));
2
$result   = parts_select_category( $cid, $subcat);
3
$row_odd = true;
4
while ( $data = mysql_fetch_assoc( $result))
5
{
6
  $table[] = print_table_row( $row_odd, $data, $hide_mininstock);
7
  $row_odd = ! $row_odd;
8
}
9
10
$array = array(
11
  'cid'                =>  $cid,
12
  'subcat'             =>  (! $subcat),
13
  'subcat_text'        =>  $subcat_text,
14
  'category_get_name'  =>  category_get_name($cid),
15
  'hide_mininstock'    =>  $hide_mininstock,
16
  'table'              =>  $table
17
  );
18
$html -> parse_html_template( 'table', $array );

Die Alternative parse_html_table() ist für Loops vorgesehen, die 
vollständige Blöcke (bei Tabellen müssen die table-tags im Template 
vorhanden sein) erzeugen. Teilausgaben müssen mit parse_html_template() 
Vorlieb nehmen.

Den Abschluss der Webseite gibt print_html_footer() aus. Die 
dazugehörige Datei ist vlib_foot.tmpl.
1
$html -> print_html_footer();

von Udo N. (weinbauer73)


Lesenswert?

> Udo Neist schrieb:
>> Ganz so einfach geht das nicht. Zwar kann man die Reihenfolge der
>> Spalten fast beliebig machen, aber dazu muss man das Template anders
>> aufbauen und viele Funktionen in den Code überführen. Das würde derzeit
>> ich in die ToDo- oder Wunschliste aufnehmen. Ich würde es bei im Moment
>> bei den jetzigen Tabellen belassen. Durch die Templates wird so manches
>> entschlackt, aber nicht an jeder Stelle flexibel.

Wuaah... Was hab ich da denn geschrieben?

Nochmal: Das würde ich derzeit in die ToDo- oder Wunschliste aufnehmen. 
Ich würde es bei den jetzigen Tabellen belassen.

von Udo N. (weinbauer73)


Lesenswert?

In der index.php steht ja ein require ('mobil/mobil.php') drin. Da es 
dieses Script nicht gibt, würde ein Aufruf von einem Tablet-PC unter 
Umständen ins Leere laufen. Wäre es da nicht sinnvoll vorerst ein 
"Sorry, wird derzeit nicht unterstützt" anzuzeigen und später einfach 
ein angepasstes Thema (dafür sind ja gerade die Templates so genial) zu 
laden?

Ich war so frei und hab zumindest ersteres implementiert.

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
> Nochmal: Das würde ich derzeit in die ToDo- oder Wunschliste aufnehmen.

Da ist es schon drin ;-)

> Ich würde es bei den jetzigen Tabellen belassen.

Ja vorerst kein Problem, aber ich dachte halt ich baue gleich schon so 
eine Klasse, damit man später nicht nochmal alles total umbauen muss. 
Ich hätte jetzt die Tabellengestaltung noch nicht benutzerspezifisch 
gemacht, aber halt einfach alles schonmal so vorbereitet dass man dann 
nur noch diese eine Klasse anpassen muss, sobald die Benutzerverwaltung 
steht.

Udo Neist schrieb:
> In der index.php steht ja ein require ('mobil/mobil.php') drin. Da es
> dieses Script nicht gibt, würde ein Aufruf von einem Tablet-PC unter
> Umständen ins Leere laufen. Wäre es da nicht sinnvoll vorerst ein
> "Sorry, wird derzeit nicht unterstützt" anzuzeigen und später einfach
> ein angepasstes Thema (dafür sind ja gerade die Templates so genial) zu
> laden?

Statt einem Hinweis können wir doch einfach die ganz normale Seite 
anzeigen lassen? Also ich hätte lieber eine Seite, die nicht auf 
Mobilgeräte angepasst ist, als gar keine Seite :-)

von Udo N. (weinbauer73)


Lesenswert?

check_mobile() in der index.php ist Geschichte. Man muss nicht alles in 
Funktionen giessen, wenn der Aufruf nur einmal im gesamten Kontext 
erfolgt. Folgende Variante ersetzt die Funktion komplett und verwendet 
eine while()-Schleife. In der index.php habe ich auf die Klammern 
verzichtet, um die Schleife als Zweizeiler zu bekommen. Ausgeschrieben 
läuft das so ab:
1
$agents = array(
2
  'Windows CE', 'Pocket', 'Mobile',
3
  'Portable', 'Smartphone', 'SDA',
4
  'PDA', 'Handheld', 'Symbian',
5
  'WAP', 'Palm', 'Avantgo',
6
  'cHTML', 'BlackBerry', 'Opera Mini',
7
  'Nokia', 'PSP', 'J2ME'
8
);
9
10
$mobile = false;
11
if (isset($_SERVER["HTTP_USER_AGENT"])) 
12
{
13
   while(list($agent) = each($agents) && !$mobile)
14
   {
15
      if (strpos($_SERVER["HTTP_USER_AGENT"], $agent))
16
      {
17
         $mobile = true;
18
      }
19
   }
20
}

while() wird solange durchlaufen, bis die Bedingung ein false ergibt. 
Enthält das Array ein Elemente hat und die Stringfunktion innerhalb der 
Schleife hat keinen Treffer ergeben, so bleibt die Variable $mobile auf 
false und wird durch die Negierung true. Die UND-Verknüpfung ergibt 
damit true. Ist das Array durchlaufen oder ein Treffer im Array 
gelandet, so wird die UND-Verknüpfung false und while() beendet sich. 
Man erspart sich das break.

Geht man noch eins weiter, kann man die äußere IF-Abfrage in die 
while()-Bedingung einfliessen lassen.
1
while(list($agent) = each($agents) && isset($_SERVER["HTTP_USER_AGENT"]) && !$mobile)
2
{
3
   if (strpos($_SERVER["HTTP_USER_AGENT"], $agent))
4
   {
5
      $mobile = true;
6
   }
7
}

Für die Hardcore-PHP-Fans als Dreizeiler:
1
$agents = array('Windows CE','Pocket','Mobile','Portable','Smartphone','SDA','PDA','Handheld','Symbian','WAP','Palm','Avantgo','cHTML','BlackBerry','Opera Mini','Nokia','PSP','J2ME');
2
$mobile = false;
3
while(list($agent) = each($agents) && isset($_SERVER["HTTP_USER_AGENT"]) && !$mobile) if (strpos($_SERVER["HTTP_USER_AGENT"], $agent)) $mobile = true;

von Udo N. (weinbauer73)


Lesenswert?

> Udo Neist schrieb:
>> In der index.php steht ja ein require ('mobil/mobil.php') drin. Da es
>> dieses Script nicht gibt, würde ein Aufruf von einem Tablet-PC unter
>> Umständen ins Leere laufen. Wäre es da nicht sinnvoll vorerst ein
>> "Sorry, wird derzeit nicht unterstützt" anzuzeigen und später einfach
>> ein angepasstes Thema (dafür sind ja gerade die Templates so genial) zu
>> laden?
>
> Statt einem Hinweis können wir doch einfach die ganz normale Seite
> anzeigen lassen? Also ich hätte lieber eine Seite, die nicht auf
> Mobilgeräte angepasst ist, als gar keine Seite :-)

Ich hab beim Vergleich der Branches festgestellt, das es die Meldung 
bereits gab und ich die schon vor längerem entsorgt habe.

Das Problem der Mobilgeräte ist die beschränkte Größe des Screens. Da 
kann man das Menü und den Content praktisch nicht nutzen. Man müsste das 
Menü auslagern. Sind die Frames mal verschwunden, lässt sich das Menü 
ganz einfach ausblenden (CSS: "display:none;"), damit der Inhalt 
angezeigt wird und umgekehrt. Das könnte man dann sehr simple mit einem 
Switch im Template freischalten. Genauso könnte man dann auch 
Nicht-Fullscreen-Fenster der Browser behandeln. Beides würde ein 
Javascript-Schnipsel machen.

Pseudocode:
1
var menu_on = {TMPL_IF NAME="menu_on"}1{TMPL_ELSE}0{/TMPL_IF};
2
3
if (menu_on == 1) div.menu.style="display:block";
4
if (menu_on == 0 and browser.width<=1024) div.menu.style="display:none";

von Udo N. (weinbauer73)


Lesenswert?

- Update auf Revision 507
- Webseite http://weinbauer73.myparts.info/ aktualisiert

Archiv ohne die Grafiken: 
http://weinbauer73.myparts.info/part-db-svn507-un20120730.tar.gz

von Gelöscht (kami89)


Lesenswert?

Ich habe in meinem Branch einen neuen Ordner "documentation" erstellt. 
Ich denke, den können wir später auch für die Dokumentation (für 
Anwender und Entwickler) verwenden, z.B. für Hilfedateien.

Darin habe ich den Unterordner "UML" erstellt, in dem ich das 
Klassendiagramm abgelegt habe. So werden die Versionen auch gleich vom 
SVN verwaltet, und es ist immer schnell erreichbar.

Das jeweils aktuelle PDF ist unter dieser Adresse erreichbar: 
https://part-db.googlecode.com/svn/branches/kami89/documentation/UML/class_diagram.pdf

von kirk d. (kirkdis)


Lesenswert?

Hallo Community,

ich war seit Januar 2012 auf der Suche nach einer Lagerverwaltung für 
mich in der Firma. Nur durch Zufall bin ich über die PArt-DB gestolpert 
und fand die auf Anhieb recht gut programmiert. Vor einem Monat dann 
haben wir angefangen in unserem Lager Ersatzteile jeglicher Art 
aufzunehmen. Mir ist im vornherein bewusst dass ich die Part-DB dafür 
zweckentfremde, da diese ja eigentlich nur für 
Kleinstelektronikkomponenten ausgelegt ist.

Was ich super finden ist, dass die GUI sehr sauber und einfach gehalten 
ist. Allderdings stört mich z.b. der Footprint in den einzelnen 
Bauteilen. Diesen kann ich nicht verwenden. Gibt es eine Möglichkeit 
diesen rauszunehmen? Vielleicht könnt ihr da zukünftig was Einbauen wo 
man den Punkt einfach per Checkbox ausblenden kann.

Aufgrund der Massen an Ersatzteilen merke ich dass wir nach und nach 
Probleme bekommen. Die Funktion mit den Bildern zu den Artikeln ist 
genial allerdings wird bei Kategorien mit vielen Teilen die Auflistung 
sehr träge.

Aktuell schaue ich fast täglich in die Google codes Projektseite 
allerdings ist die Entwicklung fast ausschließlich hier im Gange.

Ich selbst bin leider programmiertechnisch nicht soo fit, was mich aber 
nicht abhält auch mal Codeschnipsel nach Anleitung zu ändern.

Ich würde mich gerne aber als Tester bereit erklären euch zu helfen.

Was sich sehr gut bewährt hat ist die Hardware mit der ich arbeite. Die 
Datenbank und der Webserver läuft auf einer Synology DS 107. Von daher 
kann ich auf SVN´s verzichten und kann von mehreren Rechner 
unproblematisch auf die Datenbank zugreifen. Ich weiss nicht ob das von 
euch schon jemand getestet hat.

Keep the work going on!

Gruß Kirkdis

von Gelöscht (kami89)


Lesenswert?

Hallo kirkdis,

> ich war seit Januar 2012 auf der Suche nach einer Lagerverwaltung für
> mich in der Firma. Nur durch Zufall bin ich über die PArt-DB gestolpert
> und fand die auf Anhieb recht gut programmiert. Vor einem Monat dann
> haben wir angefangen in unserem Lager Ersatzteile jeglicher Art
> aufzunehmen.

Cool, dass unser Projekt bereits den Weg in eine Firma gefunden hat :-) 
Darf man fragen, wie viele Arbeiter auf die Part-DB zugreifen? Bisher 
ist Part-DB allerdings noch nicht für die Verwendung in einer Firma 
ausgelegt. Das soll sich aber noch ändern, es wird in Zukunft z.B. eine 
Benutzerverwaltung (mit Rechtevergabe) geben.

> Was ich super finden ist, dass die GUI sehr sauber und einfach gehalten
> ist. Allderdings stört mich z.b. der Footprint in den einzelnen
> Bauteilen. Diesen kann ich nicht verwenden. Gibt es eine Möglichkeit
> diesen rauszunehmen? Vielleicht könnt ihr da zukünftig was Einbauen wo
> man den Punkt einfach per Checkbox ausblenden kann.

Eine solche Idee hatte ich auch schon. Ich dachte da an eine Einstellung 
für die Kategorien, also quasi um anzugeben ob es sich bei einer 
Kategorie um Bauteile mit Footprints handelt. Ich habe bei mir z.B. eine 
Kategorie "Werkstatt" in dem ich Werkzeuge und Verbrauchsmaterialien 
verwalte. Und da machen die Footprints auch wenig Sinn. Daher wäre es 
wünschenswert, wenn man bei ausgewählten Kategorien die Footprints 
deaktivieren kann.

Da wir aber momentan an einem relativ grossen Umbau arbeiten (Einführung 
eines Templatesystems und Umbau auf objektorientierte Programmierung), 
denke ich, werden wir diese neue Funktion erst in die neue Version 
aufnehmen. Heisst also, es wird noch etwas dauern bis diese Funktion zur 
Verfügung stehen wird.

> Aufgrund der Massen an Ersatzteilen merke ich dass wir nach und nach
> Probleme bekommen. Die Funktion mit den Bildern zu den Artikeln ist
> genial allerdings wird bei Kategorien mit vielen Teilen die Auflistung
> sehr träge.

Von wievielen Teilen in der Auflistung reden wir hier etwa? Wie viele 
davon haben ein Bild zugeordnet? Footprint wird keines der Bauteile 
zugeordnet haben, oder? Und welche Version von Part-DB verwendest du 
(hast du das Archiv v0.2.2 installiert, oder die neuste SVN-Revision)?

> Ich würde mich gerne aber als Tester bereit erklären euch zu helfen.

Das können wir immer gebrauchen :-)

> Was sich sehr gut bewährt hat ist die Hardware mit der ich arbeite. Die
> Datenbank und der Webserver läuft auf einer Synology DS 107. Von daher
> kann ich auf SVN´s verzichten und kann von mehreren Rechner
> unproblematisch auf die Datenbank zugreifen. Ich weiss nicht ob das von
> euch schon jemand getestet hat.

Hmm was meinst du damit, dass du aufs SVN verzichten kannst? Übers SVN 
ist einfach immer die allerneuste (Entwickler-)Version erhältlich. Diese 
können aber durchaus auch mal einige Fehler enthalten. Die erhältlichen 
Archive sind etwas älter, aber sollten dafür stabiler/erprobter sein.
Und dass man von mehreren Rechnern auf Part-DB zugreifen kann, ist 
eigentlich der Sinn einer Webapplikation :-)

Gruss
Urban

von Udo N. (weinbauer73)


Lesenswert?

kirk disen schrieb:
> Aufgrund der Massen an Ersatzteilen merke ich dass wir nach und nach
> Probleme bekommen. Die Funktion mit den Bildern zu den Artikeln ist
> genial allerdings wird bei Kategorien mit vielen Teilen die Auflistung
> sehr träge.

Eventuell können wir hier recht schnell eine Abhilfe schaffen, denn das 
Abschalten der Footprints bzw. eine Option für Thumbnails oder reinen 
Textlink sind ja nur kleine Änderungen. Erstes könnte man in den 
Kategorien selbst unterbringen (zusätzliche Option beim Erstellen einer 
Kategorie) und das andere wäre etwas für die Einstellungen in config.php 
(und später für die Benutzer-/Gruppenverwaltung).

> Aktuell schaue ich fast täglich in die Google codes Projektseite
> allerdings ist die Entwicklung fast ausschließlich hier im Gange.

Das Projekt ist hier ja auch entstanden und viele Interessierte haben 
diesen Thread auch abonniert. Das wir auf Google Codes das Wiki mal 
überarbeiten sollten, ist mir schon in den Sinn gekommen :-)

> Ich selbst bin leider programmiertechnisch nicht soo fit, was mich aber
> nicht abhält auch mal Codeschnipsel nach Anleitung zu ändern.
>
> Ich würde mich gerne aber als Tester bereit erklären euch zu helfen.

Ich schliess mich da Urban an. Tester kann man immer gebrauchen. Wir 
Entwickler sehen ja nur einen Teil der möglichen Probleme und Fehler.

> Was sich sehr gut bewährt hat ist die Hardware mit der ich arbeite. Die
> Datenbank und der Webserver läuft auf einer Synology DS 107. Von daher
> kann ich auf SVN´s verzichten und kann von mehreren Rechner
> unproblematisch auf die Datenbank zugreifen. Ich weiss nicht ob das von
> euch schon jemand getestet hat.

Bei mir gibt es derzeit drei Systeme, auf denen ich die Entwicklung 
mache, einer ist öffentlich zugänglich und erhält die Updates meines 
Branches, wenn ich sie für stabil halte. Ich schätze, ich bin bei ca. 
70% des Umbaus auf Templates angelangt.

> Keep the work going on!

Wir sind dabei :-)

von kirk d. (kirkdis)


Lesenswert?

also so wie ich das im überflug gelesen habe handelt es sich bei svn um 
eine version für windows die eine datenbank und einen webserver 
emuliert. gut vielleicht verwechsle ich da grad was hab den ellenlangen 
threat zu meiner entschuldigung auch nicht ganz gelesen. aber so wie 
sich jetzt herausstellt handelt es sich dabei wohl um die neuste version 
eures entwicklerteams.

synology stellt miniaturwebserver her. google mal danach sind echt feine 
geräte.

aktuell läuft bei mir die 0.2.2. würde alternativ eure mal  ebenbei 
laufen lassen oder gibts da bekannte probleme mit der datenbank wenn 
zwei scripte darauf zugreifen. will mir auf keinen fall die sql db 
zerschiessen. falls die db von 0.2.2 mit eurer neuesten svn kompatibel 
ist werd ich mich montag mal drüber machen die parallel laufen zu 
lassen.

artikel haben wir aktuell ca 2500 eingetragen. wieviele davon mit bild 
kann ich nicht genau sagen werds aber mal checken am montag und 
berichten.

nur so nebenbei aktuell verwalten wir mit eurem system 2 kardex 
hochregallager. wobei da eine wichtige funtkion gerade noch fehlt. habt 
ihr in eurer neuesten bereits etwas integriert wo ich nach lagerplatz 
sortieren kann?

gruss  kirkdis

von Gelöscht (kami89)


Lesenswert?

kirk disen schrieb:
> also so wie ich das im überflug gelesen habe handelt es sich bei svn um
> eine version für windows die eine datenbank und einen webserver
> emuliert. gut vielleicht verwechsle ich da grad was hab den ellenlangen
> threat zu meiner entschuldigung auch nicht ganz gelesen. aber so wie
> sich jetzt herausstellt handelt es sich dabei wohl um die neuste version
> eures entwicklerteams.

SVN ist ein Versionsverwaltungssystem: 
https://de.wikipedia.org/wiki/Apache_Subversion

Google Code ist z.B. so ein SVN-Server, deshalb wird unser Projekt dort 
verwaltet.

> aktuell läuft bei mir die 0.2.2. würde alternativ eure mal  ebenbei
> laufen lassen oder gibts da bekannte probleme mit der datenbank wenn
> zwei scripte darauf zugreifen. will mir auf keinen fall die sql db
> zerschiessen. falls die db von 0.2.2 mit eurer neuesten svn kompatibel
> ist werd ich mich montag mal drüber machen die parallel laufen zu
> lassen.

Bezüglich Datenbank zerschiessen würde sich sowieso ein gelegentliches 
Backup anbieten. Vorallem im professionellen Einsatz sollte man 
unbedingt regelmässige Backups der Datenbank machen.

Du kannst nicht verschiedene Versionen von Part-DB auf die gleiche 
Datenbank zugreifen lassen, da einige Updates die Datenbankstruktur 
verändern. Auch ein Downgrade ist nicht mehr einfach so ohne weiteres 
möglich.

Ich würde dir empfehlen, dass du erstmal deine komplette Datenbank 
sicherst (z.B. über phpMyAdmin oder mysqldump). Dann lädst du die neuste 
Version aus dem SVN herunter. Den Link dazu gibts hier: 
https://code.google.com/p/part-db/source/checkout und Anleitungen findet 
man über Google.

Einfach die alten Dateien mit den neuen aus dem SVN überschreiben. 
Danach kannst du die Version austesten, schauen ob alles so läuft wie es 
soll. Ich habe immer die neuste SVN-Version als Produktivsystem 
installiert und hatte noch nie wirklich Probleme.

Bei der neusten Version gibts übrigens auch gleich die Möglichkeit, 
direkt aus Part-DB heraus eine Datenbanksicherung durchzuführen.

Wenn irgendwas nicht richtig funktioniert mit der SVN-Version von 
Part-DB spielst du einfach wieder das Datenbank-Backup der Version 0.2.2 
und die alten 0.2.2er-Dateien ein, und du hast wieder genau deinen 
jetztigen Stand.

> artikel haben wir aktuell ca 2500 eingetragen. wieviele davon mit bild
> kann ich nicht genau sagen werds aber mal checken am montag und
> berichten.

Naja ich wollte eigentlich wissen, wie viele Einträge in den Kategorien 
vorhanden sind, die schon sehr lange zum Laden brauchen. Die Ladezeit 
beim Anzeigen einer Kategorie hängt vielmehr von der Anzahl der 
anzuzeigenden Teile, als von der Gesamtanzahl Teile ab. Vorallem die 
Bilder brauchen vermutlich viel Zeit, deshalb wollte ich wissen wie 
viele (ungefähr) Bilder aufgelistet werden. Also z.B. "100 Teile in 
einer Kategorie, 30 davon mit Bild, Ladezeit 10 Sekunden".

Übrigens spielt die Grösse der Bilder wahrscheinlich auch noch eine sehr 
grosse Rolle. Wenn jedes Teil ein 1MB grosses Bild hat, wird es sehr 
lange dauern z.B. 50 davon aufzulisten.

Vielleicht müssen wir da mit Thumbnauls arbeiten, damit die Ladezeiten 
sich in Grenzen halten bei Kategorien mit vielen (grossen) Bildern.

> nur so nebenbei aktuell verwalten wir mit eurem system 2 kardex
> hochregallager. wobei da eine wichtige funtkion gerade noch fehlt. habt
> ihr in eurer neuesten bereits etwas integriert wo ich nach lagerplatz
> sortieren kann?

Ist bereits in der Wunschliste, aber noch nicht eingebaut. Zur Zeit 
musst du dich halt mit der Suchfunktion begnügen, die findet ja auch 
Lagerorte.

Vielleicht hast du auch Glück und jemand baut die Funktion nächstens mal 
ein, so eine grosse Sache wär das gar nicht. Ich habe aber leider in den 
nächsten paar Wochen nicht viel Zeit zum programmieren 
(Semesterprüfungen...).

von Udo N. (weinbauer73)


Lesenswert?

Urban B. schrieb:
> Vielleicht müssen wir da mit Thumbnauls arbeiten, damit die Ladezeiten
> sich in Grenzen halten bei Kategorien mit vielen (grossen) Bildern.

Lohnt sich auf alle Fälle. So 64 oder 96 Pixel, je nach Qualität.

von Udo N. (weinbauer73)


Lesenswert?

Update auf Revision 510

- Fehlerbehandlungsklasse eingeführt (error.php: class _exception)
- HTML-Klasse mit Exceptions versehen
- HTML-Klasse nimmt Defaults für Thema, CSS und Charset aus der 
config.php, braucht nicht mehr mit angegeben zu werden (kann aber 
überschrieben werden)
- startup.php auf HTML->parse_html_template() umgestellt

PS: Die englischen Kommentare müssten noch überarbeitet werden ;-)

von Udo N. (weinbauer73)


Angehängte Dateien:

Lesenswert?

Ich habe mal die Copyright-Info überarbeitet und hoffe, es ist euch 
recht so.
1
part-db version 0.1
2
Copyright (C) 2005 Christoph Lechner
3
http://www.cl-projects.de/
4
5
part-db version 0.2+
6
Copyright (C) 2009 K. Jacobs and others (see authors.php)
7
http://code.google.com/p/part-db/
8
9
This program is free software; you can redistribute it and/or
10
modify it under the terms of the GNU General Public License
11
as published by the Free Software Foundation; either version 2
12
of the License, or (at your option) any later version.
13
14
This program is distributed in the hope that it will be useful,
15
but WITHOUT ANY WARRANTY; without even the implied warranty of
16
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
GNU General Public License for more details.
18
19
You should have received a copy of the GNU General Public License
20
along with this program; if not, write to the Free Software
21
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA

Aktuelle Änderungen (ist noch nicht im SVN, da ich obige Änderung nicht 
ohne Zustimmung übernehmen will)
1
- Lizenzinfo in die einzelnen Scripte reinkopiert bzw. aktualisiert
2
- error.php entsprechend dem Namensschema umgeschrieben
3
- Einige Variablen aus der config.php in das Array $conf verschoben
4
- html.php angepasst
5
- install.sh geändert: Lizenz und Abfrage ob diese akzeptiert wird, sowie Abfrage der Daten zur Installation der Datenbank
6
- SQL-Script an install.sh angepasst

Ich hänge mal die install.sh hier an. Bitte testet die mal bei euch aus 
(läuft unter Bash) und gebt mir Rückmeldung, ob sie sauber funktioniert. 
Ich möchte nämlich die INSTALL.txt bzw. auch das Thema im Wiki 
überarbeiten.

von Udo N. (weinbauer73)


Lesenswert?

Zu Issue #3 (http://code.google.com/p/part-db/issues/detail?id=3):

config_db.php:
1
$db['backup_path'] = BASE.'/backup/%Y%/%M%/';
config_page.php:
1
$db['backup_path'] = str_replace('%Y%',date('Y'),$db['backup_path']); // Year
2
$db['backup_path'] = str_replace('%M%',date('m'),$db['backup_path']); // Month
3
$db['backup_path'] = str_replace('%W%',date('w'),$db['backup_path']); // Day of week
4
$db['backup_path'] = str_replace('%WY%',date('W'),$db['backup_path']); // Week of year
5
if ( !is_dir($db['backup_path']) ) mkdir($db['backup_path'],0775,true);
6
$backup_path = isset($db['backup_path']) ? $db['backup_path'] : "backup/";

list_backup_files() liest dazu aus $db['backup_path'] rekursiv und gibt 
alles als Array zurück. Download und Löschen muss ich noch anpassen.

von Udo N. (weinbauer73)


Lesenswert?

Udo Neist schrieb:
> list_backup_files() liest dazu aus $db['backup_path'] rekursiv und gibt
> alles als Array zurück. Download und Löschen muss ich noch anpassen.

list_backup_files() gibt jetzt den Pfad unterhalb der Installation 
zurück. Download und Löschen ergänzen dann noch zu einem absoluten Pfad, 
um darauf zurückgreifen zu können. Beim Download wird nur der Dateiname 
genutzt.

von Gelöscht (kami89)


Lesenswert?

@Udo Neist

Du gibst ja richtig Gas beim programmieren :-D

Also wenn du mich fragst, ich finde das neue Copyright gut, da man sieht 
dass das ursprüngliche Projekt von uns "weitergeführt wurde. Aber K.J. 
ist hier der Chef :-) Scheint aber momentan irgendwie nicht sehr aktiv 
zu sein, oder ist er vielleicht in den Ferien?

Übrigens, hast du das "Problem" mit dem Datenbankupdate fürs neue 
Preissystem mal angeschaut?
Wenn es nicht einfach so direkt per SQL-Anweisung möglich ist, dann 
müssten wir halt dafür etwas PHP Code schreiben, der dann das Update 
durchführt. Aber so mächtig wie SQL ist, wirds bestimmt auch ohne PHP 
möglich sein :-)

Ich habe mal wieder meinen Branch aktualisiert. Auch das Klassendiagramm 
wurde aktualisiert 
(https://part-db.googlecode.com/svn/branches/kami89/documentation/UML/class_diagram.pdf). 
Ich habe mal angefangen die Benutzerverwaltung einzubauen. Ich stelle 
mir das so vor, dass man bei jedem Objekt, das man anlegt, eine Referenz 
auf den aktuell angemeldeten Benutzer übergibt. Die Berücksichtigung der 
Rechte würde dann direkt innerhalb der einzelnen Klassen stattfinden.

Zuerst dachte ich es wäre besser wenn die Überprüfung auf die 
notwendigen Rechte ausserhalb der Klassen passieren würde. So könnte man 
auch besser auf fehlende Rechte reagieren und entsprechend eine 
Fehlermeldung ausgeben. Allerdings bin ich mir noch nicht sicher ob 
früher oder später einzelne Klassenmethoden doch noch eine Information 
über die vorhandenen Rechte brauchen werden. Und ausserdem wird so die 
Überprüfung der Rechte nur an einer zentralen Stelle durchgeführt und 
muss nicht für jede Seite extra programmiert werden.

Um trotzdem gescheite Fehlermeldungen ausgeben zu können, habe ich bei 
den Klassen eine Funktion "get_last_error()" eingebaut. Versucht ein 
Benutzer z.B. den Namen eines Bauteils abzuändern, kann man einfach 
"set_name()" ganz normal aufrugen, und direkt nach diesem Aufruf halt 
noch per "get_last_error()" überprüfen ob ein Fehler aufgetreten ist. 
Falls ein String zurückkommt, wird direkt dieser String als 
Fehlermeldung ausgegeben.

Irgendwann müssen wir ja unsere zwei Branches ja noch miteinander 
verschmelzen. Momentan sind meine Klassen aber noch nicht wirklich 
fertig, eigentlich möchte ich sie zuerst möglichst fertig kriegen bevor 
wir die Branches zusammenschnüren. Nur wird es voraussichtlich noch ca. 
5 Wochen dauern bis es soweit ist, weil ich eben momentan zu wenig Zeit 
zum programmieren habe. Ist das für dich ein Problem, oder hast du in 
dieser Zeit selber noch genug zu tun mit den Templates?
Was sicher nicht schaden würde, ist wenn du mein Klassendiagramm einfach 
ein bisschen studierst, damit du ungefähr weisst wie das ganze aufgebaut 
ist. Nicht dass es später noch böse Überraschungen gibt beim 
Verschmelzen unserer Branches.

von Udo N. (weinbauer73)


Lesenswert?

Urban B. schrieb:
> @Udo Neist
>
> Du gibst ja richtig Gas beim programmieren :-D

Ich hab an diesem WE nichts vor, bis jetzt jedenfalls ;-)

> Also wenn du mich fragst, ich finde das neue Copyright gut, da man sieht
> dass das ursprüngliche Projekt von uns "weitergeführt wurde. Aber K.J.
> ist hier der Chef :-) Scheint aber momentan irgendwie nicht sehr aktiv
> zu sein, oder ist er vielleicht in den Ferien?

Ich warte ab. Er muss ja zustimmen.

> Übrigens, hast du das "Problem" mit dem Datenbankupdate fürs neue
> Preissystem mal angeschaut?

Nein, ich habe mich heute Abend an ein Online-Update der Datenbank 
versucht. Bisher läuft es mit lokalen Daten. Hier fehlt noch der 
Download des entsprechenden Archivs.

Kurzfassung zum Prinzip: Es wird die Datenbankversion ausgelesen, auf 
dem Server nach einem Update-Archiv für diese Version geschaut, geladen 
und installiert. Das Archiv beinhaltet eine PHP-Datei mit einem Array 
für einen Gültigkeitscheck und eine Datei mit den SQL-Befehlen. 
Möglichst eine Zeile pro SQL-Befehl, wird anhand des Semikolons 
getrennt. Eventuell müsste ich da noch ein alternatives Trennzeichen 
einführen, falls irgendwo bei den Daten selbst ein Semikolon vorhanden 
ist.

> Wenn es nicht einfach so direkt per SQL-Anweisung möglich ist, dann
> müssten wir halt dafür etwas PHP Code schreiben, der dann das Update
> durchführt. Aber so mächtig wie SQL ist, wirds bestimmt auch ohne PHP
> möglich sein :-)

Ich will mir das auf alle Fälle noch anschauen, bevor ich mich dazu 
äußere. Also einfach noch ein bisschen liegen lassen ;-)

> Zuerst dachte ich es wäre besser wenn die Überprüfung auf die
> notwendigen Rechte ausserhalb der Klassen passieren würde. So könnte man
> auch besser auf fehlende Rechte reagieren und entsprechend eine
> Fehlermeldung ausgeben. Allerdings bin ich mir noch nicht sicher ob
> früher oder später einzelne Klassenmethoden doch noch eine Information
> über die vorhandenen Rechte brauchen werden. Und ausserdem wird so die
> Überprüfung der Rechte nur an einer zentralen Stelle durchgeführt und
> muss nicht für jede Seite extra programmiert werden.

Es gibt bestimmt Notwendigkeiten in den verschiedenen Klassen, auch mal 
die Benutzerrechte zu testen. Ich lasse schon im eigentlichen Script 
prüfen, ob jemand überhaupt berechtigt ist, diese Funktion zu nutzen. 
Die Klassenfunktionen brauchen hier dann nur noch das tun, für das sie 
gedacht sind.

> Um trotzdem gescheite Fehlermeldungen ausgeben zu können, habe ich bei
> den Klassen eine Funktion "get_last_error()" eingebaut.

Gute Idee. Im Prinzip mache ich das ähnlich. Entweder gibt es einen 
Zahlencode für verschiedene Fehler und man kann den dann als Klartext 
zurückbekommen oder, wenn es extrem wichtige Funktionen sind, es gibt 
eine Exception und die Ausführung wird abgebrochen.

> Irgendwann müssen wir ja unsere zwei Branches ja noch miteinander
> verschmelzen. Momentan sind meine Klassen aber noch nicht wirklich
> fertig, eigentlich möchte ich sie zuerst möglichst fertig kriegen bevor
> wir die Branches zusammenschnüren. Nur wird es voraussichtlich noch ca.
> 5 Wochen dauern bis es soweit ist, weil ich eben momentan zu wenig Zeit
> zum programmieren habe. Ist das für dich ein Problem, oder hast du in
> dieser Zeit selber noch genug zu tun mit den Templates?

Meine Idee war es, erstmal beide Konzepte soweit zu entwickeln, dass sie 
nutzbar sind. Die fehlenden Templates sind in vielleicht zwei Wochen 
erstellt, wenn ich nicht wieder irgendeine Idee zu einem Issue hab ;-)

> Was sicher nicht schaden würde, ist wenn du mein Klassendiagramm einfach
> ein bisschen studierst, damit du ungefähr weisst wie das ganze aufgebaut
> ist. Nicht dass es später noch böse Überraschungen gibt beim
> Verschmelzen unserer Branches.

Da sehe ich weniger ein Problem. Ich würde einfach Klasse für Klasse in 
meinen Branch integrieren. Wenn du die Klassen so geschrieben hast, das 
die Funktionen der lib.php praktisch identisch in einer Klasse 
existieren, so macht der Umstieg kaum Ärger. Ich integriere die 
Templates auch erstmal so, das nur der HTML-Teil vom Rest getrennt wird. 
Ist das Template funktionstüchtig, nehme ich mir i.d.R. auch die 
dortigen Routinen vor. Gibt so manches, was man sinnvoller umsetzen 
kann.

von Udo N. (weinbauer73)


Angehängte Dateien:

Lesenswert?

Ich sehe in deinem Klassendiagramm, das du Objekte einsetzt. Ich muss 
gestehen, ich hab mit Objekten bei PHP noch nicht gearbeitet.

Meine Klassendefinition habe ich mal als Text-Datei erstellt. Sie 
umfasst meine eigenen drei Klassen html.php, error.php und pack.php.

EDIT: Korrigierte Klassendefinition (zweite Datei laden)

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
> Wenn du die Klassen so geschrieben hast, das
> die Funktionen der lib.php praktisch identisch in einer Klasse
> existieren, so macht der Umstieg kaum Ärger.

Naja praktisch identisch ist es sicher nicht ;-) Die neuen Funktionen 
sind natürlich voll auf OOP ausgelegt, geben also z.B. keine Arrays von 
SQL-Querys mehr zurück, sondern Objekte.

Udo Neist schrieb:
> Ich sehe in deinem Klassendiagramm, das du Objekte einsetzt. Ich muss
> gestehen, ich hab mit Objekten bei PHP noch nicht gearbeitet.

Das verstehe ich jetzt nicht^^ Arbeitet man mit Klassen, so arbeitet man 
doch automatisch auch mit Objekten ;-) Ansonsten machen die Klassen bzw. 
OOP nicht viel Sinn...

von Udo N. (weinbauer73)


Lesenswert?

Ich hab nicht gesagt, ich hätte noch nicht mit Objekten zu tun gehabt. 
Nur unter PHP halt noch nicht, deswegen kenne ich die Zugriffe darauf 
noch nicht. Klassen sind der Weg zu Objekten, aber nach meinem 
Wissensstand haben Objekte auch noch Eigenschaften. Bisher habe ich 
Klassen nur Variablen zur Verarbeitung übergeben und vielleicht hier und 
da einen Ansatz zu Objekten drin gehabt.

Ob jetzt eine Funktion aus der lib.php ein String, Integer oder Bool 
zurück gibt oder eine Klasse ein Objekt, das die gleichen Infos liefert, 
macht keinen Unterschied. Es ist nur ein anderer Zugriff auf die Daten. 
Wir werden sehen, wie man beide Branches zusammenbringen werden. Ich bin 
zuversichtlich, dass es uns gelingen wird.

von Udo N. (weinbauer73)


Lesenswert?

Ich habe gerade die partsinfo.php auf Templates umgestellt. Dabei ist 
mir aufgefallen, das die Auflistung eine Schleife enthält, die aber wohl 
nur einen Datensatz durchläuft.
1
$result = parts_select( $_REQUEST["pid"]);
2
while ( $data = mysql_fetch_assoc( $result))
3
{
4
...
5
}

Wenn ich das System richtig verstehe, kann PID nur einen Wert annehmen, 
da parts_select() nur ein Ergebnis zurückliefert. Die Schleife wird also 
nur einmal durchlaufen. Somit ist sie überflüssig. Liege ich da richtig 
in meiner Annahme?

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
> Ich hab nicht gesagt, ich hätte noch nicht mit Objekten zu tun gehabt.
> Nur unter PHP halt noch nicht, deswegen kenne ich die Zugriffe darauf
> noch nicht. Klassen sind der Weg zu Objekten, aber nach meinem
> Wissensstand haben Objekte auch noch Eigenschaften. Bisher habe ich
> Klassen nur Variablen zur Verarbeitung übergeben und vielleicht hier und
> da einen Ansatz zu Objekten drin gehabt.

Ach so, okay :-)
Naja schwierig ist es nicht, einfach wie bei anderen Sprachen mit dem 
"new" Operator neue Objekte anlegen usw. Ich selber habe ja bis vor 
kurzem nichtmal PHP programmiert, und jetzt habe ich 22 Klassen erstellt 
in PHP (und das was ich bisher getestet habe, funktioniert auch :-)
Eigentlich ist ja vieles sehr änlich wie in C++, vorallem der 
objektorientierte Teil. Und wenn man sich mal etwas nicht sicher ist, 
findet man im Internet für fast alles eine Erklärung.

Udo Neist schrieb:
> Wenn ich das System richtig verstehe, kann PID nur einen Wert annehmen,
> da parts_select() nur ein Ergebnis zurückliefert. Die Schleife wird also
> nur einmal durchlaufen. Somit ist sie überflüssig. Liege ich da richtig
> in meiner Annahme?

Würde ich jetzt auch meinen, ja. Es darf ja keine zwei Teile mit der 
gleichen ID geben.

Übrigens kommt mir noch in den Sinn, dass ich mal daran dachte die 
device.php zu löschen, und deren Aufgabe auch in die deviceinfo.php 
einzubauen. Dann bräuchte das JavaScript-Menü der Baugruppen nicht mehr 
zwei unterschiedliche Links (device.php oder deviceinfo.php). Das 
JavaScript-Menü wird bei mir nun ja in der Klasse "StructuralDBElement" 
erzeugt, und ist somit für Footprints, Kategorien, Baugruppen usw. 
verwendbar, aber das System muss natürlich einheitlich sein. Da sind 
solche "Extrawürste" wie zwei unterschiedliche URLs nicht erwünscht.

Vielleicht könntest du das ja noch bei Gelegenheit einbauen? Übrigens 
würde ich dann vielleicht die deviceinfo.php auch gleich showdevices.php 
nennen, das ist aussagekräftiger und wird ja bereits bei der 
showparts.php verwendet.

von Udo N. (weinbauer73)


Lesenswert?

Urban B. schrieb:
> Ach so, okay :-)
> Naja schwierig ist es nicht, einfach wie bei anderen Sprachen mit dem
> "new" Operator neue Objekte anlegen usw. Ich selber habe ja bis vor
> kurzem nichtmal PHP programmiert, und jetzt habe ich 22 Klassen erstellt
> in PHP (und das was ich bisher getestet habe, funktioniert auch :-)
> Eigentlich ist ja vieles sehr änlich wie in C++, vorallem der
> objektorientierte Teil. Und wenn man sich mal etwas nicht sicher ist,
> findet man im Internet für fast alles eine Erklärung.

Ich hab mir die PHP-Interpretation angeschaut. Im Prinzip hab ich das ja 
schon in den Klassen drin. Nur noch nie so betrachtet :-)

C++ hab ich mal angefangen, aber bin nicht weit gekommen. Ich hab 
irgendwo die C++-Bibel, nur finde ich die gerade nicht. Hab mir die 
ganzen Sachen selbst beigebracht :-)

> Würde ich jetzt auch meinen, ja. Es darf ja keine zwei Teile mit der
> gleichen ID geben.

Ich nehme das mal raus. Überflüssiges müssen wir nicht mitschleppen.

> Übrigens kommt mir noch in den Sinn, dass ich mal daran dachte die
> device.php zu löschen, und deren Aufgabe auch in die deviceinfo.php
> einzubauen. Dann bräuchte das JavaScript-Menü der Baugruppen nicht mehr
> zwei unterschiedliche Links (device.php oder deviceinfo.php). Das
> JavaScript-Menü wird bei mir nun ja in der Klasse "StructuralDBElement"
> erzeugt, und ist somit für Footprints, Kategorien, Baugruppen usw.
> verwendbar, aber das System muss natürlich einheitlich sein. Da sind
> solche "Extrawürste" wie zwei unterschiedliche URLs nicht erwünscht.
>
> Vielleicht könntest du das ja noch bei Gelegenheit einbauen? Übrigens
> würde ich dann vielleicht die deviceinfo.php auch gleich showdevices.php
> nennen, das ist aussagekräftiger und wird ja bereits bei der
> showparts.php verwendet.

Ich bin auch dafür, möglichst viel zu vereinheitlichen. Wenn es sinnvoll 
ist, warum auch nicht. Ich werde beides mal umsetzen :-)

So... deviceinfo.php ist erstmal ein Wrapper für showdevices.php. Sobald 
ich das auf vlibTemplate umgeschrieben habe, werde ich mir device.php 
schnappen und integrieren.

von Udo N. (weinbauer73)


Lesenswert?

Die deviceinfo.php ist in showdevices.php umbenannt und schätzungsweise 
zu 50% auf vlibTemplate umgestellt.

Anmerkungen:

1) Mir ist aufgefallen, dass manche Beschreibungen bzw. Überschriften 
der Funktionsblöcke auf der Webseite zu Verwirrungen führen können. Auf 
Anhieb hätte ich nicht gewußt, dass "Benötigte Teile abfassen" die 
Entnahme eines oder mehrerer kompletten Bausatzes/Bausätze bedeutet. Es 
wäre hilfreich, wenn man die Hilfe auch in Form von Tooltips anbieten 
würden. Man könnte am rechten Rand der Überschrift ein kleines 
Fragezeichen einbauen, welches dann den Tooltip präsentiert.

2) Warum bei "Zugeordnete Bauteilen" rechts das Kästchen für "Entfernen" 
markieren und dann über den Button "Löschen" löschen? Das könnte man 
doch in die Funktion hinter "Übernehmen" integrieren. Schließlich will 
man ja das als Änderung übernehmen. Etwas unlogisch nach meiner Meinung.

3) Die Javscript-Funktion validatePosIntNumber() erlaubt keine Änderung 
per "Backspace", "Ins", "Del" oder den Cursortasten. Mein Vorschlag:
1
function validatePosIntNumber(evt)
2
{
3
   var theEvent = evt || window.event;
4
   var key = theEvent.keyCode || theEvent.which;
5
   if (key==8 || key==45 || key==46 || key==37 || key==39 ) return key;
6
   key = String.fromCharCode( key );
7
   var regex = /[0-9]/;
8
   if( !regex.test(key) ) {
9
      theEvent.returnValue = false;
10
      if(theEvent.preventDefault) theEvent.preventDefault();
11
   }
12
}

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
>> Vielleicht könntest du das ja noch bei Gelegenheit einbauen? Übrigens
>> würde ich dann vielleicht die deviceinfo.php auch gleich showdevices.php
>> nennen, das ist aussagekräftiger und wird ja bereits bei der
>> showparts.php verwendet.
>
> Ich bin auch dafür, möglichst viel zu vereinheitlichen. Wenn es sinnvoll
> ist, warum auch nicht. Ich werde beides mal umsetzen :-)

Wunderbar, danke :-)

Udo Neist schrieb:
> 1) Mir ist aufgefallen, dass manche Beschreibungen bzw. Überschriften
> der Funktionsblöcke auf der Webseite zu Verwirrungen führen können. Auf
> Anhieb hätte ich nicht gewußt, dass "Benötigte Teile abfassen" die
> Entnahme eines oder mehrerer kompletten Bausatzes/Bausätze bedeutet. Es
> wäre hilfreich, wenn man die Hilfe auch in Form von Tooltips anbieten
> würden. Man könnte am rechten Rand der Überschrift ein kleines
> Fragezeichen einbauen, welches dann den Tooltip präsentiert.

Klingt gut. Wenn es aber mal noch eine richtige Dokumentation geben 
wird, würde ein Link auf die entsprechende Stelle in der Doku ja auch 
genügen.

Udo Neist schrieb:
> 2) Warum bei "Zugeordnete Bauteilen" rechts das Kästchen für "Entfernen"
> markieren und dann über den Button "Löschen" löschen? Das könnte man
> doch in die Funktion hinter "Übernehmen" integrieren. Schließlich will
> man ja das als Änderung übernehmen. Etwas unlogisch nach meiner Meinung.

Jup, das finde ich auch. Ausserdem verbraucht die "Löschen"-Spalte 
extrem viel Platz, obwohl nur kleine Kästchen drin stehen. Vielleicht 
könnte man auch da noch etwas verbessern, also den Platz besser 
ausnutzen.

Udo Neist schrieb:
> 3) Die Javscript-Funktion validatePosIntNumber() erlaubt keine Änderung
> per "Backspace", "Ins", "Del" oder den Cursortasten. Mein Vorschlag:

Jo, wenns funktioniert --> einbauen :-)

von M. K. (avr-frickler) Benutzerseite


Lesenswert?

Ich habe vor 2 Wochen zu Testzwecken auch mal die Datenbank (Version 
0.2.2) in der Firma/Abteilung) installiert.

Wir sind eine 7 Mann große Entwicklungsabteilung und haben unser 
Bauteilellager bisher mit Excel 'gepflegt'. Ich habe dann mal so vor 2 
Wochen den Vorschlag gemacht sich diese Datenbank mal anzusehen.
Was ich bisher so von den Kollegen gehört habe klang sehr positiv.

Bevor ich jetzt aber unsere Excel-Tabelle in die Datenbank überführe 
würde mich interessieren, wann ihr meint in etwa mit dem Zusammenführen 
eurer Branches fertig zu sein. Wenn das jetzt nur so 2-3 Wochen dauert, 
würde ich noch warten ;-)

Wenn ich das richtig verstanden habe ist es in der neuen Version dann 
möglich einem Bauteil mehreren Lieferanten zuzuordnen?
Macht es vielleicht auch Sinn einem Bauteil mehrere Hersteller zuordnen 
zu können?

Dann ist uns aufgefallen das beim anlegen von Bauteilen ein zweites 
Fenster aufpoppt wenn man neue Footprints/Lagerorte anlegt, kann man 
nicht da zum bereits offenem Dialog wieder zurückkehren?

Eine Suche nach Preis oder die Splate Preis bei den Suchergebnissen 
währe sicher sehr hilfreich.

Wenn ihr noch jemandem zum Test braucht, kann ich euch da auch gerne 
weiterhelfen. Ich habe die Datenbank in einer XEN-Domu am laufen und 
kann die schnell klonen und so auch Tests mit einer umfangreichen 
Datenbank machen.
Mit PHP und MySQL kenn ich mich auch etwas aus, kleinere Aufgaben kann 
ich auch gerne übernehmen.

von Gelöscht (kami89)


Lesenswert?

M. K. schrieb:
> Ich habe vor 2 Wochen zu Testzwecken auch mal die Datenbank (Version
> 0.2.2) in der Firma/Abteilung) installiert.
>
> Wir sind eine 7 Mann große Entwicklungsabteilung und haben unser
> Bauteilellager bisher mit Excel 'gepflegt'. Ich habe dann mal so vor 2
> Wochen den Vorschlag gemacht sich diese Datenbank mal anzusehen.
> Was ich bisher so von den Kollegen gehört habe klang sehr positiv.

Das freut uns natürlich :-)

M. K. schrieb:
> Bevor ich jetzt aber unsere Excel-Tabelle in die Datenbank überführe
> würde mich interessieren, wann ihr meint in etwa mit dem Zusammenführen
> eurer Branches fertig zu sein. Wenn das jetzt nur so 2-3 Wochen dauert,
> würde ich noch warten ;-)

Also ich von meiner Seite würde sagen, dass ich in ca. 5 Wochen die 
Klassen einigermassen fertig habe. Ab dann wird es aber sicher nochmal 1 
bis 2 Wochen dauern bis die beiden Branches zusammengeführt und 
lauffähig sind. Bis dann ein neues Downloadarchiv rauskommt (also eine 
als "stabil" bezeichnete Version) wird es dann aber nochmal ein weilchen 
dauern, die neue Version muss ja erst noch gründlich getestet und Fehler 
ausgemerzt werden.

Aber warten musst du ja eigentlich nicht, du kannst auch die Version 
0.2.2 oder die aktuelle SVN Version benutzen bis die "brandneue" Version 
rauskommt. Danach kannst du einfach deine Version aktualisieren, das ist 
kein Problem, die Datenbankstruktur wird automatisch angepasst. Part-DB 
ist so gebaut, dass man problemlos immer auf die neuste Version 
aktualisieren kann.

M. K. schrieb:
> Wenn ich das richtig verstanden habe ist es in der neuen Version dann
> möglich einem Bauteil mehreren Lieferanten zuzuordnen?

Jup, genau. Und auch den Bezug der Preise auf eine bestimmte 
Bestellmenge wird dann vermutlich möglich sein.

> Macht es vielleicht auch Sinn einem Bauteil mehrere Hersteller zuordnen
> zu können?

Hmm...Also ich würde da jetzt nicht direkt einen Sinn erkennen. Ich 
würde ähnliche Bauteile (genau gleich werden sie ja kaum sein), die von 
anderen Herstellern stammen, als separate Bauteile abspeichern. Dieses 
hat dann ja auch wieder andere Bestellnummern, andere Lieferanten, 
andere Preise. Gemeinsamkeiten unter den verschiedenen Teilen gibt es 
dann ja kaum noch (softwaretechnisch betrachtet, nicht die Bauteile an 
sich verglichen).

Wenn du aber einen guten Grund hast, warum diese Funktion Sinn machen 
würde, dann immer her damit :-)

M. K. schrieb:
> Dann ist uns aufgefallen das beim anlegen von Bauteilen ein zweites
> Fenster aufpoppt wenn man neue Footprints/Lagerorte anlegt, kann man
> nicht da zum bereits offenem Dialog wieder zurückkehren?

Entweder habe ich dich falsch verstanden, oder dieses Verhalten ist in 
der aktuellen SVN-Version nicht mehr so vorhanden. Ich habe leider grad 
keine 0.2.2er Version installiert, kann es also grad nicht testen.

Wenn die Online-Demo funktionieren würde, könntest du es dort rasch 
probieren. Aber irgendwie scheint der ganze Server momentan ein Problem 
zu haben, sogar auf der normalen Seite von K.J. kommen MySQL Fehler. Ich 
schreib ihm mal eine PN...

M. K. schrieb:
> Eine Suche nach Preis oder die Splate Preis bei den Suchergebnissen
> währe sicher sehr hilfreich.

Es ist geplant, dass die Tabellen(spalten) individuell anpassbar werden 
sollen. Allerdings wird das noch eine ganze Weile dauern, da wir zuerst 
die Benutzerverwaltung brauchen. Wenn es dringend ist, müsstest du es 
halt selber einbauen, oder nochmal hier nachfragen ob es jemand von uns 
machen kann (also nur für dich, nicht allgemein). Sollte keine grosse 
Sache sein.

M. K. schrieb:
> Wenn ihr noch jemandem zum Test braucht, kann ich euch da auch gerne
> weiterhelfen.

Wie ich schon weiter oben einmal geschrieben habe: Tester kann man immer 
brauchen :-) Alles was wir uns von euch wünschen, ist Feedback :-)
Speziell wenn Part-DB beruflich eingesetzt wird, sind die 
Anforderungen/Erwartungen an die Software ja anders als bei privater 
Nutzung. Da Part-DB vermutlich (noch?) nicht stark im beruflichen Umfeld 
genutzt wird, sind die Feedbacks von solchen Benutzern speziell wichtig.

Gruss
Urban

von kirk d. (kirkdis)


Lesenswert?

Urban B. schrieb:
> Ich würde dir empfehlen, dass du erstmal deine komplette Datenbank
> sicherst (z.B. über phpMyAdmin oder mysqldump). Dann lädst du die neuste
> Version aus dem SVN herunter. Den Link dazu gibts hier:
> https://code.google.com/p/part-db/source/checkout und Anleitungen findet
> man über Google.
>
> Einfach die alten Dateien mit den neuen aus dem SVN überschreiben.
> Danach kannst du die Version austesten, schauen ob alles so läuft wie es
> soll. Ich habe immer die neuste SVN-Version als Produktivsystem
> installiert und hatte noch nie wirklich Probleme.

Steig da grad bei der Struktur auf Google code nicht ganz durch.

Muss ich da die einzelnen Branches einfach nachinstallieren, oder gibts 
da irgendwo ein komplettarchiv dass ich dann einfach komplett einspiele? 
Wollte da grad mal loslegen aber da habperts schon weil ich bei google 
code nur einzelne files runterladen kann, vielleicht hab ich da auch nur 
was übersehen?!?

von Gelöscht (kami89)


Lesenswert?

kirk disen schrieb:
> Muss ich da die einzelnen Branches einfach nachinstallieren, oder gibts
> da irgendwo ein komplettarchiv dass ich dann einfach komplett einspiele?
> Wollte da grad mal loslegen aber da habperts schon weil ich bei google
> code nur einzelne files runterladen kann, vielleicht hab ich da auch nur
> was übersehen?!?

Du brauchst einen SVN Client (ein Programm) um das komplette Projekt 
herunterladen zu können.
Für Windows gibts dieses hier: http://tortoisesvn.net/
Für Linux muss das Paket "subversion" installiert sein.
Mit diesem Programm können dann die Dateien heruntergeladen werden. Du 
musst das Programm einfach mit diesem Link füttern:
1
http://part-db.googlecode.com/svn/trunk/

Wie TortoiseSVN genau funktioniert weiss ich nicht, da ich Linux 
verwende. Aber es sollte genügend Anleitungen dazu geben im Internet.

von Udo N. (weinbauer73)


Lesenswert?

Die Verzeichnisse "uneist" und "kami89" unterhalb von 
http://part-db.googlecode.com/svn/branches/ sind aktuell in Entwicklung 
und sollen nach der Zusammenführung die neue Version von Part-DB werden. 
Ich schätze, es dürfte Weihnachten werden, bis wir soweit sind. Das 
Update wird auf alle Fälle so unkompliziert wie möglich gemacht. Wir 
sind dabei, einen Update-Mechanismus dafür zu entwickeln :-)

von kirk d. (kirkdis)


Lesenswert?

Danke erstmal mti dem Tipp zum Tortoise SVN. Aber warum so kompliziert? 
wäre es denn nicht sinnvoll einfach ein aktuelles Package mit den ganzen 
Files online zu stellen? Bin ansich kein Freund von Client Programmen 
weshalb ich auch so erfreut über eure offene Part-DB bin. Einziger 
Vorteil den ich aktuell sehe durch das SVN ist dass Traffic gespart wird 
falls neue Versionen rauskommen wobei das bei der aktuellen Nutzerzahl 
wohl eher unwichtig ist. Das soll ja die neue Version von Part-DB 
selbstständig managen können so wie ich das aktuell lese. Erklär mir 
jetzt bitte noch wie man dem "umständlichen" SVN das verklickert die 
Files in nem Ordner zu laden. hab das grad beim 3. versuch immernoch 
nicht hinbekommen...

von Gelöscht (kami89)


Lesenswert?

kirk disen schrieb:
> Aber warum so kompliziert?
> wäre es denn nicht sinnvoll einfach ein aktuelles Package mit den ganzen
> Files online zu stellen?

Das SVN ist eigentlich nur für die Entwickler gedacht, nicht für die 
"Endkunden". Mit dem SVN können wir nämlich sehr bequem und schnell 
Änderungen in Google Code hochladen, Branches erstellen, Branches 
verschmelzen, Versionen verwalten, Änderungen nachvollziehen usw. Es 
gibt eine Menge Vorteile für uns Entwickler. Gerade auch wenn eben 
mehrere Personen am gleichen Projekt arbeiten. Und natürlich kann man 
eben seine eigene, lokal installierte Testversion ganz einfach immer 
aktuell halten.

Der "Nachteil" ist aber, dass die (aktuellste) SVN-Version nicht immer 
stabil läuft, noch Fehler enthält usw. weil eben mehrere Leute dran 
"rumfummeln" und sich auch mal gegenseitig in die Quere kommen können. 
Ist also wirklich nicht für die Endkunden gedacht, das würde nur Ärger 
geben.

Zwischendurch, wenn wir der Ansicht sind dass die aktuelle SVN-Version 
stabil und fehlerfrei läuft, stricken wir ein Archiv zusammen, das dann 
in Google Code unter "Downloads" erscheint. Das ist dann die offizielle 
stable-Version die für die Endkunden bestimmt ist.

Da aber unser Projekt noch einigermassen überschaubar ist (verglichen 
mit anderen SVN Projekten), nicht zu viele Leute dran rumschrauben und 
die aktuelle SVN-Version gar nicht schlecht läuft, "darf" man momentan 
auch die SVN-Version benutzen wenns sein muss.

kirk disen schrieb:
> Das soll ja die neue Version von Part-DB
> selbstständig managen können so wie ich das aktuell lese.

Genau. Das würde das Updaten dann sehr bequem machen.

kirk disen schrieb:
> Erklär mir
> jetzt bitte noch wie man dem "umständlichen" SVN das verklickert die
> Files in nem Ordner zu laden.

Was willst du genau machen? Die Dateien aus dem SVN herunterladen? Wie 
gesagt, bei TortoiseSVN kenne ich mich überhaupt nicht aus.
Bei Linux geht es sehr bequem mit einem einzigen Terminalbefehl:
1
svn checkout http://part-db.googlecode.com/svn/trunk/ part-db
Dieser Befehl lädt das ganze Projekt nach /home/'user'/part-db/
Das Paket "subversion" muss dazu installiert sein.

von M. K. (avr-frickler) Benutzerseite


Angehängte Dateien:

Lesenswert?

Udo Neist schrieb:
> Das
> Update wird auf alle Fälle so unkompliziert wie möglich gemacht. Wir
> sind dabei, einen Update-Mechanismus dafür zu entwickeln :-)

Das hört sich sehr gut an. Dann werde ich erst einmal bei Version 0.2.2 
bleiben und mich dann auf die nächste Version freuen ;-)

Urban B. schrieb:
> M. K. schrieb:
>> Dann ist uns aufgefallen das beim anlegen von Bauteilen ein zweites
>> Fenster aufpoppt wenn man neue Footprints/Lagerorte anlegt, kann man
>> nicht da zum bereits offenem Dialog wieder zurückkehren?
>
> Entweder habe ich dich falsch verstanden, oder dieses Verhalten ist in
> der aktuellen SVN-Version nicht mehr so vorhanden. Ich habe leider grad
> keine 0.2.2er Version installiert, kann es also grad nicht testen.

Ich habe mal ein Bild angehangen, wenn man auf die rot eingekreisten 
Buttons klickt öffnet sich ein neues Popup mit der selben Maske wo dann 
nur die DropDown-Listen aktualisiert sind.
Es scheint nur den Internet Explorer (IE 8.0) zu betreffen der Firefox 
12 macht dies nicht.

Ein paar Fragen zu dem CSV-Import:
Im Beispiel wird vor den Daten eine Zeile mit den Spaltennamen 
angegeben, sind in dem Beispiel alle Spalten aufgeführt die es gibt und 
das # am Anfang muss auch sein?
Hier nochmal das Beispiel von der Seite:
1
# Kategorie; Name; Beschreibung; Anzahl; Footprint; Lagerort; Lieferant; Bestellnummer; Kommentar

Wenn ich die Vorschaubilder(Footprints) benutzen möchte muss ich bei 
Footprint exakt den Namen des Vorschaubildes angeben?

Die Lagerorte haben bei uns Unterkategorien, wie kann ich die in der 
CSV-Datei angeben? z.B. Schubladenkästen -> S-0123
Das gleiche bei den Bauteilkategorien.

von Gelöscht (kami89)


Lesenswert?

M. K. schrieb:
> Ich habe mal ein Bild angehangen, wenn man auf die rot eingekreisten
> Buttons klickt öffnet sich ein neues Popup mit der selben Maske wo dann
> nur die DropDown-Listen aktualisiert sind.
> Es scheint nur den Internet Explorer (IE 8.0) zu betreffen der Firefox
> 12 macht dies nicht.

Ah ja, stimmt, beim IE läuft da was falsch :-)
Ich habe den Fehler auch schon gefunden und lade ihn gleich noch ins SVN 
hoch. Wer nicht auf die SVN-Version aktualisieren will, kann die 
Änderungen auch selber durchführen.

Dazu einfach die folgenden Dateien herunterladen und die alten Dateien 
damit überschreiben:

https://part-db.googlecode.com/svn-history/r512/trunk/editpartinfo.php
https://part-db.googlecode.com/svn-history/r512/trunk/newpart.php

Dann muss man in der newpart.php die Zeile 145
1
$p_footprint = footprint_add( $NewFootprint, '');
ersetzen durch diese Zeile:
1
$p_footprint = footprint_add( $NewFootprint);

Und ausserdem muss in der alten partinfo.php eine neue Zeile (Nr. 54) 
eingefügt werden:
1
49:<head>
2
50:    <title>Detailinfo</title>
3
51:    <?php print_http_charset(); ?>
4
52:    <link rel="StyleSheet" hr*nospam*ef="css/partdb.css" type="text/css">
5
53:    <script type="text/javascript" src="popup.php"></script>
6
54:    <base target="_self" /> <!-- Diese Zeile ist neu -->
7
55:</head>

@Udo
Kannst du diese Änderungen auch gleich in deinen Branch übernehmen? Und 
natürlich sollte der Header immer vor der ersten Ausgabe geschrieben 
werden, was in der editpartinfo.php momentan nicht so ist. Da habe ich 
etwas "gebastelt", da es eh nur eine Übergangslösung ist (die Seite wird 
ja eh noch auf Templates umgestellt).

von Gelöscht (kami89)


Lesenswert?

M. K. schrieb:
> Ein paar Fragen zu dem CSV-Import:
> Im Beispiel wird vor den Daten eine Zeile mit den Spaltennamen
> angegeben, sind in dem Beispiel alle Spalten aufgeführt die es gibt und
> das # am Anfang muss auch sein?

Ja es sind alle Spalten aufgeführt, die existieren. Und alle Zeilen mit 
einem # am Anfang werden einfach ignoriert, das sind nur Kommentare 
(brauchts also nicht).

M. K. schrieb:
> Wenn ich die Vorschaubilder(Footprints) benutzen möchte muss ich bei
> Footprint exakt den Namen des Vorschaubildes angeben?

Ja, in Version 0.2.2 ist das noch so. Die aktuelle SVN-Version 
unterscheidet nun zwischen Footprint-Name und Dateiname (sind also 
unabhängig voneinander). Allerdings ist das Zuweisen eines Bildes noch 
nicht sehr bequem möglich, mann muss direkt den Dateinamen inkl. Pfad 
angeben. Es gibt aber immerhin einen Trick: Einfach den Dateinamen (ohne 
Pfad) eingeben, und so speichern. Danach ist dieser Footprint unter 
"Fehlerhafte Dateinamen" aufgelistet (mit einem Vorschlag als 
Dateinamen) und man muss nur noch bestätigen, dass der neue Pfad 
übernommen wird.
Das ist halt alles noch ein bisschen provisorisch weil uns der neue 
Uploadmanager noch fehlt (bzw. der Programmierer, der ihn programmiert) 
;-)

M. K. schrieb:
> Die Lagerorte haben bei uns Unterkategorien, wie kann ich die in der
> CSV-Datei angeben? z.B. Schubladenkästen -> S-0123
> Das gleiche bei den Bauteilkategorien.

Das automatische Anlegen von Kategorien funktioniert meines Wissens 
nicht mit Unterkategorien. Alle noch nicht existierenden Kategorien 
werden unter der Kategorie "Import" abgelegt.
Existieren die Kategorien aber bereits, dann brauchst du nur den 
direkten Kategorienamen anzugeben (ohne Pfad), das müsste funktionieren. 
Allerdings funktioniert das nur dann zuverlässig, wenn es nur eine 
einzige Kategorie mit diesem Namen gibt!

Für deinen Fall wäre die einzig gescheite Lösung also, dass du alle 
Kategorien schon vorher von Hand anlegst. Wäre das zu aufwändig (hast du 
viele Kategorien)? Dann könnte vielleicht auch jemand das Importscript 
so abändern, dass man auch ganze Pfade angeben kann, und die dann auch 
so angelegt werden...

von M. K. (avr-frickler) Benutzerseite


Lesenswert?

Urban B. schrieb:
> Für deinen Fall wäre die einzig gescheite Lösung also, dass du alle
> Kategorien schon vorher von Hand anlegst. Wäre das zu aufwändig (hast du
> viele Kategorien)? Dann könnte vielleicht auch jemand das Importscript
> so abändern, dass man auch ganze Pfade angeben kann, und die dann auch
> so angelegt werden...

Soviele sind es nicht, diese vorher per Hand anzulegen dürfte recht gut 
gehen. Die Lagerorte sind eindeutig, die Bauteilkategorien sollten auch 
eindeutig sein, wenn nicht lässt sich da sicher ein wenig tricksen.

Mehr Arbeit habe ich im Moment sowieso damit die Daten aus Excel 
aufzubereiten :-/

Urban B. schrieb:
>> Macht es vielleicht auch Sinn einem Bauteil mehrere Hersteller zuordnen
>> zu können?
>
> Hmm...Also ich würde da jetzt nicht direkt einen Sinn erkennen. Ich
> würde ähnliche Bauteile (genau gleich werden sie ja kaum sein), die von
> anderen Herstellern stammen, als separate Bauteile abspeichern. Dieses
> hat dann ja auch wieder andere Bestellnummern, andere Lieferanten,
> andere Preise. Gemeinsamkeiten unter den verschiedenen Teilen gibt es
> dann ja kaum noch (softwaretechnisch betrachtet, nicht die Bauteile an
> sich verglichen).
>
> Wenn du aber einen guten Grund hast, warum diese Funktion Sinn machen
> würde, dann immer her damit :-)

Darüber haben wir gerade nochmal überlegt, dann ist uns aufgefallen das 
es überhaupt keine Spalte für den Hersteller gibt. :D
Wahrscheinlich reicht es uns wenn wir solche Bauteile dann doppelt 
anlegen.

Was aber öfters vorkommt ist, das wir 2 Bauteile an 2 Lagerorten haben. 
Eine kleine Menge in unseren Schubladenkästen für Prototypen und eine 
größere Menge die wir evtl. unseren Bestücker für die erste Serie 
beistellen. Manchmal passen die Teile auch nicht in eine Schublade dann 
wird das auf 2 oder 3 Schubladen aufgeteilt.
Man kann dafür zwar auch mehrere Bauteile anlegen, wenn sich dann aber 
der Preis, Bestellnummer, Datenblatt ändert muss man halt daran denken 
bei allen die Änderung durchzuführen.

von Gelöscht (kami89)


Lesenswert?

M. K. schrieb:
> Darüber haben wir gerade nochmal überlegt, dann ist uns aufgefallen das
> es überhaupt keine Spalte für den Hersteller gibt. :D
> Wahrscheinlich reicht es uns wenn wir solche Bauteile dann doppelt
> anlegen.

Ja, noch gibt es keine solche Spalte, aber die kommt noch :-)

M. K. schrieb:
> Was aber öfters vorkommt ist, das wir 2 Bauteile an 2 Lagerorten haben.
> Eine kleine Menge in unseren Schubladenkästen für Prototypen und eine
> größere Menge die wir evtl. unseren Bestücker für die erste Serie
> beistellen.

Hmm ja, ich denke darüber lässt sich nachdenken. Mal schauen ob wir das 
so einbauen werden.

von Udo N. (weinbauer73)


Lesenswert?

Urban B. schrieb:
> @Udo
> Kannst du diese Änderungen auch gleich in deinen Branch übernehmen? Und
> natürlich sollte der Header immer vor der ersten Ausgabe geschrieben
> werden, was in der editpartinfo.php momentan nicht so ist. Da habe ich
> etwas "gebastelt", da es eh nur eine Übergangslösung ist (die Seite wird
> ja eh noch auf Templates umgestellt).

Ich habe die Änderungen gerade eingepflegt :-) Meine aktuelle Version 
stelle ich heute abend ins SVN, unabhängig von der Freigabe der neuen 
Lizenzinfo.

Von meiner Seite ist es auch geplant, die Popups auf Pseudo-Popups 
(DIV-Blöcke, die über die Seite gelegt werden und wie neue Fenster 
aussehen) zu ändern. Aber lasst mich erstmal die Templates erstellen und 
die Klassen zusammen mit Urban integrieren :-)

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
> Ich habe die Änderungen gerade eingepflegt :-) Meine aktuelle Version
> stelle ich heute abend ins SVN, unabhängig von der Freigabe der neuen
> Lizenzinfo.

Wunderbar :-) Ich habe K.J mal eine PN geschickt, auch deine 
Lizenzänderung habe ich erwähnt. Jedoch hat er bisher nicht geantwortet.

Es erstaunt mich dass dieser Bug erst jetzt gemeldet wurde, es war ein 
extrem nerviges Verhalten wenn man den IE verwendet. Es waren nicht nur 
die genannten drei Buttons betroffen, es gab auch noch andere 
Situationen in denen unnötig neue Popups geöffnet wurden. Naja 
vielleicht arbeitet einfach kein Mensch mehr mit dem IE ;-)

Udo Neist schrieb:
> Von meiner Seite ist es auch geplant, die Popups auf Pseudo-Popups
> (DIV-Blöcke, die über die Seite gelegt werden und wie neue Fenster
> aussehen) zu ändern.

Klingt gut, bin gespannt wie das aussehen wird :-)

von Udo N. (weinbauer73)


Lesenswert?

Revision 513:

- neue Lizenzinfo in den Scripten, abgesehen von externen 
Third-Party-Modulen
- diverse Templates erstellt, darunter für die Tools
- Änderung von validatePosIntNumber()
- Erstes Updatesystem für die Datenbank: soll auf einem spezifierten 
Server nach einem Update für die Datenbank suchen und installieren
- Bugfix (siehe ein paar Posts weiter oben)

Infos zum Updatesystem:

Das Updatesystem prüft auf einem spezifizierten Server, ob zur 
installierten Datenbank ein passendes Update vorliegt. Die aktuelle 
Datenbank trägt die Version 12. Das neue System verlangt eine Version, 
Subversion und Revision. Dafür legt die derzeitige update.php über das 
mitgelieferte update/part-db_update_rev12.zip zwei zusätzliche Einträge 
dbSubversion und dbRevision in der Tabelle internal an. Damit 
können wir sehr genau steuern, welche Version wir zum Update anbieten. 
Treten Fehler in unseren Versionen auf, soll ein passender Mechanismus 
ein Rollback und ein neues Update ermöglichen. Geplant ist es, die 
betreffenden Tabellen bzw. die gesamte Datenbank zuvor zu sichern.

Ob das Updatesystem auch ein Online-Update der Scripte/Templates 
ermöglicht, das kann man zum jetzigen Zeitpunkt noch nicht sagen.

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
> Das Updatesystem prüft auf einem spezifizierten Server, ob zur
> installierten Datenbank ein passendes Update vorliegt. Die aktuelle
> Datenbank trägt die Version 12. Das neue System verlangt eine Version,
> Subversion und Revision. Dafür legt die derzeitige update.php über das
> mitgelieferte update/part-db_update_rev12.zip zwei zusätzliche Einträge
> dbSubversion und dbRevision in der Tabelle internal an. Damit
> können wir sehr genau steuern, welche Version wir zum Update anbieten.

Das verstehe ich nicht ganz. Wir sollten kein Durcheinander mit dem 
Update der Datenbank, und dem Update des Systems (die Dateien) machen.

Die Updatefunktion der Datenbank finde ich so wie sie momentan ist, 
eigentlich sehr gut. Es ist total unkompliziert und vorallem aber prüft 
sie quasi immer, ob das aktuell installiere System (die Dateien) eine 
neuere Datenbankversion braucht als die aktuell installierte. Es ist so 
quasi ein sehr selbstständiges und unkompliziertes System. Und 
ausserdem, was ich auch noch sehr wichtig finde: Wenn jemand die 
Updatefunktion des Systems nicht nutzen will oder kann, aber trotzdem 
eine aktuelle Version haben will, der kann weiterhin problemlos die 
neuen Dateien einfach von Hand auf den Server laden. Ein eventuell 
notwendiges Datenbankupdate wird dann automatisch durchgeführt wenn die 
db_update.php mit einer neueren Version überschrieben wurde.

Daher denke ich wir sollten es nicht unnötig kompliziert machen. Also 
das Datenbankupdate und das Systemupdate sollen unabhängig voneinander 
funktionieren, und das tun sie wenn wir das Datenbankupdate genau so 
lassen wie es jetzt ist.

Beim Systemupdate dachte ich, dass ein Updatearchiv einfach alle neuen 
(geänderten) Dateien enthalten soll, auch Footprint-Bilder usw. Durch 
ein einfaches Entpacken werden dann alle Dateien überschrieben. Und 
damit man auch Dateien löschen, verschieben usw. kann, wäre vielleicht 
ein im Archiv enthaltenes Shell-Script eine einfache, aber sehr flexible 
Lösung. Dieses Skript soll sich vielleicht nach einem erfolgreichen 
Ausführen gleich automatisch Löschen, dann bräuchten wir nichtmal zu 
überprüfen ob das Skript bereits ausgeführt wurde, oder ob es noch 
ausgeführt werden muss.

EDIT: Oder man benutzt genau das gleiche Prinzip wie beim 
Datenbankupdate. Das Skript enthält ein switch-case, mit einem case pro 
Systemversion. Das wäre meiner Meinung nach eine gut geeignete Lösung.

> Treten Fehler in unseren Versionen auf, soll ein passender Mechanismus
> ein Rollback und ein neues Update ermöglichen. Geplant ist es, die
> betreffenden Tabellen bzw. die gesamte Datenbank zuvor zu sichern.

Für die Datenbank soll es dazu in meiner Datenbankklasse ja die 
Funktionen backup() und restore() geben. Fürs System müsste man wohl 
zuerst alle Dateien sichern (zippen?), um sie auch wiederherstellen zu 
können. Zumindest die Systemdateien (ohne Bilder, das wäre wohl zu viel 
des Guten).

Ach übrigens, K.J. hat auf meine PN geantwortet und schrieb dass die 
Lizenzänderung so in Ordnung sei.

von Gelöscht (kami89)


Lesenswert?

Hmm nach einigem Nachdenken gefällt mir mein Vorschlag zwar auch nicht 
mehr so gut, also vergiss diesen Teil meines letzten Beitrages einfach 
wieder^^

Ich bin noch ein bisschen am überlegen wie man es besser machen 
könnte...

von Udo N. (weinbauer73)


Lesenswert?

Das Prinzip neue Softwareversion = neue Datenbankversion bleibt ja 
weiterhin bestehen. Dieser Mechanismus soll dafür sorgen, das zur 
jeweiligen Software auch immer die richtige Datenbankversion installiert 
ist. Wenn es ein Fehler in der Datenbank gibt, können wir den Bugfix auf 
diese Weise zur Verfügung stellen. Der jetzige Ansatz bedingt ja, das 
wir die Änderungen immer in der db_update.php einbauen. Das wird aber 
nicht in jedem Fall auch funktionieren. Nicht jeder hat Zugriff auf die 
Dateien von Part-DB und muss daher eine passende Updatefunktion für 
Datenbank und System besitzen.

Switch oder If-Sequenzen für jede einzelne Datenbankversion? Das wird 
irgendwann unwartbar werden.

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
> Der jetzige Ansatz bedingt ja, das
> wir die Änderungen immer in der db_update.php einbauen. Das wird aber
> nicht in jedem Fall auch funktionieren. Nicht jeder hat Zugriff auf die
> Dateien von Part-DB und muss daher eine passende Updatefunktion für
> Datenbank und System besitzen.

Warum hat nicht jeder Zugriff auf die Dateien von Part-DB? Direkten 
Dateizugriff hat nicht jeder, das ist klar. Aber ein Update wird ja 
nicht vom Benutzer durchgeführt, sondern vom Webserver (auf Linux 
standardmässig ja die Gruppe "www-data"). Der Webserver sollte ja in 
jedem Fall Zugriff auf die Dateien haben. Hat er kein Schreibrecht im 
ganzen Part-DB Ordner, kann man ein automatisches Update natürlich 
vergessen, da keine Dateien aktualisiert werden können.

Und per separaten Updates nur die Datenbank zu aktualisieren halte ich 
für unnötig. Entweder gibts das ganze Update-Programm oder nix :-)

Aber eigentlich sollte es ja kein Problem darstellen, dass man dem 
Benutzer "www-data" Schreibrechte für den ganzen Ordner von Part-DB gibt 
oder?

Udo Neist schrieb:
> Switch oder If-Sequenzen für jede einzelne Datenbankversion? Das wird
> irgendwann unwartbar werden.

Ja das denke ich eben momentan auch gerade. Es wäre schon nicht 
schlecht, wenn jedes Update immer nur diejenigen Updateschritte enthält, 
die für dieses Update notwendig sind. Das Problem ist dann allerdings, 
dass das System wirklich nur noch Version für Version aktualisiert 
werden darf. Wenn man immer die Online-Updates benutzt ist das kein 
Problem. Will man aber nur manuelle Updates machen, und das nur einmal 
im Jahr, dann müsste man ja alle in dieser Zeit veröffentlichten 
Update-Pakete separat herunterladen, nacheinander auf den Server 
kopieren und jedesmal nach dem Kopieren die Seite im Browser 
aktualisieren damit die Updateschritte durchgeführt werden ;-)

Oder hast du für dieses Problem auch eine Lösung? :-)

von Udo N. (weinbauer73)


Lesenswert?

Urban B. schrieb:
> Ja das denke ich eben momentan auch gerade. Es wäre schon nicht
> schlecht, wenn jedes Update immer nur diejenigen Updateschritte enthält,
> die für dieses Update notwendig sind. Das Problem ist dann allerdings,
> dass das System wirklich nur noch Version für Version aktualisiert
> werden darf. Wenn man immer die Online-Updates benutzt ist das kein
> Problem. Will man aber nur manuelle Updates machen, und das nur einmal
> im Jahr, dann müsste man ja alle in dieser Zeit veröffentlichten
> Update-Pakete separat herunterladen, nacheinander auf den Server
> kopieren und jedesmal nach dem Kopieren die Seite im Browser
> aktualisieren damit die Updateschritte durchgeführt werden ;-)
>
> Oder hast du für dieses Problem auch eine Lösung? :-)

Wenn man das ganze mal weiter spinnt, wäre folgendes wohl sinvoller: 
Statt einem Update gäbe es Sammelupdates, also ein Paket von x 
SQL-Scripte. Die PHP-Datei würde dann eine Zuordnung SQL-Script zur 
Datenbank- und Part-DB-Version beinhalten. Wir würden also zur 
Datenbankversion 12 ein Paket anbieten, zur 13 ein anderes, zur 14 
wieder ein anderes. Die Updatefunktion durchsucht das Array in der 
PHP-Datei nach gültigen Updates für sich und spielt die ein. Im Prinzip 
könnten wir so auch die Installation der Datenbank durchführen, 
sozusagen als Update Nummer 0 ;-)

So in etwa stelle ich mir das vor:
1
$up2date[12]['sqlscript'][]=12-0-0.sql;
2
$up2date[12]['required'][]=511;
3
$up2date[12]['sqlscript'][]=12-0-1.sql;
4
$up2date[12]['required'][]=553;
5
$up2date[12]['sqlscript'][]=12-0-2.sql;
6
$up2date[12]['required'][]=599;
7
$up2date[12]['sqlscript'][]=12-0-3.sql;
8
$up2date[12]['required'][]=615;

Das Update der Datenbank selbst wäre ja eher ein Sonderfall. Ich kann 
mir vorstellen, dass wir das in Richtung Update von Logos, Footprints 
u.ä. weiter"spinnen". Es wären also nicht nur SQL-Scripte in dem Archiv, 
sondern auch Dateien, die ins System kopiert werden. Wenn man so will, 
wäre das das Systemupdate, was wir wollen :-)

von K. J. (Gast)


Lesenswert?

Hi, wollte mich mal kurz melden um einiges zu erwähnen:

- Das mit der Lizenz ist ok find auch das jeder der was dran macht sich 
ja auch da unter verewigen kann in etwa wie folgt wen nur ich da stehe 
ist das irgendwie blöd:

"- Nick  Art der Änderungen  Datum"

Ansonsten die Demo DB ist erstmal bis Mo. nicht funktionsfähig, leider 
gab es eine Sicherheitslücke im Plesk des Servers, also werde ich den am 
WE neu aufsetzen müssen, diesmal ohne Admin Interface ;-)

So ich glaub das war es erstmal, ansonsten per Mail wen was wichtiges 
ist (die gmail. addy)

von Udo N. (weinbauer73)


Lesenswert?

K. J. schrieb:
> Hi, wollte mich mal kurz melden um einiges zu erwähnen:
>
> - Das mit der Lizenz ist ok find auch das jeder der was dran macht sich
> ja auch da unter verewigen kann in etwa wie folgt wen nur ich da stehe
> ist das irgendwie blöd:
>
> "- Nick  Art der Änderungen  Datum"

Gute Idee :-) Ich denke, das sollten wir im offiziellen 
Entwicklungszweig einführen und, wenn die beiden Zweige von Urban und 
mir zusammengeführt sind, entsprechend neu starten. Ist ja fast ein 
kompletter Rewrite des Codes.

Ich führe in meinem Zweig ein kurzes Logfile, welches die wichtigsten 
Änderungen zusammenfasst.

> Ansonsten die Demo DB ist erstmal bis Mo. nicht funktionsfähig, leider
> gab es eine Sicherheitslücke im Plesk des Servers, also werde ich den am
> WE neu aufsetzen müssen, diesmal ohne Admin Interface ;-)

Aus diesem Grund hab ich auf jegliche Adminoberfläche verzichtet und 
nutze nur wenige Webtools. Alles andere geht über die Konsole :-)

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
> Das Update der Datenbank selbst wäre ja eher ein Sonderfall. Ich kann
> mir vorstellen, dass wir das in Richtung Update von Logos, Footprints
> u.ä. weiter"spinnen". Es wären also nicht nur SQL-Scripte in dem Archiv,
> sondern auch Dateien, die ins System kopiert werden. Wenn man so will,
> wäre das das Systemupdate, was wir wollen :-)

Jo, ein Updatepaket soll alles mögliche beinhalten: Die neuen 
PHP-Dateien, Footprints, IC-Logos, Dokumentation, Updateanweisungen für 
exec() und Datenbankupdate.

Wenn wir jetzt die Updatepakete so minimal bauen, dass damit die Version 
immer nur um eine erhöht wird, wäre das schlussendlich für das 
automatische Update wohl das Beste, da die Pakete dadurch immer nur so 
gross sind wie nötig. Und ausserdem ist es zuverlässiger, da nicht die 
unmöglichsten Versionssprünge überwunden werden müssen, sondern wirklich 
immer nur die jeweils nächstneuere. Also ich meine jetzt dateitechnisch 
ist es so sicherer, weil keine Dateivsersionen übersprungen werden 
können.

Für die Manuell-Updater müssten wir dann halt ab und zu mal komplette 
Updatearchive anbieten, mit denen dann auch grössere Versionssprünge auf 
einmal gemacht werden können. Ist halt leider schon wieder ein 
zusätzlicher Aufwand für uns Entwickler, aber man muss ja nicht bei 
jedem neuen Einzelupdate auch ein Komplettupdate anbieten.

Man könnte vielleicht ja auch der Versionsbezeichnung eine Bedeutung 
zuweisen. also wenn die Versionsbezeichnung wie die 0.2.2 aus drei 
Zahlen besteht, ist die erste Zahl die Hauptversion, die zweite Zahl 
entspricht den Komplettupdatepaketen und die dritte Zahl den 
Einzelupdates. Ist aber nur mal ein Vorschlag...

Für die Updates könnte man vielleicht einen neuen Ordner anlegen, z.B. 
"updates/". Die Dateien darin sind genau nach der jeweiligen 
Versionsnummer benannt, z.B. "0.2.3.inc" (oder php, wie auch immer...). 
In den Einzelupdatepaketen ist jeweils nur eine solche Datei vorhanden, 
in den Komplettupdatepaketen ist für jede Version, die mit dem Archiv 
überwunden werden kann, eine Datei vorhanden. Bei den Komplettupdates 
kann es ja auch vorkommen, dass eine gewisse Version Voraussetzung ist, 
um problemlos updaten zu können. Also wenn man v0.2.2 installiert hat, 
und dann das Komplettpaket v0.4.0 installieren will, das aber unbedingt 
v0.3.3 voraussetzt, muss das System merken dass die Update-Dateien für 
die Versionen 0.2.2 bis v0.3.3 gar nicht vorhanden sind.

In den jeweiligen Updatedateien sind dann vielleicht folgende 
Informationen enthalten:
- Version, die vorausgesetzt wird (normalerweise immer eine Version 
tiefer als die von der Datei, aber für Sprünge von z.B. 0.2.9 auf 0.3.0 
ist diese Information wichtig)
- Version, die installiert wird (könnte man ev. auch weglassen, da der 
Dateinamen diese Information ja schon enthält)
- Kurze Zusammenfassung des Updates (Changelog, der dem Benutzer auch 
gezeigt wird damit man weiss was neu ist)
- Eine Updatefunktion, der eine Referenz auf das PDO meiner 
Datenbankklasse übergeben wird (und ev. noch weitere Parameter)
- In dieser Funktion sind dann direkt die kompletten Datenbankupdates 
enthalten, also nicht nur die SQL-Querys. Dies hat den Vorteil, dass man 
einfach flexibler ist. Man kann auch mal ein kompliziertes 
Datenbankupdate durchführen, bei dem eine PHP Schleife notwendig ist 
oder sowas, da man über das PDO den direkten Vollzugriff auf die 
Datenbank hat.
- In der Funktion können auch per exec() noch spezielle Sachen gemacht 
werden, wie z.B. nicht mehr benötigte Dateien löschen, Dateien 
verschieben usw. Da ist man dann eigentlich völlig frei was man hier 
noch machen will.

So, und jetzt lese ich das gleich nochmal ein paarmal durch und finde 
bestimmt wieder einige Aspekte die ich noch vergessen habe :-)

K. J. schrieb:
> - Das mit der Lizenz ist ok find auch das jeder der was dran macht sich
> ja auch da unter verewigen kann in etwa wie folgt wen nur ich da stehe
> ist das irgendwie blöd:
>
> "- Nick  Art der Änderungen  Datum"

Jo, das finde ich gut. So kann man nämlich sehr schnell nachvollziehen 
wer welche Änderung gemacht hat, das ist ab und zu mal nützlich. Wenn 
ich einen Vorschlag machen darf, würde ich aber das Datum zu vorderst 
schreiben, so dass es dann eine schöne, nach Datum sortierte Liste gibt 
:-)

von kirk d. (kirkdis)


Lesenswert?

die updatefunktion ist schon schön allerdings muss ich gestehen dass 
meine partdb aktuell ohne internetleitung auskommt und das möchte ich 
auch ungern ändern schon allein wegen der datensicherheit. updatepakete 
wären toll. beim ersten start kann dann das script prüfen ob die 
datenbank auf dem neuesten stand ist.

Was mich noch freuen würde wenn man auch andere einheiten benutzen kann 
als nur stückzahlen. aktuell ist es so dass wir im lager auch kabel 
verwalten da geht et z.b. um meter, oder habt ihr schon eine lösung 
bezüglich teile die nicht stückzahlabhängig geführt werden? die 
problematik die ich aktuell habe sind dann so sachen wie aderendhülsen 
die in massen im lager liegen. wir behelfen uns momentan damit dass wir 
einfach 999999 als stückzahl eingeben, allerdings schlägt sich das in 
der statistik nieder. im vergleich mit anderen "professionellen" 
lagerverwaltungssystemen ist ich die partdb um längen voraus. gibts 
schon eine lösung die footprints auszublenden? ich weiss ihr seid voll 
im wuseln mit der updateroutine. falls ihr mal ein aktuelles package zum 
testen habt das ohne grobe bugs läuft wäre es schön wenn ihr dass mal 
irgendwo online stellen könnt. ich würde das dann mal versuchen bei uns 
im alltag einzusetzen, da findet man am ehesten fehler und bugs..

gruß

von Gelöscht (kami89)


Angehängte Dateien:

Lesenswert?

kirk disen schrieb:
> die updatefunktion ist schon schön allerdings muss ich gestehen dass
> meine partdb aktuell ohne internetleitung auskommt und das möchte ich
> auch ungern ändern schon allein wegen der datensicherheit. updatepakete
> wären toll. beim ersten start kann dann das script prüfen ob die
> datenbank auf dem neuesten stand ist.

Es wird natürlich weiterhin möglich sein, die Updates manuell 
einzuspielen. Man lädt sich dann halt die Updatepakete selber im 
Internet runder, entpackt sie und kopiert die neuen Dateien auf den 
Webserver. Das Update der Datenbank führt dann das System selber durch.

kirk disen schrieb:
> Was mich noch freuen würde wenn man auch andere einheiten benutzen kann
> als nur stückzahlen. aktuell ist es so dass wir im lager auch kabel
> verwalten da geht et z.b. um meter, oder habt ihr schon eine lösung
> bezüglich teile die nicht stückzahlabhängig geführt werden?

Daran habe ich noch gar nie gedacht, ist aber natürlich eine sehr gute 
Idee. Wird aber wohl auch noch ein Weilchen dauern bis wir das eingebaut 
haben. Bis dahin musst du dir halt z.B. bei Kabel einfach vorstellen es 
wäre nicht die Stückzahl, sondern die Anzahl Meter ;-)

kirk disen schrieb:
> im vergleich mit anderen "professionellen"
> lagerverwaltungssystemen ist ich die partdb um längen voraus.

Ja das ist natürlich klar, hier arbeiten keine 50 gut bezahlte Leute je 
8 Stunden am Tag an dem Programm :-)
Und die Versionsnummer 0.2.2 sollte auch darauf hinweise, dass es noch 
eine sehr frühe Version ist, also noch nicht wahnsinnig fortgeschritten.

kirk disen schrieb:
> gibts
> schon eine lösung die footprints auszublenden? ich weiss ihr seid voll
> im wuseln mit der updateroutine. falls ihr mal ein aktuelles package zum
> testen habt das ohne grobe bugs läuft wäre es schön wenn ihr dass mal
> irgendwo online stellen könnt. ich würde das dann mal versuchen bei uns
> im alltag einzusetzen, da findet man am ehesten fehler und bugs..

Also ich habe dir zuliebe mal rasch eine Funktion eingebaut, damit man 
die Footprints deaktivieren kann. Es ist aber keine 100% saubere Arbeit 
sondern eher eine Übergangslösung bis es dann in der nächsten Version 
richtig eingebaut wird.
Ich habe mal die aktuellste SVN-Version mit diesem neuen Feature hier 
angehängt (dann musst du dich nicht auch noch mit dem SVN 
auseinandersetzten :-)
Einfach wieder die config.php_template als config.php kopieren und die 
Einstellungen setzen. Die neue Variable $disable_footprints müsstest du 
dann auf "true" setzen.

von Udo N. (weinbauer73)


Lesenswert?

kirk disen schrieb:
> die updatefunktion ist schon schön allerdings muss ich gestehen dass
> meine partdb aktuell ohne internetleitung auskommt und das möchte ich
> auch ungern ändern schon allein wegen der datensicherheit. updatepakete
> wären toll. beim ersten start kann dann das script prüfen ob die
> datenbank auf dem neuesten stand ist.

An sowas hab ich schon gedacht. Es wird zwei Optionen geben: On- oder 
Offlineupdate (aus einem lokalen Verzeichnis).

> Was mich noch freuen würde wenn man auch andere einheiten benutzen kann
> als nur stückzahlen. aktuell ist es so dass wir im lager auch kabel
> verwalten da geht et z.b. um meter, oder habt ihr schon eine lösung
> bezüglich teile die nicht stückzahlabhängig geführt werden?

Könnte man in der Kategorie lösen. Dort würde ich quasi die verwendete 
Verpackung hinterlegen, z.B. Stk, VE, Meter, Trommel oder einfach nur 
ein Schalter für "Vorhanden/Bestellt/Nicht verfügbar". Letzeres wäre für 
Massenartikel wie die Aderendhülsen.

Ich habe mir zudem überlegt, ob Part-DB nicht auch Platinen oder Gehäuse 
aufnehmen sollte. Damit wären dann die Baugruppen soweit komplett.

> gibts schon eine lösung die footprints auszublenden? ich weiss ihr seid
> voll im wuseln mit der updateroutine. falls ihr mal ein aktuelles
> package zum testen habt das ohne grobe bugs läuft wäre es schön wenn ihr
> dass mal irgendwo online stellen könnt. ich würde das dann mal versuchen
> bei uns im alltag einzusetzen, da findet man am ehesten fehler und bugs..

Wenn ich die Tage Zeit finde, kann ich mal schauen, ob ich eine schnelle 
Lösung dafür finde. Quick&Dirty wäre das Ein- und Ausschalten der 
Footprints per Konfiguration. Besser wäre es, wenn wir die Grafiken 
anders präsentieren. Mir schwebt vor, die Grafiken entweder 
user-/gruppengebunden bzw. in der Kategorie schaltbar zu machen oder per 
Tooltip bzw. Popup anzuzeigen. Mal schauen :-)

von Christian R. (holle)


Lesenswert?

Zu den Updates:
Kann man es nicht so machen, dass man Zum einen immer aktuelle Pakete 
bereit stellt und zu anderen (z.B. für diejenigen die eine langsame 
Internetverbindung haben) eine Update-Funktion.
Die Update-Funktion könnte ich mir so vorstellen dass zuerst einmal die 
aktuelle Version ausgelesen wird (z.B. 2.0.1). Das Update soll nun auf 
2.0.5 updaten, also erst einmal auf 2.0.2 , dann auch 2.0.3 usw.
Wird die Update-Funktion zu groß, dann setzt man ab da die Version x.x.x 
voraus, welche man dann halt komplett herunterladen muss.
So wären die Updatefunktionen überschaubar und man müsste nicht immer 
gleich "alles" herunterladen.
Auch denkbar wäre eine Funktion, die immer wenn man Part-DB startet auf 
Updates prüft und wenn verfügbar, dann eine Meldung erscheint.
In dem Fall könnte es dann so aussehen, dass man in einem Webordner alle 
Updates ablegt. Part-DB schaut nun in den Webordner (bei jedem start) 
und listet die Dateien auf, welche mit einer bestimmten Ziffernfolge 
beginnen (z.B. PDBU020005 --> Part DB Update 2.0.5) und vergleicht das 
mit der eigenen Version. Ist irgendeine Datei im Webordner größer als 
die vorhandene, dann wird stückweise geupdatet. Das könnte dann so 
aussehen:

Vorhandene Version = 2.0.0 , neuste Version im Webordner 2.0.5   ...
Da ich mich mit PHP nicht auskenne schreibe ich es einfach mal grob auf:

1. Dateien auslesen
2. PDBU aus den Dateinamen filtern und die Dateiendung entfernen, so 
dass nur noch die Zahl übrig bleibt, davon die höchste Nummer merken 
(neustesUpdate)
3. Hat nichts mit PHP zu tun, soll nur grob erklären wie ich es meine:

Version := aktuelleVersion
While (neustesUpdate > Version) (Schleife bis alle Dateinamen überprüft 
sind)
{
  update := Version + 1
  if (exist Update) {  ;püfen ob dieses Update existiert
      Gosub Updateroutine Update  ;Updateroutine mit Update als Param.
  }
  Version := neueVersion
}

So könnte man das vollautomatisch machen (zumindest für diejenigen die 
einen Internetzugang haben).
Da ich mich mit php leider nicht auskenne weiß ich natürlich nicht ob 
das so einfach realisierbar ist wie mit anderen Programmiersprachen, 
aber es soll ja auch nur ein Vorschlag sein.

von Gelöscht (kami89)


Lesenswert?

Christian R. schrieb:
> Zu den Updates:
> Kann man es nicht so machen, dass man Zum einen immer aktuelle Pakete
> bereit stellt und zu anderen (z.B. für diejenigen die eine langsame
> Internetverbindung haben) eine Update-Funktion.

Und warum soll eine Update-Funktion eine weniger schnelle 
Internetverbindung benötigen als wenn man es von Hand herunterlädt?
Ich verstehe nicht richtig was du meinst...

Aber keine Angst, es wird sicher eine gescheite Lösung rauskommen ;-)
Es wird ganz sicher die Möglichkeit geben, dass man zwischen manuellem 
und automatischen Update wählen kann.
Diejenigen, deren Webserver die technischen Voraussetzungen für ein 
automatisches Update haben, können direkt aus Part-DB heraus ein Update 
durchführen lassen. Dabei soll das System natürlich immer selber 
überprüfen ob eine neurere Version verfügbar ist.
Und für die, deren Webserver aus technischen oder sonst irgendwelchen 
Gründen kein Update durchführen können oder wollen, die können die 
Updatepakete einfach von Hand im Internet runterladen und auf den 
Webserver kopieren.

Udo Neist schrieb:
>> gibts schon eine lösung die footprints auszublenden? ich weiss ihr seid
>> voll im wuseln mit der updateroutine. falls ihr mal ein aktuelles
>> package zum testen habt das ohne grobe bugs läuft wäre es schön wenn ihr
>> dass mal irgendwo online stellen könnt. ich würde das dann mal versuchen
>> bei uns im alltag einzusetzen, da findet man am ehesten fehler und bugs..
>
> Wenn ich die Tage Zeit finde, kann ich mal schauen, ob ich eine schnelle
> Lösung dafür finde. Quick&Dirty wäre das Ein- und Ausschalten der
> Footprints per Konfiguration.

Genau das habe ich ja schon gemacht, guckst du SVN Revision 514 ;-)

von Udo N. (weinbauer73)


Lesenswert?

Das ist entspricht in etwa meiner Vorstellung:

- ein Listbefehl auf einen FTP oder einem lokalen Verzeichnis loslassen 
und alle Updatepakete ab eigener Version in ein Array aufnehmen
- Update in der Reihenfolge bis zum letzten Version innerhalb der 
Majorversion vornehmen

Die Beschreibungsdatei jedes Updatearchivs sagt, was wohin kopiert 
werden soll und welche SQL-Scripte in welcher Reihenfolge ausgeführt 
werden müssen.

Könnte wie folgt aussehen:
1
$up2date['514']['copy'][] = array('from' => DATEI, 'to' => DATEI);
2
$up2date['514']['copy'][] = array('from' => DATEI, 'to' => DATEI);
3
$up2date['514']['copy'][] = array('from' => DATEI, 'to' => DATEI);
4
$up2date['514']['delete'][] = DATEI;
5
$up2date['514']['sql'][] = SQLDATEI;
6
$up2date['514']['sql'][] = SQLDATEI;
7
$up2date['514']['cleanup'][] = true;
8
$up2date['514']['stable']=true;
9
$up2date['514']['version']='515';
10
$up2date['515']['copy'][] = array('from' => DATEI, 'to' => DATEI);
11
$up2date['515']['copy'][] = array('from' => DATEI, 'to' => DATEI);
12
$up2date['515']['sql'][] = SQLDATEI;
13
$up2date['515']['cleanup'][] = false;
14
$up2date['515']['stable']=false;
15
$up2date['515']['version']='516';

Die erste Ebene im Array $up2date enthält die Versionsnummer, für die 
die folgenden Anweisungen gelten:

- copy : Welche Datei wohin kopiert wird, wobei das Ziel als Backup 
gesichert wird
- delete : Welche Datei gelöscht wird (darf nur nach copy ausgeführt 
werden)
- sql : SQL-Scripte
- cleanup : Macht eine Bereinigung der automatisch angelegten 
Backupdateien (true) oder nicht (false). Bei false wäre sogar ein 
Rollback der Scripte möglich.
- version : Ändert die Versionsnummer auf die angegebene
- stable : Damit können wir bestimmte Versionen als stabil 
kennzeichnen und dem User damit sagen, das dieses Update "gefahrlos" 
ist. Wer bis auf das letzte stabile System updaten will, der durchläuft 
dann aber auch alle unstable Versionen.

Weitere Befehle wären z.B.:
- mkdir
- rmdir
- chmod

Mit einem solchen System könnte man sogar Sammelupdates für Systeme 
anbieten, die keine Internetverbindung haben oder nur selten upgedatet 
werden soll.

Programmtechnisch wäre das also ein Interpreter für eine Art 
Scriptsprache. Wenn jetzt jemand sagt, db_update.php beinhaltet doch 
sowas schon, dem kann ich sagen jein. Hier werden ja nur SQL-Befehle 
in der Reihenfolge wie im Array gespeichert ausgeführt. Die 
Versionsabfrage verläuft statisch per switch(). Vorrausetzung ist 
allerdings, das die Datenbank nicht mehr eine eigene Versionsnummer 
besitzt, sondern die (SVN-)Version von Part-DB nutzt. Für uns Entwickler 
bedeutet es, dass wir die zur Vorversion geänderte Dateien in diese 
Liste eintragen müssen. svn diff nimmt uns zum Glück etwas Arbeit ab 
und gibt die Änderungen zum Repository aus. Dabei benötigen wir ja nur 
die Dateinamen selbst:
1
svn diff | grep "Index: " | cut -d" " -f2

Folgender Code könnte dann das Array copy füllen:
1
#!/bin/sh
2
FILES=`svn diff | grep "Index: " | cut -d" " -f2`
3
4
for FILE in $FILES; do
5
        echo -e "\$up2date[513]['copy'][]=array('from'=>'up513/$FILE','to'=>'$FILE');"
6
done

Meine Arbeitskopie spuckt dann folgendes aus:
1
$up2date[513]['copy'][]=array('from'=>'up513/lib.php','to'=>'lib.php');
2
$up2date[513]['copy'][]=array('from'=>'up513/newpart.php','to'=>'newpart.php');
3
$up2date[513]['copy'][]=array('from'=>'up513/editpartinfo.php','to'=>'editpartinfo.php');
4
$up2date[513]['copy'][]=array('from'=>'up513/config.php','to'=>'config.php');
5
$up2date[513]['copy'][]=array('from'=>'up513/db_update.php','to'=>'db_update.php');

Ich kann mich ja mal an einen solchen Interpreter versuchen :-)

von Udo N. (weinbauer73)


Lesenswert?

Urban B. schrieb:
>> Wenn ich die Tage Zeit finde, kann ich mal schauen, ob ich eine schnelle
>> Lösung dafür finde. Quick&Dirty wäre das Ein- und Ausschalten der
>> Footprints per Konfiguration.
>
> Genau das habe ich ja schon gemacht, guckst du SVN Revision 514 ;-)

Eine Baustelle weniger ;-)

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
> - ein Listbefehl auf einen FTP oder einem lokalen Verzeichnis loslassen
> und alle Updatepakete ab eigener Version in ein Array aufnehmen
> - Update in der Reihenfolge bis zum letzten Version innerhalb der
> Majorversion vornehmen
>
> Die Beschreibungsdatei jedes Updatearchivs sagt, was wohin kopiert
> werden soll und welche SQL-Scripte in welcher Reihenfolge ausgeführt
> werden müssen.
>
> Könnte wie folgt aussehen:

Ich finde so eine Lösung aber irgendwie ziemlich aufwändig und 
unflexibel.
Ausserdem, wozu sollen die neuen Dateien noch manuell herumkopiert 
werden? Das kann man doch direkt mit dem Entpacken eines Updatesarchiv 
erledigen, in nur einem einzigen Befehl.

Nehmen wir mal an, ein Update v0.2.3 beihaltet eine neue lib.php, ein 
neues Dioden-Footprintbild, und die Informationen zum Update.
Ein Updatepaket könnte dann in etwa so aussehen:
1
part-db_v0.2.3.tar.gz:
2
    - update/0.2.3/updateinfo.inc
3
    - update/0.2.3/update.tar.gz:
4
        - lib.php
5
        - tools/footprints/Aktiv/Dioden/SMD/neuediode.png
Die neuen Dateien sind also nochmal separat in einem Archiv 
zusammengefasst.

In einem ersten Schritt würde Part-DB alle verfügbaren Updates nach 
update/ herunterladen. Wenn man die automatischen Updates nicht 
aktiviert hat, legt man die Pakete einfach von Hand in diesen Ordner, 
mehr muss man nicht machen.

Das System merkt jetzt, dass im Ordner update/ Archive für neuere 
Versionen als die momentan installierte verfügbar sind. Einfach anhand 
der Dateinamen der Archive, mehr brauchts nicht.
Sind neue Dateien vorhanden, beginnt das System sich zu aktualisieren. 
Als erstes werden alle neuen Archive einfach mal entpackt. Dann entsteht 
für jedes Update ein Ordner wie z.B. update/0.2.3/, in dem eine 
Infodatei und das Update an sich (als Archiv) liegen.

Jetzt wird die Datei updates/x.x.x/updateinfo.inc ausgelesen. Darin 
stehen:
- Version des Updates
- Vorausgesetzte Version
- Status (stable, unstable, ...)
- Checksumme des Archives "update.tar.gz", um auf Beschädigung zu prüfen
- Changelog, der dem Benutzer schon vor dem Update gezeigt werden kann
- Eine Funktion, die noch alle zusätzlich notwendigen Schritte enthält

Und genau diese Funktion ist das Geniale: Darin kann man einfach ALLES 
machen, was man möchte. Man hat nicht nur ein Array zur Verfügung, das 
man mit vordefinierten Befehlen befüllen kann. Nein, man hat vollen 
Zugriff auf das PDO Objekt, kann also auch Querys durchführen, Schleifen 
einbauen usw. Und für Systemoperationen kann man direkt den exec() 
Befehl benutzen.

Der nächste Schritt ist nun stinkeinfach, erledigt aber schon fast 
alles: Einfach nur das Archiv update/x.x.x/update.tar.gz der 
nächstneueren Version ins Hauptverzeichnis entpacken. Die Dateien sind 
jetzt schon alle auf dem neusten Stand, mit nur einem einzigen Befehl.

Danach wird dann noch die oben beschriebene Funktion aufgerufen, die ein 
Datenbankupdate, exec() Anweisungen oder was auch immer enthalten kann.

Wäre das nicht ein sehr einfaches, aber extrem flexibles und dadurch 
mächtiges Updatesystem?

von Udo N. (weinbauer73)


Lesenswert?

Urban B. schrieb:
> Ich finde so eine Lösung aber irgendwie ziemlich aufwändig und
> unflexibel.
> Ausserdem, wozu sollen die neuen Dateien noch manuell herumkopiert
> werden? Das kann man doch direkt mit dem Entpacken eines Updatesarchiv
> erledigen, in nur einem einzigen Befehl.
>
> Nehmen wir mal an, ein Update v0.2.3 beihaltet eine neue lib.php, ein
> neues Dioden-Footprintbild, und die Informationen zum Update.
> Ein Updatepaket könnte dann in etwa so aussehen:part-db_v0.2.3.tar.gz:
>     - update/0.2.3/updateinfo.inc
>     - update/0.2.3/update.tar.gz:
>         - lib.php
>         - tools/footprints/Aktiv/Dioden/SMD/neuediode.png
> Die neuen Dateien sind also nochmal separat in einem Archiv
> zusammengefasst.

Funktioniert aber nur dort, wo auch tar zur Verfügung steht. Windows 
kennt den Befehl von Haus aus nicht. GNU tar reagiert anders als die 
Versionen auf anderen Unices. ZIP (über zlib) müsste von PHP auf allen 
Plattformen laufen, sofern das Modul existiert. Statt dem copy-Befehl im 
Array ginge natürlich auch ein unpack :-) Mir wäre es lieber, wenn wir 
die PHP-Funktionen anstelle der Shell nehmen, denn einige Provider 
verbieten exec() und ähnliches.

> In einem ersten Schritt würde Part-DB alle verfügbaren Updates nach
> update/ herunterladen. Wenn man die automatischen Updates nicht
> aktiviert hat, legt man die Pakete einfach von Hand in diesen Ordner,
> mehr muss man nicht machen.

Geschenkt ;-) Wichtig ist, das nur alle Updates für die aktuelle Version 
und höher geladen werden. Alle vorherigen Updates wären überflüssig beim 
Download. Deshalb ja der List-Befehl auf einen FTP angewendet und 
durchforsten.

> Das System merkt jetzt, dass im Ordner update/ Archive für neuere
> Versionen als die momentan installierte verfügbar sind. Einfach anhand
> der Dateinamen der Archive, mehr brauchts nicht.
> Sind neue Dateien vorhanden, beginnt das System sich zu aktualisieren.
> Als erstes werden alle neuen Archive einfach mal entpackt. Dann entsteht
> für jedes Update ein Ordner wie z.B. update/0.2.3/, in dem eine
> Infodatei und das Update an sich (als Archiv) liegen.
>
> Jetzt wird die Datei updates/x.x.x/updateinfo.inc ausgelesen. Darin
> stehen:
> - Version des Updates
> - Vorausgesetzte Version
> - Status (stable, unstable, ...)
> - Changelog, der dem Benutzer schon vor dem Update gezeigt werden kann
> - Eine Funktion, die noch alle zusätzlich notwendigen Schritte enthält
>
> Und genau diese Funktion ist das Geniale: Darin kann man einfach ALLES
> machen, was man möchte. Man hat nicht nur ein Array zur Verfügung, das
> man mit vordefinierten Befehlen befüllen kann. Nein, man hat vollen
> Zugriff auf das PDO Objekt, kann also auch Querys durchführen, Schleifen
> einbauen usw. Und für Systemoperationen kann man direkt den exec()
> Befehl benutzen.

Letzteres geht nicht auf allen Servern! myparts.info lässt den 
Shell-Zugriff nicht zu. Und ich würde auf irgendwelche Scripte im 
Updatesystem verzichten oder willst du eine Hintertür erlauben? Ein paar 
Zeilen eingeschmuggelt und schon hat jemand anderes eine komplette 
Datenbank. cURL braucht nur ein paar Zeilen Code. Und es steht einem 
Angreifer zudem alle Möglichkeiten offen, die im Kontext des Webservers 
möglich sind.

> Der nächste Schritt ist nun stinkeinfach, erledigt aber schon fast
> alles: Einfach nur das Archiv update/x.x.x/update.tar.gz der
> nächstneueren Version ins Hauptverzeichnis entpacken. Die Dateien sind
> jetzt schon alle auf dem neusten Stand, mit nur einem einzigen Befehl.
>
> Danach wird dann noch die oben beschriebene Funktion aufgerufen, die ein
> Datenbankupdate, exec() Anweisungen oder was auch immer enthalten kann.
>
> Wäre das nicht ein sehr einfaches, aber extrem flexibles und dadurch
> mächtiges Updatesystem?

Nein, denn es scheitert an eventuell fehlenden Rechten bei PHP, die man 
oft nicht ändern kann (safe_mode, open_basedir, disable_functions, 
disable_classes), fehlende Programme auf der Plattform, Manipulation von 
Daten über die Shell (falls Zugriff möglich) und so manch anderes 
Problem. Part-DB muss den Systemrichtlinien der IT-Abteilungen von 
Firmen standhalten und erst recht im Internet funktionieren. Ansonsten 
können wir das Projekt myparts.info gleich wieder beerdigen. 
Cross-site-Scripting, SQL-Injections, Auslesen verschiedener 
Systemdateien, Backdoor installieren und so weiter... DNS umbiegen ist 
auch beliebt. Die Liste der möglichen Angriffe ist lang.

Wenn du deinen Vorschlag umsetzen willst, dann denk auch gleich über 
eine Signierung der Archive nach und wie man die Gültigkeit überprüft. 
Nicht vertrauenswürdige Schlüssel bzw. Signaturen sind dann ein Grund, 
ein Update zu verweigern.

Ich will hier nicht deine Ideen zerreden, aber ich bin nicht erst seit 
gestern Admin von einigen Servern im Inter- und Intranet. Musste hin und 
wieder mal Bots entfernen, die sich über schlechte PHP-Scripte 
eingeschlichen hatten. Geht ja erstmal ums Prinzip und darum, den 
gangbarsten Weg zu finden. Ich werde erstmal einen Interpreter erstellen 
und diesen zur Diskussion stellen.

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
> Funktioniert aber nur dort, wo auch tar zur Verfügung steht. Windows
> kennt den Befehl von Haus aus nicht. GNU tar reagiert anders als die
> Versionen auf anderen Unices. ZIP (über zlib) müsste von PHP auf allen
> Plattformen laufen, sofern das Modul existiert.

OK kein Problem, dann halt ZIP :-) Das ist ja auch wurscht, hauptsache 
irgend ein Archiv.

> Statt dem copy-Befehl im
> Array ginge natürlich auch ein unpack :-) Mir wäre es lieber, wenn wir
> die PHP-Funktionen anstelle der Shell nehmen, denn einige Provider
> verbieten exec() und ähnliches.

Ebenfalls kein Problem, da man ja in der Funktion, die ich oben 
erwähnte, ja so flexibel ist und die Befehle einbauen kann, die man 
möchte :-)

Was eben noch ein Hintergedanke von mir ist:
Es könnte ja mal vorkommen, dass wir ein Datenbankupdate durchführen 
müssen, das nicht mehr nur durch reine SQL Querys machbar ist, sondern 
zwingend über einen individuellen PHP-Code gemacht werden muss. Man kann 
dann aus dieser Funktion heraus auch auf alle meine Klassen zugreifen, 
und mit Objekten arbeiten usw.
Und vielleicht tauchen ja mal noch irgendwelche andere Probleme auf, die 
wir nur duch einen individuellen Codeblock lösen können, an die wir 
momentan nicht denken.

Udo Neist schrieb:
> Geschenkt ;-) Wichtig ist, das nur alle Updates für die aktuelle Version
> und höher geladen werden. Alle vorherigen Updates wären überflüssig beim
> Download. Deshalb ja der List-Befehl auf einen FTP angewendet und
> durchforsten.

Ja, es werden natürlich immer nur die neueren Versionen runtergeladen. 
Und jedes Updatearchiv beinhaltet nur gerade die neuen Dateien, also nur 
die, die sich verändert haben. So kann ein Update sogar aus nur einer 
einzigen PHP Datei bestehen, wenn z.B. ein Fehler in der lib.php behoben 
wurde. (Also natürlich würde sich diese lib.php dann auch zusammen mit 
einer Updateinfo-Datei in einem Archiv befinden)

Udo Neist schrieb:
> Letzteres geht nicht auf allen Servern! myparts.info lässt den
> Shell-Zugriff nicht zu. Und ich würde auf irgendwelche Scripte im
> Updatesystem verzichten oder willst du eine Hintertür erlauben? Ein paar
> Zeilen eingeschmuggelt und schon hat jemand anderes eine komplette
> Datenbank. cURL braucht nur ein paar Zeilen Code. Und es steht einem
> Angreifer zudem alle Möglichkeiten offen, die im Kontext des Webservers
> möglich sind.

Das mit der Shell bzw. exec() ist nun klar das geht wohl nicht, ist aber 
auch egal (war ja nur ein Beispiel. Ich hätte auch eine PHP Funktion als 
Beispiel nehmen können xD).

Wie will jemand ein paar Zeilen in die Updatefunktion einschmuggeln? 
Dazu gäbe es doch nur zwei Möglichkeiten: Entweder der "Angreifer" hat 
FTP-Zugriff auf dem Webserver, dann hilft aber jegliche 
Sicherheitsfunktion nichts mehr. Oder aber per DNS umbiegen oder sowas 
könnte man das Updatepaket von einer anderen Seite holen lassen, aber 
auch da kann man dann nichts mehr dagegen machen, denn dann müsste man 
ja nur z.B. eine neue, startup.php (die was Böses enthält) ins 
gefälschte Updatearchiv legen, und schon wird das böse Skript sogar bei 
jedem Aufruf der Seite, und nicht nur einmalig beim Update ausgeführt 
:-)
Somit sehe ich dieses Updatesystem nicht als Sicherheitslücke, zumindest 
nicht unsicherer als dein System (sofern ich deines richtig verstanden 
habe).

Udo Neist schrieb:
> Wenn du deinen Vorschlag umsetzen willst, dann denk auch gleich über
> eine Signierung der Archive nach und wie man die Gültigkeit überprüft.
> Nicht vertrauenswürdige Schlüssel bzw. Signaturen sind dann ein Grund,
> ein Update zu verweigern.

Das wäre doch eigentlich gar keine schlechte Idee!
Wie gesagt, ich denke auch jedes andere Updatesystem, das sich Daten von 
anderen Webserver holt ist eigentlich ja schonmal nicht 100%tig sicher. 
Somit wäre eine Signatur wohl sowieso für jedes Updatesystem eine sehr 
gute und nützliche Sicherheitseinrichtung.

Udo Neist schrieb:
> Ich will hier nicht deine Ideen zerreden, aber ich bin nicht erst seit
> gestern Admin von einigen Servern im Inter- und Intranet.

Jo kein Problem, wir diskutieren ja hier um eine Lösung zu finden, mit 
der möglichst alle Beteiligten zufrieden sind :-)
Und dass ich keine grosse Erfahrung mit dem Sicherheits-"Kram" von 
Servern habe, das ist halt so. Aber ich kann ja trotzdem Vorschläge 
machen, dann lerne ich auch gleich noch was dabei wenn du gute 
Gegenargumente bringst :-)

von Udo N. (weinbauer73)


Lesenswert?

Urban B. schrieb:
> Udo Neist schrieb:
>> Funktioniert aber nur dort, wo auch tar zur Verfügung steht. Windows
>> kennt den Befehl von Haus aus nicht. GNU tar reagiert anders als die
>> Versionen auf anderen Unices. ZIP (über zlib) müsste von PHP auf allen
>> Plattformen laufen, sofern das Modul existiert.
>
> OK kein Problem, dann halt ZIP :-) Das ist ja auch wurscht, hauptsache
> irgend ein Archiv.

ZIP hab ich auch schon in meiner Packer-Klasse drin :-)

> Was eben noch ein Hintergedanke von mir ist:
> Es könnte ja mal vorkommen, dass wir ein Datenbankupdate durchführen
> müssen, das nicht mehr nur durch reine SQL Querys machbar ist, sondern
> zwingend über einen individuellen PHP-Code gemacht werden muss. Man kann
> dann aus dieser Funktion heraus auch auf alle meine Klassen zugreifen,
> und mit Objekten arbeiten usw.
> Und vielleicht tauchen ja mal noch irgendwelche andere Probleme auf, die
> wir nur duch einen individuellen Codeblock lösen können, an die wir
> momentan nicht denken.

Ich wüsste nicht, welche Probleme wir noch mittels Script lösen müssen. 
Thumbnails erzeugen oder ähnliches geht auch mit entsprechend geänderten 
Scripte, die über das normale Update rein kommen. Sollte doch mal was 
gemacht werden, so wäre es am Besten, wenn der User aufgefordert wird 
oder mittels Redirect ein Post-Update-Script aus dem Archiv laufen zu 
lassen. Perfekt ist diese Lösung zwar nicht, aber man kann zumindest 
dieses Script je nach Wichtigkeit absichern (md5, sha1 oder was auch 
immer).

> Das mit der Shell bzw. exec() ist nun klar das geht wohl nicht, ist aber
> auch egal (war ja nur ein Beispiel. Ich hätte auch eine PHP Funktion als
> Beispiel nehmen können xD).

War das schlechteste Beispiel g


> Wie will jemand ein paar Zeilen in die Updatefunktion einschmuggeln?

Die Leute, die einem schaden wollen, die sind sehr erfinderisch. Und PHP 
gilt nicht als die sicherste Sprache, also lieber ein paar mehr 
Prüfungen rein als notwendig.

> Dazu gäbe es doch nur zwei Möglichkeiten: Entweder der "Angreifer" hat
> FTP-Zugriff auf dem Webserver, dann hilft aber jegliche
> Sicherheitsfunktion nichts mehr. Oder aber per DNS umbiegen oder sowas
> könnte man das Updatepaket von einer anderen Seite holen lassen, aber
> auch da kann man dann nichts mehr dagegen machen, denn dann müsste man
> ja nur z.B. eine neue, startup.php (die was Böses enthält) ins
> gefälschte Updatearchiv legen, und schon wird das böse Skript sogar bei
> jedem Aufruf der Seite, und nicht nur einmalig beim Update ausgeführt

Im schlechtesten Fall wäre das ganze System ohne Überprüfung und würde 
direkt den Code beim Updaten mit ausführen. Lässt man keinen Code zu, so 
muss der Angreifer die Scripte manipulieren. Hat man Checksummen wie 
sha1 und gibt die dem Updatesystem mit, so ist eine Hürde mehr drin. Man 
kann zu jedem Update-Archiv ein zweites anbieten, das Checksummen und 
ähnliches vorhält.

> Somit sehe ich dieses Updatesystem nicht als Sicherheitslücke, zumindest
> nicht unsicherer als dein System (sofern ich deines richtig verstanden
> habe).

Zumindest wären bei mir keine direkten Zugriffe möglich. Wäre in der 
Form noch ein include() nötig, aber ich möchte auch darauf verzichten 
und so eine Art INI-Datei oder XML nutzen. Die lassen sich nicht mit 
include(), require() oder eval() ausführen. Da braucht man einen 
Interpreter. Und wenn man genauer hinschaut, brauchst du auch einen 
solchen, ansonsten könntest du die Variablen nicht verabeiten. Für uns 
Entwickler würde ich passende Scripte schreiben, die das Zusammenbauen 
(weitgehends) erledigen.

> Udo Neist schrieb:
>> Wenn du deinen Vorschlag umsetzen willst, dann denk auch gleich über
>> eine Signierung der Archive nach und wie man die Gültigkeit überprüft.
>> Nicht vertrauenswürdige Schlüssel bzw. Signaturen sind dann ein Grund,
>> ein Update zu verweigern.
>
> Das wäre doch eigentlich gar keine schlechte Idee!
> Wie gesagt, ich denke auch jedes andere Updatesystem, das sich Daten von
> anderen Webserver holt ist eigentlich ja schonmal nicht 100%tig sicher.
> Somit wäre eine Signatur wohl sowieso für jedes Updatesystem eine sehr
> gute und nützliche Sicherheitseinrichtung.

GPG wäre ja eine gute Lösung, aber PHP unterstützt es nicht direkt. Und 
sowas selbst zu Entwicklen ist overkill. sha1 für Checksummen (wird in 
einer anderen Datei gespeichert, die man auch noch downloaden muss) ist 
schon recht gut.

> Jo kein Problem, wir diskutieren ja hier um eine Lösung zu finden, mit
> der möglichst alle Beteiligten zufrieden sind :-)
> Und dass ich keine grosse Erfahrung mit dem Sicherheits-"Kram" von
> Servern habe, das ist halt so. Aber ich kann ja trotzdem Vorschläge
> machen, dann lerne ich auch gleich noch was dabei wenn du gute
> Gegenargumente bringst :-)

Es heißt nicht umsonst im PHP-Umfeld: Drum prüfe, was du bekommst. In 
den wenigsten Teilen habe ich vernünftige Prüfungen der übergebenen 
Daten gesehen. $_REQUEST ist fast immer falsch, $_GET oder $_POST ist 
besser. $_GET für die Sachen, die man darstellen will, $_POST für die 
Formulare. $_REQUEST unterscheidet nicht, woher die Daten kommen. 
Desweiteren ist Part-DB ziemlich anfällig was SQL-Injections betrifft. 
Viele Variablen werden gar nicht auf den Typ geprüft. IDs sind entweder 
numerisch oder ein String. Fehlt eine Prüfung, kann aus einem harmlosen 
Select auch schnell mal ein Truncate oder Drop werden, denn ein 
Semikolon und ein Kommentarzeichen an der richtigen Stelle, schon wars 
das. Hier und da ein paar settype() reingeschrieben, noch ein paar 
Wertebereiche geprüft und die Daten möglichst noch escaped. Wobei man so 
oder so auf Prepared Statements setzen sollte.

Ich habe in meiner HTML-Klasse die Variablen im Konstruktor typisiert. 
Prüfungen des Inhalts gibt es kaum/keine, sind zum Teil auch gar nicht 
durchführbar, manches wird von vlibTemplate abgefangen. Sicher kann ich 
hier also auch nicht wirklich sein, was die übergebenen Daten angeht. 
Zumindest prüfe ich einige Daten und werfe bei Fehlern ein Exception. 
Das kann man erweitern und aus einem Abbruch mit Fehlermeldung noch 
zusätzlich ein Warning bei problematischen Parametern/Inhalten ausgeben.

Gute Nacht :-)

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
> Ich wüsste nicht, welche Probleme wir noch mittels Script lösen müssen.
> Thumbnails erzeugen oder ähnliches geht auch mit entsprechend geänderten
> Scripte, die über das normale Update rein kommen. Sollte doch mal was
> gemacht werden, so wäre es am Besten, wenn der User aufgefordert wird
> oder mittels Redirect ein Post-Update-Script aus dem Archiv laufen zu
> lassen. Perfekt ist diese Lösung zwar nicht, aber man kann zumindest
> dieses Script je nach Wichtigkeit absichern (md5, sha1 oder was auch
> immer).

OK hier mal ein Beispiel, das zwar keinen Sinn macht, technisch aber 
tatsächlich so ein Fall für eine PHP-Funktion statt einem SQL-Query ist:
Es sollen bei allen Footprint-Datensätzen, deren Bilddateiname ungültig 
sind, der Dateiname gelöscht werden.
Per SQL-Query kann man wohl kaum überprüfen, ob ein Datenbankeintrag 
einen Pfad zu einer existierenden Datei darstellt, oder nicht.
Wäre also ein Fall für PHP statt für SQL.

Oder:
Momentan ist es noch möglich, in einer Kategorie mehrere Unterkategorien 
mit dem selben Namen zu haben. Dies soll später verboten werden, da es 
z.B. für den Teile-Import notwendig ist, dass die Pfade zu Kategorien, 
Footprints usw. eindeutig sind.
Sobald dieses Update eingespielt wird, muss die Datenbank auf solche 
doppelten (gleichnamigen) Kategorien durchsucht werden. Sind solche 
doppelte Einträge vorhanden, wäre es am besten wenn die Updatefunktion 
z.B. gleich sein eigenes PopUp mitliefert, in dem alle doppelt 
vorkommenden Kategorien aufgelistet werden, mit der Möglichkeit die 
Kategorien gleich umzubenennen.

Solche Überprüfungen in die Systemdateien einzubauen ist, wie du schon 
selber geschrieben hast, ziemlich unschön und sollte vermieden werden.
Ist man beim Update so flexibel dass man sogar solche Sachen wie "Popups 
öffnen um Benutzereingaben zu erfassen" machen kann, wäre das sehr 
vorteilhaft und eine saubere Implementierung (alles ist da, wo es 
hingehört).

Übrigens wäre die von mir genannte updateinfo.inc eine normale PHP 
Datei, das ".inc" habe ich nur geschrieben weil ich diese Datei nicht 
als ganz normale PHP Datei betrachte, sondern als Include-Datei für die 
Systemdatei (z.B. update.php), die das Update durchführt :-) Vielleicht 
verwirrt es aber auch zu sehr und sie sollte doch besser in ".php" 
umbenannt werden xD

Udo Neist schrieb:
> Im schlechtesten Fall wäre das ganze System ohne Überprüfung und würde
> direkt den Code beim Updaten mit ausführen. Lässt man keinen Code zu, so
> muss der Angreifer die Scripte manipulieren. Hat man Checksummen wie
> sha1 und gibt die dem Updatesystem mit, so ist eine Hürde mehr drin. Man
> kann zu jedem Update-Archiv ein zweites anbieten, das Checksummen und
> ähnliches vorhält.

Also ich sehe da keinen Unterschied, ob man nun Code zulässt oder nicht. 
Schafft es ein Angreifer, ein Updatepaket zu manipulieren (bzw. zu 
fälschen), stehen ihm sowieso alle Tore offen und er kann machen was er 
will. Ich meine, einem Update kann nicht verboten werden, die 
Systemdateien zu überschreiben, sonst kann man damit schlecht ein Update 
durchführen ;-) Der Angreifer hat also sowieso die Möglichkeit, 
Systemdateien zu überschreiben, warum soll er sich dann nur die 
Updatedatei unter denn Nagel reissen, wenn er das ganze System 
manipulieren kann?

OK was man an meiner Version noch ändern könnte, wäre folgendes:
Die updateinfo.inc wird aufgeteilt in zwei Dateien. Eine davon ist nur 
eine Textdatei, die es nicht ermöglicht, Code auszuführen. In einer 
anderen Datei ist dann die eigentliche Updatefunktion, die es erlaubt 
PHP Code auszuführen.
Zuerst wird dann nur die Textdatei gelesen, die PHP-Datei wird noch gar 
nicht includet. Erst wenn die Angaben aus der Textdatei die Gültigkeit 
des Updates bestätigen (per Hash oder sowas), wird die PHP-Datei mit der 
Updatefunktion includet.

Udo Neist schrieb:
> Für uns
> Entwickler würde ich passende Scripte schreiben, die das Zusammenbauen
> (weitgehends) erledigen.

Daran dachte ich auch schon, das wäre natürlich für meine Updatevariante 
genau so gut möglich wie für deine.

Udo Neist schrieb:
> GPG wäre ja eine gute Lösung, aber PHP unterstützt es nicht direkt. Und
> sowas selbst zu Entwicklen ist overkill. sha1 für Checksummen (wird in
> einer anderen Datei gespeichert, die man auch noch downloaden muss) ist
> schon recht gut.

Was bringt es denn, wenn man die Checksumme noch separat herunterlädt? 
Wenn ein Angreifer ein Paket fälschen kann, kann er das doch auch mit 
einer Checksumme machen.

Udo Neist schrieb:
> Es heißt nicht umsonst im PHP-Umfeld: Drum prüfe, was du bekommst. In
> den wenigsten Teilen habe ich vernünftige Prüfungen der übergebenen
> Daten gesehen.

Viele solcher Überprüfungen müssen später gar nicht mehr in den PHP 
Dateien der einzelnen Seiten gemacht werden, da meine Klassen bei jeder 
Zuweisung von neuen Daten diese zuerst auf Gültigkeit überprüft. Diese 
Variante halte ich eh für sinnvoller, da dann die Überprüfung nur noch 
an einer zentralen Stelle (in der Klasse) überprüft werden müssen, und 
nicht in jeder einzelnen Datei, die diese Klasse verwendet.

Udo Neist schrieb:
> Desweiteren ist Part-DB ziemlich anfällig was SQL-Injections betrifft.
> Viele Variablen werden gar nicht auf den Typ geprüft. IDs sind entweder
> numerisch oder ein String. Fehlt eine Prüfung, kann aus einem harmlosen
> Select auch schnell mal ein Truncate oder Drop werden, denn ein
> Semikolon und ein Kommentarzeichen an der richtigen Stelle, schon wars
> das. Hier und da ein paar settype() reingeschrieben, noch ein paar
> Wertebereiche geprüft und die Daten möglichst noch escaped. Wobei man so
> oder so auf Prepared Statements setzen sollte.

Hast du schonmal meine Datenbankklasse angeschaut? Dort stelle ich ja 
die zwei Funktionen execute() und query() zur Verfügung für die 
Benutzung der Datenbank. ALLE Datenbankzugriffe von ganz Part-DB laufen 
schlussendlich über eine dieser beiden Funktionen. Und dort werden dann 
genau Prepared Statements verwendet. Voraussetzung ist natürlich, dass 
man diesen Funktionen die Parameter richtig übergibt, also den 
Query-String mit Fragezeichen als Platzhalter und dann die Variablen 
separat.
Ich denke damit ist die Gefahr einer SQL Injection ziemlich stark 
gesunken.

Udo Neist schrieb:
> Gute Nacht :-)

Ebenfalls :-)

P.S.
Versteh mich bitte nicht falsch: Ich zweifle nicht an der 
Funktionsfähigkeit oder Sicherheit deiner vorgeschlagenen 
Updatefunktion.
Nur habe ich das Gefühl, dass:
1. Irgendwann die Flexibilität deiner Methode nicht mehr ausreicht, und 
ab und zu extra für Updates umgebaut/erweitert werden muss
2. Es auch einfacher geht :-)

von Udo N. (weinbauer73)


Lesenswert?

Urban B. schrieb:
> OK hier mal ein Beispiel, das zwar keinen Sinn macht, technisch aber
> tatsächlich so ein Fall für eine PHP-Funktion statt einem SQL-Query ist:
> Es sollen bei allen Footprint-Datensätzen, deren Bilddateiname ungültig
> sind, der Dateiname gelöscht werden.
> Per SQL-Query kann man wohl kaum überprüfen, ob ein Datenbankeintrag
> einen Pfad zu einer existierenden Datei darstellt, oder nicht.
> Wäre also ein Fall für PHP statt für SQL.

Lässt sich in der entsprechenden Funktion dauerhaft einbauen. Somit ist 
es unabhängig von eventuell technischen Problemen auf dem Server. Könnte 
ja sein, das die Bilder auf einer anderen Partition liegen. Zudem könnte 
man die Datenbank per Admintool von "Leichen" befreien. Das ist 
sinnvoller als sowas per Update machen zu wollen.

Und der Datenbank macht das nichts, wenn sie ein paar unnütze Daten mehr 
drin hat :-) Ich glaube kaum, das Part-DB jemals TB von Daten verwalten 
wird.

> Oder:
> Momentan ist es noch möglich, in einer Kategorie mehrere Unterkategorien
> mit dem selben Namen zu haben. Dies soll später verboten werden, da es
> z.B. für den Teile-Import notwendig ist, dass die Pfade zu Kategorien,
> Footprints usw. eindeutig sind.
> Sobald dieses Update eingespielt wird, muss die Datenbank auf solche
> doppelten (gleichnamigen) Kategorien durchsucht werden. Sind solche
> doppelte Einträge vorhanden, wäre es am besten wenn die Updatefunktion
> z.B. gleich sein eigenes PopUp mitliefert, in dem alle doppelt
> vorkommenden Kategorien aufgelistet werden, mit der Möglichkeit die
> Kategorien gleich umzubenennen.

Geht per SQL-Script ebenso. Wenn man den SQL-Scripten im Update eine 
Flag für Rückgabewerte (show, question oder ähnliches) mitgibt, läuft 
das auch ohne Script. Wenn das nicht als SQL-Statement geht, dann als 
Stored Procedure :D

Zudem sollte man alle Vorkommnisse beim Updaten mitloggen und auch zum 
Ausdrucken anbieten. So kann der User entsprechende Meldungen per Hand 
beseitigen.

> Solche Überprüfungen in die Systemdateien einzubauen ist, wie du schon
> selber geschrieben hast, ziemlich unschön und sollte vermieden werden.
> Ist man beim Update so flexibel dass man sogar solche Sachen wie "Popups
> öffnen um Benutzereingaben zu erfassen" machen kann, wäre das sehr
> vorteilhaft und eine saubere Implementierung (alles ist da, wo es
> hingehört).

Ich meinte nicht die üblichen Tests auf fehlerhafte Eingaben oder 
unlogische Datensätze, sondern eher das typische Wartungsaufgaben wie 
ein Update nichts darin verloren haben. Das gehört in die Kategorie 
Admintools und sind Sonderaufgaben mit eigenen Scripten.

> Übrigens wäre die von mir genannte updateinfo.inc eine normale PHP
> Datei, das ".inc" habe ich nur geschrieben weil ich diese Datei nicht
> als ganz normale PHP Datei betrachte, sondern als Include-Datei für die
> Systemdatei (z.B. update.php), die das Update durchführt :-) Vielleicht
> verwirrt es aber auch zu sehr und sie sollte doch besser in ".php"
> umbenannt werden xD

Ich würde das gar nicht als PHP-Datei machen, sondern als Pseudo-Sprache 
definieren. Damit hast du wohl das größte Problem aus der Welt: ein 
Fehler im Updatescript und der User steht höchstwahrscheinlich mit einer 
unbenutzbaren Part-DB-Installation da. Und warum für jedes Update dann 
ein eigenes Script schreiben wollen? Zeitverschwendung! Alle wichtigen 
Funktionen in eine Update-Klasse und falls notwendig, wird diese dann 
ersetzt, bevor das eigentliche Update läuft. Stichwort: 
Stapelverarbeitung (Batch-Datei, Bash-Script etc. nur nicht so mächtig 
wie diese).

> Hast du schonmal meine Datenbankklasse angeschaut? Dort stelle ich ja
> die zwei Funktionen execute() und query() zur Verfügung für die
> Benutzung der Datenbank. ALLE Datenbankzugriffe von ganz Part-DB laufen
> schlussendlich über eine dieser beiden Funktionen. Und dort werden dann
> genau Prepared Statements verwendet. Voraussetzung ist natürlich, dass
> man diesen Funktionen die Parameter richtig übergibt, also den
> Query-String mit Fragezeichen als Platzhalter und dann die Variablen
> separat.
> Ich denke damit ist die Gefahr einer SQL Injection ziemlich stark
> gesunken.

Ich gehe erstmal von der offiziellen Version aus. Das die neue Version 
etliche Probleme schon jetzt beseitigt hat, das denke ich mir.

Nicht jede Überprüfung sollte zudem in eine Klassenfunktion ausgelagert 
werden. Funktionen sollten die übergebenen Daten auf Gültigkeit für 
ihren Scope prüfen. Das Hauptscript prüft, ob die Funktion überhaupt 
gebraucht wird. Welche Funktion kostet am wenigsten?

1) Wert -> Funktion -> Wert falsch -> Rückgabe Wert nicht verwertbar

2) Wert falsch -> Nächste Funktion


> P.S.
> Versteh mich bitte nicht falsch: Ich zweifle nicht an der
> Funktionsfähigkeit oder Sicherheit deiner vorgeschlagenen
> Updatefunktion.
> Nur habe ich das Gefühl, dass:
> 1. Irgendwann die Flexibilität deiner Methode nicht mehr ausreicht, und
> ab und zu extra für Updates umgebaut/erweitert werden muss
> 2. Es auch einfacher geht :-)

Jede Updatefunktion ist nie perfekt und muss immer wieder neu 
geschrieben werden. Aber warum jedesmal ein neues Script erstellen, wenn 
man eine Klasse mit den üblichen Funktionen bereits hat und diese 
vielleicht alle x Updates überarbeiten muss?

Aktuell wären folgende "Befehle" in der Updateklasse nötig (private 
Funktionen, wird vom Interpreter aufgerufen):
- copy
- delete
- mkdir
- rmdir
- chmod
- log
- unpack
- sync (Gleicht Datenbank mit Verzeichnis ab, z.B. Grafiken)
- sql

Diese Funktionen sind übergeordnete Funktionen und werden von update.php 
direkt aufgerufen:
- check_version (Prüft die installierte Version gegen dem Update)
- check_updates (Überprüft auf Updates)
- get_updates (Holt die Updates)
- parse (Der eigentliche Interpreter)

Sind halt zwei Positionen die wir hier einnehmen und beide haben in 
verschiedenen Fragestellungen wahrscheinlich ihren Vorteil. Wir müssten 
einfach mal jeder ein Beispielupdate erstellen und dann kann man 
schauen, was wir von welchem System übernehmen sollten.

Grüße
Udo

von Christian R. (holle)


Lesenswert?

Urban B. schrieb:
> Christian R. schrieb:
>> Zu den Updates:
>> Kann man es nicht so machen, dass man Zum einen immer aktuelle Pakete
>> bereit stellt und zu anderen (z.B. für diejenigen die eine langsame
>> Internetverbindung haben) eine Update-Funktion.
>
> Und warum soll eine Update-Funktion eine weniger schnelle
> Internetverbindung benötigen als wenn man es von Hand herunterlädt?
> Ich verstehe nicht richtig was du meinst...

Ich habe mich ungünstig ausgedrückt. Mit Pakete meinte ich eigentlich 
ein komplettes Archiv aller Dateien, also für jemanden der neu auf 
Part-DB stößt. So kann diese Person gleich die aktuellste Version 
herunterladen anstatt Version XXX welche dann gleich auf YYY geupdatet 
werden kann.
Bei automatischen Updates kommt es letztendlich aufs gleiche hinaus, 
aber aus eigener Erfahrung fühlt es sich besser an die "aktuellste 
Version" herunterladen zu können, statt eine "veraltete" die dann 
aktualisiert werden muss.


Udo Neist schrieb:
> Das ist entspricht in etwa meiner Vorstellung:
>
> - ein Listbefehl auf einen FTP oder einem lokalen Verzeichnis loslassen
> und alle Updatepakete ab eigener Version in ein Array aufnehmen
> - Update in der Reihenfolge bis zum letzten Version innerhalb der
> Majorversion vornehmen

Genau so meinte ich das.


Urban B. schrieb:
> Ausserdem, wozu sollen die neuen Dateien noch manuell herumkopiert
> werden? Das kann man doch direkt mit dem Entpacken eines Updatesarchiv
> erledigen, in nur einem einzigen Befehl.

Durch manuelles kopieren kann man die zu überschreibenden Dateien 
sichern um notfalls die Ursprungsversion wieder herzustellen falls doch 
mal irgendetwas nicht klappt.

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
> Urban B. schrieb:
>> OK hier mal ein Beispiel, das zwar keinen Sinn macht, technisch aber
>> tatsächlich so ein Fall für eine PHP-Funktion statt einem SQL-Query ist:
>> [...]
>
> Lässt sich in der entsprechenden Funktion dauerhaft einbauen.

Ja klar lässt sich das dauerhaft einbauen, aber:
- Wer sagt uns dass nachher nicht bei jedem 3. Update nochmal eine 
zusätzliche, spezielle Funktion gebraucht wird? In Version 3.x.x Platzt 
dann doch die Update-Klasse aus allen Nähnten, weil darin noch 20 
Funktionen für irgendwelche Updates rumliegen, die nur ein einziges Mal 
gebraucht wurden. Und nach jedem Update wieder die nicht mehr benötigten 
Funktionen aus der Update-Klasse zu löschen zeugt auch nicht grad von 
einem durchdachten System ;-)
- Wozu sollen Funktionen, die nur ein einziges Mal (beim Update) 
gebraucht werden, ins System integriert werden? Die haben dort nichts zu 
suchen, die wurden geschrieben um Version x.x.a auf x.x.b zu 
aktualisieren, also gehören sie zum Update x.x.b und nicht ins System.

> Somit ist
> es unabhängig von eventuell technischen Problemen auf dem Server. Könnte
> ja sein, das die Bilder auf einer anderen Partition liegen.

Was für technische Probleme auf dem Server? Meine Variante wäre sicher 
nicht fehleranfälliger als deine Variante. Da die Updatefunktion ja zum 
Ausführen includet werden muss, hat sie somit auch Zugriff auf den 
ganzen Rest von Part-DB (Einstellungen aus der config.php, 
Datenbankklasse, ...).
Dort, wo Part-DB die Bilder sucht, dort sucht sie auch meine 
Updatefunktion, egal ob das nun auf einer anderen Partition liegt oder 
nicht.

> Zudem könnte
> man die Datenbank per Admintool von "Leichen" befreien. Das ist
> sinnvoller als sowas per Update machen zu wollen.

Um sich von Leichen zu befreien, dazu soll natürlich ein Admintool 
vorhanden sein, das ist richtig. Das habe ich nämlich schon mit den 
Dateien vor, es soll möglich sein die Datenbank nach Dateien zu 
durchforsten die nicht (mehr) existieren.
Aber: Es gibt auch Funktionen, die wirklich nur ein einziges mal beim 
Update ausgeführt werden müssen, und nachher für den Benutzer nicht 
erreichbar sein sollen. Und genau für solche (und nur für solche) 
Funktionen wäre meine individuelle Updatefunktion gedacht.

>> Oder:
>> Momentan ist es noch möglich, in einer Kategorie mehrere Unterkategorien
>> mit dem selben Namen zu haben. Dies soll später verboten werden, da es
>> z.B. für den Teile-Import notwendig ist, dass die Pfade zu Kategorien,
>> Footprints usw. eindeutig sind.[...]
>
> Geht per SQL-Script ebenso. Wenn man den SQL-Scripten im Update eine
> Flag für Rückgabewerte (show, question oder ähnliches) mitgibt, läuft
> das auch ohne Script. Wenn das nicht als SQL-Statement geht, dann als
> Stored Procedure :D

Ja logisch geht es. Aber es muss extra wieder in die Updatefunktion 
eingebaut werden, das bläht die Updatefunktion immer stärker auf und 
wird unnötig kompliziert.
Das ist ja genau das, was ich dir versuche mitzuteilen :-) Natürlich 
kann man mit deiner Methode auch alles bewerkstelligen was zu 
bewerkstelligen ist. Aber es macht die Update-Klasse immer komplizierter 
wegen Features, die nur ein einziges Mal bei einem Update gebraucht 
wurden und nachher kein Mensch mehr braucht.
Ich bin einfach der Meinung: Updateroutinen sind von Update zu Update 
individuell und sollen daher immer mit dem jeweiligen Update 
mitgeliefert werden. Individuelle Updateroutinen gehören nicht ins 
System, und eine Allgemeine, flexible Updateroutine die ALLES machen 
kann, das die Updates jemals brauchen könnten, macht die Updateklasse 
viel zu aufwändig, zu kompliziert und daher evtl. auch noch 
fehleranfällig.

> Zudem sollte man alle Vorkommnisse beim Updaten mitloggen und auch zum
> Ausdrucken anbieten. So kann der User entsprechende Meldungen per Hand
> beseitigen.

Sowas könnte man natürlich auch in meiner Variante einbauen. Die 
Log-Funktion gehört dann natürlich ins System, da sie bei jedem Update 
gebraucht wird. In der Updatefunktion, die im Updatearchiv daherkommt, 
müsste dann z.B. nur noch ein Array mit den Meldungen gefüllt werden, so 
ähnlich wie in den case-Blöcken der momentanenen db_update.php.

> Ich meinte nicht die üblichen Tests auf fehlerhafte Eingaben oder
> unlogische Datensätze, sondern eher das typische Wartungsaufgaben wie
> ein Update nichts darin verloren haben. Das gehört in die Kategorie
> Admintools und sind Sonderaufgaben mit eigenen Scripten.

Ja, wie bereits oben erwähnt: Typische Wartungsarbeiten sollen natürlich 
ins System integriert werden. Individuelle Funktionen, die wirklich nur 
ein einziges Mal beim Update ausgeführt werden müssen, gehören da aber 
nicht rein, und das sind ja genau die, von denen ich die ganze Zeit 
spreche.

> Ich würde das gar nicht als PHP-Datei machen, sondern als Pseudo-Sprache
> definieren.

Dann wäre mein Ziel, es möglichst einfach, unkompliziert und flexibel zu 
gestalten, aber total verfehlt ;-)

> Damit hast du wohl das größte Problem aus der Welt: ein
> Fehler im Updatescript und der User steht höchstwahrscheinlich mit einer
> unbenutzbaren Part-DB-Installation da.

Dafür soll es ja dann eine Rollback-Funktion geben -> Problem gelöst.

> Und warum für jedes Update dann
> ein eigenes Script schreiben wollen? Zeitverschwendung!

Also für ein normales Update, bei dem nur Dateien überschrieben und 
SQL-Befehle ausgeführt werden, ist das Skript ziemlich kompakt (siehe 
"update_bsp2.php" im Anhang). Und die Grundstruktur kann man natürlich 
immer wieder übernehmen fürs nächste Update. Wenn man mal mehr machen 
möchte als nur SQL Befehle ausführen, könnte das z.B. etwa so aussehen 
wie in der "update.php" im Anhang.

> Ich gehe erstmal von der offiziellen Version aus. Das die neue Version
> etliche Probleme schon jetzt beseitigt hat, das denke ich mir.

Ach so, ja das stimmt zum Teil. Aber ich denke es wäre Zeitverschwendung 
wenn wir diese Version noch umbauen würden.

> Nicht jede Überprüfung sollte zudem in eine Klassenfunktion ausgelagert
> werden. Funktionen sollten die übergebenen Daten auf Gültigkeit für
> ihren Scope prüfen. Das Hauptscript prüft, ob die Funktion überhaupt
> gebraucht wird. Welche Funktion kostet am wenigsten?
>
> 1) Wert -> Funktion -> Wert falsch -> Rückgabe Wert nicht verwertbar
>
> 2) Wert falsch -> Nächste Funktion

Jup, das macht natürlich Sinn.

> Jede Updatefunktion ist nie perfekt und muss immer wieder neu
> geschrieben werden. Aber warum jedesmal ein neues Script erstellen, wenn
> man eine Klasse mit den üblichen Funktionen bereits hat und diese
> vielleicht alle x Updates überarbeiten muss?

Bei meiner Variante existiert natürlich auch eine Klasse die die Updates 
durchführt. Diese kümmert sich ums Backup vor dem Update, ums Rollback 
bei einem Fehler, verarbeitet die Logs usw. Das ist ja immer das selbe 
und gehört ganz klar ins System integriert.

> Sind halt zwei Positionen die wir hier einnehmen und beide haben in
> verschiedenen Fragestellungen wahrscheinlich ihren Vorteil. Wir müssten
> einfach mal jeder ein Beispielupdate erstellen und dann kann man
> schauen, was wir von welchem System übernehmen sollten.

Ja, das wäre nich schlecht. Momentan habe ich dazu aber nicht die Zeit. 
Allerdings habe ich mal so auf die schnelle ein Beispiel-Updatepaket 
erstellt, so wie ich mir das in etwa vorstelle. Ich denke, daran 
erkennst du viel mehr als wenn ich hier 500 Zeilen Text schreiben würde.

Kurze Beschreibung:
In einem Updatepaket gibt es immer diese Elemente:
- Datei "info.ini": Eine nicht ausführbare Datei, die alle wichtigen 
Informationen zum Update enthält
- Datei "update.php": Die Datei, die die notwendigen Updateschritte 
enthält. Allerdings ist hier nichts drin, was das Überschreiben der 
alten Systemdateien mit den neuen Dateien betrifft.
- Ordner "files/": Hier sind alle neuen Systemdateien enthalten (also 
alle, die sich seit der letzten Version geändert haben). Die 
Ordnerstruktur darin ist genau so wie es nachher auch sein muss.

Die Updatefunktion des Systems entpackt das Updatepaket erstmal nach 
updates/0.2.3/. Dann wird die info.ini ausgelesen und entschieden, ob 
dieses Update durchgeführt werden kann/darf.
Ist das Update in Ordnung, wird das Verzeichnis updates/0.2.3/files/ 
nach Dateien durchsucht. Von allen momentan installieren Systemdateien, 
die auch in diesem files/ Ordner enthalten sind, werden nun Backups 
angelegt. Auch von der Datenbank wird ein Update angelegt.

Dann kann das Update losgehen:
Die Update-Klasse kopiert einfach alle Dateien aus dem Ordner 
update/0.2.3/files/ ins Systemverzeichnis. Jetzt sind schonmal alle 
Dateien aktuell.
Dann wird noch die Datei update/0.2.3/update.ini includet und die darin 
enthaltene Funktion ausgeführt. Diese nimmt dann das Datenbankupdates 
oder sonst irgendwelche speziellen Updateroutinen vor.

Meldet diese Funktion Erfolg, ist das Update fertig. Meldet sie ein 
Fehler, wird direkt ein Rollback der alten Systemdateien und der 
Datenbank gemacht.

Christian R. schrieb:
> Ich habe mich ungünstig ausgedrückt. Mit Pakete meinte ich eigentlich
> ein komplettes Archiv aller Dateien, also für jemanden der neu auf
> Part-DB stößt. So kann diese Person gleich die aktuellste Version
> herunterladen anstatt Version XXX welche dann gleich auf YYY geupdatet
> werden kann.

Ah so meinst du das. Naja das weiss ich jetzt nicht ob wir bei jedem 
kleinsten Update extra noch ein vollständiges Paket schnüren. Inklusive 
Footprints wären das auch jedesmal wieder 100MB Daten.
Was ich mir aber vorstellen könnte, wären Sammelupdates. Also dass man 
sich zwar eine nicht ganz aktuelle Part-DB runterlädt, und dann noch ein 
Updatearchiv das alle Updates bis zur aktuellsten Version enthält. Das 
wären dann also im schlimmsten Fall zwei Pakete die man runterladen 
müsste.
Aber eigentlich ist es momentan noch unwichtig, wie wir das dann genau 
machen. Ich denke wir sind alle der Meinung, dass die Updatepakete für 
das automatische Update immer nur diejenigen Dateien enthalten, die sich 
seit der Vorversion geändert haben. Sammelupdates wären dann also ein 
Thema das überhaupt keinen Einfluss auf die Updateroutine hat, das würde 
alles ausserhalb von Part-DB geschehen.

Christian R. schrieb:
> Urban B. schrieb:
>> Ausserdem, wozu sollen die neuen Dateien noch manuell herumkopiert
>> werden? Das kann man doch direkt mit dem Entpacken eines Updatesarchiv
>> erledigen, in nur einem einzigen Befehl.
>
> Durch manuelles kopieren kann man die zu überschreibenden Dateien
> sichern um notfalls die Ursprungsversion wieder herzustellen falls doch
> mal irgendetwas nicht klappt.

Das kann man auch so machen wie ich es oben beschrieben habe. Die 
Updatefunktion des Systems merkt selbst, welche Dateien durch das Update 
überschrieben werden und welche nicht.

OK eine kleine Unschönheit gibt es da bei meiner Variante: Löscht man im 
Updateskript eine Datei, so wird sie vom System nicht gesichert weil sie 
sich nicht im files/ Ordner befindet. Dazu sind aber die Funktionen 
backup() und restore() in der update.php gedacht. Hier kann man die 
Backup- und die Restore-Funktion des Systems ergänzen mit 
individuellen Befehlen, die auf das jeweilige Update zugeschnitten sind. 
Die Update- und Restorefunktion des Systems wird aber natürlich trotzdem 
auch ausgeführt, so muss man sich wirklich nur noch ganz selten um ein 
paar wenigen Dateien kümmern, alles andere übernimmt das System völlig 
automatisch.

puuh das ist jetzt ganz schön viel Text geworden, sorry ;-)

von Gelöscht (kami89)


Angehängte Dateien:

Lesenswert?

Und hier noch den Anhang :-)

von Udo N. (weinbauer73)


Lesenswert?

Ich schlage einfach mal vor, dass wir beide unsere Updatevarianten am 
Beispiel des Updates von der offiziellen Version auf unser eigenen 
Branch vorstellen. Tests:

1) Update erfolgreich
2) Fehler beim Kopieren einer Datei und Behandlung dieses Fehlers
3) Datenbankupdate wird durchgeführt (einfach ein Update auf die Tabelle 
internal mit dem Einfügen und Ändern von Dummyvariablen)

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
> Ich schlage einfach mal vor, dass wir beide unsere Updatevarianten am
> Beispiel des Updates von der offiziellen Version auf unser eigenen
> Branch vorstellen. Tests:
>
> 1) Update erfolgreich
> 2) Fehler beim Kopieren einer Datei und Behandlung dieses Fehlers
> 3) Datenbankupdate wird durchgeführt (einfach ein Update auf die Tabelle
> internal mit dem Einfügen und Ändern von Dummyvariablen)

Können wir machen, muss aber noch mindestens 3 Wochen warten :-)

Sorry wenn ich langsam nerve^^ aber irgendwie konnte ich einfach noch 
kein richtiges Argument von dir lesen, das gegen meine Variante sprechen 
würde. Deshalb halte ich natürlich an meiner Variante fest :-)

Dass es weniger sicher ist, das glaube ich nicht. Speziell jetzt, wo das 
Update vor dem Includen der Updatedatei erstmal verifiziert wird.

Dass man übertrieben viel Code schreiben muss für ein Update finde ich 
auch nicht. Man kann ja die Funktionen execute() und query() aus der 
Datenbankklasse nutzen, dann wird das sehr kompakt. Natürlich ist es ein 
bisschen mehr als nur ein Array das man befüllt, darf es aber auch sein 
wenn man dadurch enorm viel flexibler ist.

Allerdings sehe ich zwei grosse Vorteile bei meiner Variante:
- Flexibilität (es kann später noch kommen was will, alles kein Problem)
- Saubere Strukturierung (Funktionen, die häufiger genutzt werden kommen 
ins System, Funktionen speziell auf ein Update angepasst kommen nur ins 
Updatepaket, sind also "Einweg-Skripte")

Speziell die Flexibilität finde ich wichtig. Es ist ziemlich nervig, 
ständig das eigene System umzubauen / zu erweitern nur weil man früher 
nicht an alle möglichen Konstellationen gedacht hat. Ich jedenfalls 
programmiere ein Progemm lieber nur einmal, und zwar so dass man es 
möglichst flexibel nutzen kann, dann gibts später auch viel weniger 
Anpassungen.

von Udo N. (weinbauer73)


Angehängte Dateien:

Lesenswert?

Mein Stand der Updatefunktion habe ich angehängt. Die Datei 
update_r1000.ups enthält die Updatebefehle und ist Bestandteil eines 
fiktiven Archivs part_db_r1000.zip, welches bereits in 
update/part_db_r1000 extrahiert wurde. Wie die Scriptdatei später heißen 
wird, das habe ich noch nicht festgelegt. Die Klasse ist ein 
Proof-Of-Concept und sollte, abgesehen von kleineren - teilweise schon 
bekannten - Fehlern, laufen. Einige Funktionen sind noch nicht benannt 
(z.B. für den Online-Krams) oder nur ohne Inhalt.

Prinzipielle Vorgehensweise (hier als Online-Update):
1
$update = new update;
2
...
3
$files = $update -> get_update_list();
4
foreach ($file in $files)
5
{
6
   $update -> get_update_file( $file ); // Holt das File
7
   if ( is_readable( $file ) $archiv = $update -> f_unpack( $file ); // Entpackt das file
8
   if ( is_readable( $archiv.'/update.ups' ) && $update->load_script( $archiv.'/update.ups' ) $update->parse_script(); // Parst das File
9
10
}

Die Funktion update->parse_script() interpretiert die zuvor mit 
update->load_script(DATEINAME) in einen Array eingelesene Datei. Jedes 
Element enthält Kommando, festgelegtes Trennzeichen (hier ein " :: ") 
und ein oder mehrere Optionen (mit Leerzeichen getrennt). Die 
Reihenfolge im Script entspricht auch der im Array und baut daher 
aufeinander auf. Das Schlüsselwort "critical :: false" sorgt dafür, die 
bis zum nächsten "critical :: true" vorhandenen Befehle ohne Rücksicht 
auf einen Fehler auszuführen. "critical :: true" dagegen bricht die 
Ausführung des Updates sofort ab. Ein Log wird (ist noch auf der 
ToDo-Liste) immer mitgeschrieben. Es können mit der log-Anweisung auch 
individuelle Texte eingefügt werden.

von Udo N. (weinbauer73)


Lesenswert?

Meine Update-Klasse funktioniert soweit schon. Noch sind nicht alle 
Befehle vorhanden, aber immerhin :-) Das Proof-Of-Concept konnte wegen 
etlichen (flüchtigen) Fehlern - war ja auch nicht wirklich zum Austesten 
gedacht - nicht laufen.

Zum System:

Das Script update.php von Part-DB lädt die update-Klasse, holt dann die 
Updates von einem Server (die Funktionen download_*() und check_script() 
sind hier nur Dummies), entpackt diese und parst die Datei dort 
enthaltene "update.ups".
1
require_once ('lib.php');
2
require_once ('class/update.php');
3
4
$update =& new update;
5
6
// downloading a list of updates from url and get some files
7
$update -> download_list( 'ftp://' );
8
$update -> download_file( 'part-db_up515.zip' );
9
10
// parse an update script
11
$update -> check_script(515);
12
$update -> load_script('update/update.ups');
13
$update -> parse_script();
14
if ( ! $update -> get_debug() ) $update -> show_report();

In dem Script "update.ups" werden die Befehle in der Reihenfolge von 
oben nach unten ausgeführt.
1
log :: update to revision xxx
2
copy :: authors.php
3
chmod :: authors.php 0755
4
#chmod :: update 0775
5
mkdir :: tmp 0775
6
rmdir :: tmp
7
critical :: false
8
sql :: part-db_update_rev12.sql
9
critical :: true
10
sql :: part-db_update_rev12.sql

Es sucht die notwendigen Dateien im Unterverzeichnis "files/". Die 
Dateistruktur entspricht dabei der von Part-DB selbst.
1
part-db/update # l *
2
-rw-r--r-- 1 xxx xxx 1234  4. Aug 20:43 part-db_update_rev12.zip
3
-rw-r--r-- 1 xxx xxx  170  9. Aug 22:36 update.sh
4
-rw-r--r-- 1 xxx xxx  228 12. Aug 16:58 update.ups
5
6
files:
7
insgesamt 68
8
drwxr-xr-x 2 xxx xxx   54 12. Aug 17:58 ./
9
drwxrwxr-x 4 xxx xxx   93 12. Aug 17:58 ../
10
-rw-r--r-- 1 xxx xxx 1831  4. Aug 14:40 authors.php
11
-rw-r--r-- 1 xxx xxx  255 12. Aug 14:26 part-db_update_rev12.sql

Schlägt ein Kommando fehl, so wird in Abhängigkeit des Status "critical" 
die Ausführung abgebrochen und ein Rollback veranlasst oder die 
Ausführung ausgeführt. Der Status "critical" ist standardmässig ein und 
lässt sich mit dem Befehl "critical :: (true|false)" beeinflussen.
1
loading update/update.ups...
2
executing log => update to revision xxx
3
executing copy => authors.php
4
 - backup authors.php
5
 - copying /update/files/authors.php to /authors.php
6
executing chmod => authors.php 0755
7
 - chmod /srv/www/htdocs/part-db/authors.php to 0755
8
executing mkdir => tmp 0775
9
 - mkdir "tmp/" with mode 0775
10
executing rmdir => tmp
11
executing critical => false
12
executing sql => part-db_update_rev12.sql
13
 - loading sql-script /srv/www/htdocs/part-db/update/files/part-db_update_rev12.sql...
14
 - execute sql-script part-db_update_rev12.sql...
15
executing critical => true
16
executing sql => part-db_update_rev12.sql
17
 - loading sql-script /srv/www/htdocs/part-db/update/files/part-db_update_rev12.sql...
18
 - execute sql-script part-db_update_rev12.sql...
19
20
executing of script: success
21
22
at least executing cleanup...
23
 - delete backup of file authors.php
24
25
report:
26
27
    comment: update to revision xxx
28
    backup authors.php: success
29
    copy file /update/files/authors.php to /authors.php: success
30
    chmod file "authors.php" to 0755: success
31
    mkdir tmp: success
32
    rmdir : success
33
    executing sql: INSERT INTO `part-db`.`internal` (`keyName`, `keyValue`) VALUES ('dbSubversion', '0')
34
    sql state: error => Duplicate entry 'dbSubversion' for key 'keyName'
35
    executing sql: INSERT INTO `part-db`.`internal` (`keyName`, `keyValue`) VALUES ('dbRevision', '0')
36
    sql state: error => Duplicate entry 'dbRevision' for key 'keyName'
37
    executing sql: UPDATE `part-db`.`internal` SET `keyValue` = '1' WHERE `keyName` = 'dbSubversion'
38
    sql state: ok
39
    executing sql: INSERT INTO `part-db`.`internal` (`keyName`, `keyValue`) VALUES ('dbSubversion', '0')
40
    sql state: error => Duplicate entry 'dbSubversion' for key 'keyName'
41
    stop executing sql-script!

In folgenden Report ist die Datei authors.php umbenannt in author.php 
und lässt sich daher nicht finden:
1
loading update/update.ups...
2
executing log => update to revision xxx
3
executing copy => authors.php
4
5
something getting wrong, stop executing script!
6
7
at least executing cleanup...
8
report:
9
10
    comment: update to revision xxx
11
    copy file /update/files/authors.php to /authors.php: failed -> file not found
12
    something getting wrong, stop executing script!

Damit lassen sich auch die Installation oder auch eine Reparatur von 
Part-DB bewerkstelligen. Einfach eine "install.ups" oder "repair.ups" 
erstellen, die entsprechende Anweisungen enthält. Dazu müsste noch ein 
Befehl "base :: PFAD" integriert werden, der relativ zum 
Installationspfad liegt, um z.B. wichtige SQL- oder Systemscripte finden 
zu können. Falls es dennoch notwendig werden sollte, spezielle 
PHP-Scripte aufrufen zu müssen (ich hab bisher noch keine Beispiele 
gelesen, für die man sowas braucht), so könnte man das hier auch noch 
einbauen. Die meisten Updates benötigen das nicht. Entpacken, kopieren 
von Dateien, Verzeichnisse erzeugen, Rechte wechseln, und Datenbank 
updaten sind praktisch allen Fällen die einzigen Funktionen beim Update 
und mit dieser Lösung schon abgedeckt.

Die Erstellung der UPS-Scripte lassen sich mit einem Batch-Script 
vereinfachen (z.B. svn diff auswerten und damit copy-Befehle erzeugen, 
wie ich schon weiter oben beschrieben hatte).

Im übrigen ist diese Klasse nicht auf Part-DB beschränkt und könnte auch 
in anderen Projekten ihren Dienst versehen :-)

von kirk d. (kirkdis)


Lesenswert?

also hab gerade mal versucht die neueste r512 version auf den ftp 
hochzuladen vorher ne kopie von der datenbank angelegt und aktuell hab 
geht es

hatte vorher nen fehler...


"Unknown column 'footprints.filename' in 'field list'

ein datenbankupate wurde so wie ich das gesehen habe nicht 
durchgeführt...

weiß einer rat?

aktuell habe ich noch die kategoriesturktur da aber keine artikel 
mehr..."

habe gerade manuell über konfiguration die datenbank geupdatet... 
scheint jetzt wieder alles zu gehen... werd morgen mal bisl rumtesten...


ein fehler steht aber noch an:

auf der Hauptseite steht oben unter part-db 0.2.1 SVN REV512:

Warning: shell_exec(): Cannot execute using backquotes in Safe Mode in 
/volume1/web/lager/lib.php on line 536 Warning: shell_exec(): Cannot 
execute using backquotes in Safe Mode in /volume1/web/lager/lib.php on 
line 536

wie bekomme ich das weg? ansich funktioniert alles die meldung hatte ich 
auch schon vorher bei der offiziellen part-db

von kirk d. (kirkdis)


Lesenswert?

hier nochmal ein Screenshot von der Hauptansicht der part-db mit der 
Fehlermeldung.

Footprints ausblenden geht soweit auch. allerdings ist die Spalte 
footprints in der Artikelauflistung noch vorhanden. Stört aber soweit 
gerade nicht.

DANKE!

von Udo N. (weinbauer73)


Lesenswert?

Ausschnitt aus dem SQL-Script zur Installation der Datenbankversion 12:
1
DROP TABLE IF EXISTS `footprints`;
2
CREATE TABLE IF NOT EXISTS `footprints` (
3
  `id` int(11) NOT NULL AUTO_INCREMENT,
4
  `name` mediumtext COLLATE utf8_unicode_ci NOT NULL,
5
  `filename` mediumtext COLLATE utf8_unicode_ci,
6
  `parentnode` int(11) NOT NULL DEFAULT '0',
7
  PRIMARY KEY (`id`)
8
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

shell_exec() ist auf vielen Servern im Inet gesperrt. Das Warning kann 
man mit einem @ vor shell_exec() abstellen.
1
    function get_svn_revision()
2
    {
3
        global $conf;
4
        
5
        if ( !$repo_version = @shell_exec( 'svnversion') )
6
        {
7
            if ( file_exists( '.svn/entries') )
8
            {
9
                $svn = File( '.svn/entries');
10
                $repo_version = $svn[ 3];
11
                unset($svn);
12
            }
13
        }
14
15
        return( $repo_version . $conf['version']['string'] );
16
    }

von Gelöscht (kami89)


Lesenswert?

kirk disen schrieb:
> also hab gerade mal versucht die neueste r512 version auf den ftp
> hochzuladen vorher ne kopie von der datenbank angelegt und aktuell hab
> geht es

r512 ist nicht die neuste Version, die neuste wäre r514. Welche davon 
hast du nun installiert?

kirk disen schrieb:
> Footprints ausblenden geht soweit auch. allerdings ist die Spalte
> footprints in der Artikelauflistung noch vorhanden. Stört aber soweit
> gerade nicht.

Aleo wenn das Footprint ausblenden geht, müsstest du r514 haben, denn 
vorher ging das noch nicht. Dann sollte aber auch die Footprint-Spalte 
nicht mehr angezeigt werden (bei mir funktioniert das).
Bist du dir ganz sicher dass das Installieren der neuen Version auch 
alles sauber funktioniert hat? Überschreib mal deine lib.php und 
showparts.php mit den neusten Versionen aus dem SVN:

https://part-db.googlecode.com/svn-history/r514/trunk/lib.php
https://part-db.googlecode.com/svn-history/r514/trunk/showparts.php

Falls dann das Problem behoben ist, scheint bei der Installation deiner 
Version etwas schief gelaufen zu sein (wobei da eigentlich gar nicht 
viel schief laufen kann...). Dann würde ich sicherheitshalber gleich 
nochmal das ganze System neu installieren.

Wenn das auch nicht geholfen hat, schreib einfach nochmal, dann müssen 
wir den Fehler genauer lokalisieren :-)

von Gelöscht (kami89)


Lesenswert?

@Udo

Hättest du vielleicht auch noch Zeit und Lust, mal mit dem universellen 
Dateiupload zu beginnen? :-)
Es würde mir sehr helfen wenn dieser bald mal existieren würde, da meine 
Klassen bereits auf das neue Dateiverwaltungs-System ausgerichtet sind, 
bei dem man allen möglichen Objekten (Teile, Footprints, Lieferanten, 
...) Dateien zuordnen kann.

Aber ist nur so eine Idee, kam mir einfach in den Sinn dass mir das sehr 
helfen würde. Ich will dich natürlich nicht hetzen :-)

Oder hast du mit Ajax auch zu wenig Erfahrung um einen hübschen solchen 
Dialog zu erstellen?
Vielleicht würden sich dazu ein paar Komponenten von dieser Seite 
anbieten:
http://dhtmlx.com/docs/products/dhtmlxTree/index.shtml

Schön wäre, wenn man den Upload-Dialog vielleicht ungefähr so verwenden 
könnte:
1
$dialog = new UploadDialog(/* ein paar Parameter */);
2
$filename = $dialog->open(); // Öffnet den Upload-Dialog (ein Popup) und gibt den Dateinamen der markierten Datei zurück

Ein paar Informationen wären hier noch aufgelistet:
https://code.google.com/p/part-db/issues/detail?id=14
Der letzte genannte Punkt (rekursive Eindeutigkeit der Dateinamen) wird 
aber vermutlich nicht nötig sein. Auch eine Abfrage, ob ein grosses Bild 
verkleinert werden soll wird es nicht brauchen wenn später sowieso mit 
Thumbnails gearbeitet wird.

mfg

von kirk d. (kirkdis)


Lesenswert?

Stimmt das Archiv dass ich installiert hatte war die 514. allerdings 
zeigt der mainscreen Rev 512 an. es war das archiv von urban b. das er 
hier gepostet hat.

also die footprint spalte ist z.b. in den Baugruppen noch vorhanden. 
Stört aber aktuell nicht weiter. falls die funktion später im konfig 
menü per checkbox an bzw abgewählt werden kann wäre das super...

habe auch nochmal die beiden files geupdatet. soweit funktioniert alles 
aktuell...

von Gelöscht (kami89)


Lesenswert?

kirk disen schrieb:
> Stimmt das Archiv dass ich installiert hatte war die 514. allerdings
> zeigt der mainscreen Rev 512 an. es war das archiv von urban b. das er
> hier gepostet hat.

Ups das ist vermutlich mein Fehler ;-) Ich hätte wohl erst noch ein "SVN 
checkout" machen sollen bevor ich das Paket geschnürt habe, damit dann 
auch die richtige Version angezeigt wird. Und eigentlich hätte ich 
gleich alls .svn Ordner löschen können, aber es ist mir gar nicht in den 
Sinn gekommen dass die vorhanden sind, da man sie ja nicht sieht (im 
Dateibrowser unter Linux sind alle Dateien/Ordner mit einem Punkt am 
Anfang unsichtbar).
Naja ist eigentlich aber nicht weiter schlimm. Aber jetzt weiss ich 
wenigstens welche Version du hast :-)

kirk disen schrieb:
> also die footprint spalte ist z.b. in den Baugruppen noch vorhanden.
> Stört aber aktuell nicht weiter. falls die funktion später im konfig
> menü per checkbox an bzw abgewählt werden kann wäre das super...

Ach so, bei den Baugruppen meinst du. Stimmt, das habe ich irgendwie 
vergessen. Hab gedacht ich hätte es dort auch eingebaut...
Ich habs noch schnell eingebaut, hier gibts die neuste Version der 
entsprechenden Datei:
https://part-db.googlecode.com/svn-history/r515/trunk/deviceinfo.php

von kirk d. (kirkdis)


Lesenswert?

was mir noch aufgefallen ist... wenn man mit paketen updatet kommt 
eigentlich nur das überschreiben der alten dateien in frage, da die 
ganzen artikelbilder im unterordner img liegen. hätte fast den fehler 
gemacht und alles gelöscht und auf die neue datenbank verlinkt in der 
config. die problematik die ich da aber sehe ist dass dabei wohlmöglich 
alte dateileichen die nicht mehr benötigt werden erhalten bleiben. ist 
in der updateroutine schon etwas eingebaut dass den ganzen dateistamm 
checkt während des updates und unnötige dateien löscht?

zu dem footprint ausblenden: wenn man über die suchfunktion teiel sucht 
taucht das footprint auch wieder als spalte rechts in der auflistung mit 
auf. direkt über die kategorien ist es aber schön ausgeblendet...

bin aktuell noch bei der r514...

von Gelöscht (kami89)


Lesenswert?

kirk disen schrieb:
> zu dem footprint ausblenden: wenn man über die suchfunktion teiel sucht
> taucht das footprint auch wieder als spalte rechts in der auflistung mit
> auf.

Ist jetzt auch behoben :-)
https://part-db.googlecode.com/svn-history/r516/trunk/nav.php
https://part-db.googlecode.com/svn-history/r516/trunk/search.php

kirk disen schrieb:
> was mir noch aufgefallen ist... wenn man mit paketen updatet kommt
> eigentlich nur das überschreiben der alten dateien in frage, da die
> ganzen artikelbilder im unterordner img liegen. hätte fast den fehler
> gemacht und alles gelöscht und auf die neue datenbank verlinkt in der
> config. die problematik die ich da aber sehe ist dass dabei wohlmöglich
> alte dateileichen die nicht mehr benötigt werden erhalten bleiben. ist
> in der updateroutine schon etwas eingebaut dass den ganzen dateistamm
> checkt während des updates und unnötige dateien löscht?

Ja, man soll einfach immer die alten Dateien mit den neuen 
überschreiben. Dass Dateileichen entfernt werden, ist momentan nicht 
möglich. Ausser du aktualisierst dein Verzeichnis direkt per SVN, dann 
sollten zumindest die Systemdateien, die nicht mehr gebraucht werden, 
gelöscht werden (meine ich zumindest).

Oder wenn man das ganze System löschen will, dann löscht man halt alles 
ausser dem img-Ordner. Sonst sollten sich ja nirgens vom Benutzer 
erstellte Dateien befinden (ausser die config.php noch).

Später soll das Löschen von Dateileichen natürlich die Updatefunktion 
des Systems übernehmen. Auch soll etwas mehr Ordnung eingeführt werden, 
was die selbst hochgeladenen Dateien betrifft. Für hochgeladene Dateien 
gibt es dann ein Verzeichnis "media/", in dem alle hochgeladenen Dateien 
landen (und nur in dem!). Also alles, was sich ausserhalb von media/ 
befindet gehört zum System und wird durch die Updatefunktion sauber 
gehalten. Und für alles was sich dann in media/ befindet, ist der 
Benutzer selbst verantwortlich (es könnte aber vom System eine Funktion 
geben, die nicht benutzte Dateien im media-Verzeichnis aufspürt und dem 
Benutzer das Aufräumen vereinfacht).

von Udo N. (weinbauer73)


Lesenswert?

Urban B. schrieb:
> Ja, man soll einfach immer die alten Dateien mit den neuen
> überschreiben. Dass Dateileichen entfernt werden, ist momentan nicht
> möglich. Ausser du aktualisierst dein Verzeichnis direkt per SVN, dann
> sollten zumindest die Systemdateien, die nicht mehr gebraucht werden,
> gelöscht werden (meine ich zumindest).

Im Prinzip hab ich das bei mir in meinem Update-System so vorgesehen. 
Entweder wird das schon im Update-Script (update.ups) durch ein delete 
gemacht (bevorzugt) oder cleanup() überprüft anhand einer aktuellen 
Dateiliste, welche Systemdateien vorhanden sein müssen. Die speziellen 
Listen bzw. die repair.ups würden bei Bedarf automatisch ersetzt und 
abgearbeitet.

> Oder wenn man das ganze System löschen will, dann löscht man halt alles
> ausser dem img-Ordner. Sonst sollten sich ja nirgens vom Benutzer
> erstellte Dateien befinden (ausser die config.php noch).

Da die config.php irgendwann nur noch die Zugangsdaten der Datenbank 
enthält, wäre die grundsätzlich beim Update nicht überschreibbar 
(Blacklist).

Urban B. schrieb:
> @Udo
>
> Hättest du vielleicht auch noch Zeit und Lust, mal mit dem universellen
> Dateiupload zu beginnen? :-)
> Es würde mir sehr helfen wenn dieser bald mal existieren würde, da meine
> Klassen bereits auf das neue Dateiverwaltungs-System ausgerichtet sind,
> bei dem man allen möglichen Objekten (Teile, Footprints, Lieferanten,
> ...) Dateien zuordnen kann.
>
> Aber ist nur so eine Idee, kam mir einfach in den Sinn dass mir das sehr
> helfen würde. Ich will dich natürlich nicht hetzen :-)
>
> Oder hast du mit Ajax auch zu wenig Erfahrung um einen hübschen solchen
> Dialog zu erstellen?

Ich habe meist das dojo-Framework genutzt. Nach meiner Kenntnis gibt es 
da kein Multiupload, den man direkt nutzen kann. Aber ein asynchroner 
Dateiupload hatte ich damit schon hinbekommen. Ich werde mich aber 
erstmal nicht damit beschäftigen, sonst werden Templates und meine 
Update-Klasse niemals fertig.

von Gelöscht (kami89)


Lesenswert?

Udo Neist schrieb:
> Ich habe meist das dojo-Framework genutzt. Nach meiner Kenntnis gibt es
> da kein Multiupload, den man direkt nutzen kann. Aber ein asynchroner
> Dateiupload hatte ich damit schon hinbekommen.

Hmm das dojo Framework sieht ja ziemlich cool aus. Ich würde es sehr 
begrüssen wenn irgendwann mal (in ferner Zukunft^^) ganz Part-DB mit so 
einem System (muss ja nicht dojo sein) realisiert wird. Dann hätte man 
eigentlich ein vollwertiges Programm, als wäre es eine lokale 
Installation. Also ich meine wegen den vielen neuen Möglichkeiten, die 
so ein Framework bieten. Konkret meine ich damit solche Sachen wie 
Drag&Drop, Kontextmenüs usw, die die Bedienung viel komfortabler 
gestalten. Aber momentan haben wir wichtigere Sachen zu tun :-)

Bezüglich Lizenz-Kram bin ich nicht gerade ein Profi. Ich habe mal 
Wikipedia etwas bemüht, und ich habe den Eindruck dass die von dojo 
angebotene BSD-Lizenz zu unserem Projekt passen würde oder? Die scheint 
sogar "noch freier" als GPL zu sein wenn ich das richtig verstanden 
habe?

Ich finde es halt einfach wichtig, dass wir keine Komponenten verwenden, 
die dann plötzlich lizenztechnische Einschränkungen für Part-DB 
darstellen könnte.

Ach ja, was meinst du genau mit Multiupload? Dass man mehrere Dateien 
gleichzeitig uploaden kann? :-)

> Ich werde mich aber
> erstmal nicht damit beschäftigen, sonst werden Templates und meine
> Update-Klasse niemals fertig.

Jop, das ist natürlich kein Problem :-)

von Udo N. (weinbauer73)


Lesenswert?

GPL und BSD kann man zusammen nutzen. Ist allerdings etwas umstritten, 
ob beide Lizenzen kompatibel sind. Ich meine ja. Vielleicht hier und da 
nicht perfekt, aber es geht ja (siehe die meisten Linux-Distris, die 
auch sehr viele Tools mit BSD-Lizenz nutzen).

von kirk d. (kirkdis)


Lesenswert?

bei der r514 fällt mir auf dass es in der Artikelauflistung nicht mehr 
möglich ist die Unterkategorien auszublenden. Das ging definitiv vorher 
mal. ist das Absicht oder gibt es ne andere Möglichkeit die 
Unterkategorien auszublenden?

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.