Schrift
[thread]11239[/thread]

Gruppierungsproblematik, wie lösen?

Leser: 1


<< >> 10 Einträge, 1 Seite
mandawar
 2008-02-04 12:51
#105536 #105536
User since
2005-11-09
26 Artikel
BenutzerIn
[default_avatar]
Hallo
ich soll im Moment ein kleines Programm entwerfen, was eine Textdatei mit Materialbeständen einliest und verarbeitet. Jeder Artikel in der datei hat eine Nummer und gehört in 3 Gruppen die hinter dem Artikel stehen. Eine Hauptgruppe, eine Subgruppe und eine SubSubGruppe (sozusagen).Dadurch sind die Artikel "beschrieben". Nun will mein Chef dass ich auf dieser Textdatei eine Art Web-Interface mache. Und zwar 3 Listboxen nebeneinander. In der ersten stehen alle Hauptgruppen. Klickt man eine davon an, sollen in der 2. Box alle Subgruppen dieser Hauptgruppe erscheinen. Klickt man da wieder eine Subgruppe an, sollen in der dritten Box alle SubSubgruppen erscheinen, die die angeklickte Subgruppe gemeinsam haben. Nun überlege ich wie ich das realisieren kann. Muss ich die txt in eine xml umformen, damit man das schön über die 3 Listboxen ausgeben kann, oder reicht es wenn ich eine Art JavaScript mache, das darauf reagiert wenn in der Liste eine Gruppe angeklickt wird und dann die nächste Listbox initiiert?
Mein Problem ist eben dass ich mit Web-Programmierung bisher nicht viel zu tun hatte. Also für ein paar Hinweise wär ich sehr dankbar :)
Liebe Grüße
Manda
renee
 2008-02-04 13:04
#105537 #105537
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du kannst das mit JavaScript lösen. Willst Du das als Ajax-Request realisieren? Dann schau Dir mal CPAN:CGI::Ajax an...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
mandawar
 2008-02-04 13:39
#105540 #105540
User since
2005-11-09
26 Artikel
BenutzerIn
[default_avatar]
Ich weis es ehrlich gesagt noch garnicht wie ich es realisieren kann, weil ich mit JavaScript noch weniger als mit HTML gearbeitet habe und mit Ajax gleich garnicht .
Wär nett wenn du mit ein paar Stichworte geben kannst was praktisch wäre für diese Aufgabe, zum anlesen halt.
Inwiefern wäre denn noch xml interessant für dieses Problem? Ist es da einfacher zu programmieren wie sich die Listen verhalten oder ist das im Endeffekt kein Unterschied ob ich mit Ajax die Text-Datei direkt oder die .xml Datei in die Listboxen verarbeite?
Liebe Grüße
Manda
renee
 2008-02-04 13:51
#105541 #105541
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Geschickt wäre es ungefähr so:

Code: (dl )
1
2
3
4
5
6
7
8
9
HTML-Formular
|
| bei Auswahl Ajax-Request an CGI-Skript
v
zweite Select-Box füllen
|
| bei Auswahl zweiter Select-Box Ajax-Request
v
...


Ein allererster Ansatz könnte sein
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/usr/bin/perl

use strict;
use warnings;
use CGI;
use CGI::Ajax;

my $file = 'article.txt';
my %hash = read_articles( $file );

my $cgi = CGI->new;

my $pjx = new CGI::Ajax( 
    'group_one'   => \&group_one,
    'group_two'   => \&group_two,
    'group_three' => \&group_three,
);
print $pjx->build_html( $cgi, \&Show_HTML);

sub group_one{
   # gib Select-Box mit Hauptgruppe zurück
}

sub group_two{
   # gib Select-Box mit Subgruppe in Abhängigkeit von Hauptgruppe zurück
}

sub group_three{
   #...
}

sub read_articles{
   my %hash;
   if( open my $fh, '<', shift ){
      while( my $line = <$fh> ){
         chomp $line;
         my ($art,$g1,$g2,$g3) = split / /, $line;
         push @{ $hash{$g1}->{$g2}->{$g3} }, $art;
      }
   }

   return %hash;
}


Schau Dir mal die Doku zu CPAN:CGI::Ajax an.

Da erst noch was in XML umzuwandeln halte ich für zu umständlich (aber vielleicht hat da jemand anderes eine Idee zu).
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
mandawar
 2008-02-05 09:39
#105567 #105567
User since
2005-11-09
26 Artikel
BenutzerIn
[default_avatar]
Guten Morgen allerseits :)

ich hab gerade noch mal mit el Cheffe geredet und er meinte einen WebServer aufsetzen hatte er eigentlich nicht vor. Deswegen muss es nun wahrscheinlich so gehandhabt werden, dass die ganze WebSeiten-Sache von JavaScript gehandhabt werden muss. Ist es für JavaScript einfacher, hinsichtlich dieser Problematik, sich mit .xml-Dateien auseinanderzusetzen, weil da die Daten ja schon eine gewisse Struktur haben, oder macht das auch bei JS keinen Unterschied ob nun nur eine txt-Datei vorliegt?
Liebe Grüße
Manda
murphy
 2008-02-05 16:14
#105587 #105587
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
mandawar+2008-02-05 08:39:51--
[...] ich hab gerade noch mal mit el Cheffe geredet und er meinte einen WebServer aufsetzen hatte er eigentlich nicht vor. [...]


Hmm, es ist natürlich möglich, mit einem Perlskript Deine Daten in eine statische HTML-Seite zu konvertieren. Diese Seite kann dann aber nicht viel mehr machen, als die Daten anzuzeigen.

Es ist auch möglich, gar kein Perl zu benutzen und eine HTML-Seite mit eingebettetem JavaScript derart zu basteln, dass das JavaScript direkt die Datendatei auseinandernimmt und in der Webseite anzeigt. Auch hier kann man aber lediglich Daten anzeigen und nichts verändern.

Egal ob Du die Daten mit Perl verarbeitest und daraus direkt Quellcode für JavaScript-Objekte erzeugst, oder ob Du die Daten mit JavaScript lädst und verarbeitest, macht es nur dann wirklich Sinn, XML als Austauschformat zu verwenden, wenn die Datenstruktur hierarchisch und / oder unregelmäßig ist. In Deinem Beispiel wird das also eher nicht notwendig sein.

Es stellt sich aber die Frage, was Dein Programm denn im Endeffekt tun soll. Wenn Du an den Daten irgendwann mal etwas verändern willst, brauchst Du entweder eine richtige Webanwendung mit Webserver oder eine GUI-Anwendung.
When C++ is your hammer, every problem looks like your thumb.
mandawar
 2008-02-05 16:33
#105589 #105589
User since
2005-11-09
26 Artikel
BenutzerIn
[default_avatar]
Naja daran verändert werden soll ja nichts. Es geht lediglich darum, dass sich die Arbeiter die Artikelnummern für die Artikel, die neu bestellt werden müssen selbstständig aus dem Katalog heraussuchen können und die direkt weitergeben können. Es reicht also wenn der Artikelkatalog angezeigt wird, und Daten müssen an sich nicht verändert werden.
Ronnie
 2008-02-05 17:48
#105592 #105592
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
mandawar+2008-02-05 08:39:51--
ich hab gerade noch mal mit el Cheffe geredet und er meinte einen WebServer aufsetzen hatte er eigentlich nicht vor.

Excel?!
murphy
 2008-02-05 18:14
#105594 #105594
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
mandawar+2008-02-05 15:33:17--
[...]
Es reicht also wenn der Artikelkatalog angezeigt wird, und Daten müssen an sich nicht verändert werden.


Beispiel wie man es machen könnte:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
use 5.008;
use strict;
use warnings;

use IO::Handle;
use Text::CSV;
use JSON;

# A nested hash of groups
my %hierarchy;

# Parse the CSV input data into %hierarchy
{
    my $csv = new Text::CSV();

    while (my $fields = $csv->getline(\*DATA)) {
        my ($article, @groups) = @$fields;
        
        my $anchor = \%hierarchy;
        foreach (@groups) {
            $anchor->{$_}->{__name__} = $_;
            $anchor = $anchor->{$_}
        }

        push @{$anchor->{__articles__}}, $article;
    }

    die sprintf("Error parsing CSV input: %s\n", $csv->error_diag())
        unless ($csv->eof());
}

# Convert the hierarchy data into JS format
my $hierarchy_json = do {
    my $json = new JSON();
    $json->utf8(1)->pretty(1);

    $json->encode(\%hierarchy);
};

# Print the HTML page
print <<EOD
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>Article Catalog</title>
  <script type="text/javascript"><![CDATA[
    /* Group hierarchy generated by Perl script */
    var hierarchy = $hierarchy_json;

    /* Group listboxes */
    var group0;
    var group1;
    var group2;

    /* Articles list */
    var articles;

    /* Function to fill a group selection box */
    function fillInGroups(group, data) {
      while (group.options.length > 0)
        group.options[group.options.length - 1] = null;

      for (var name in data)
        if (!name.match(/^__/))
          group.options[group.options.length] =
            new Option(name, name, true, false);

      group.data = data;
    }

    /* Function to fill a groups selection box according to its
     * parent group selection */
    function fillInSubgroups(group, parent) {
      fillInGroups(group, parent.data[parent.value])
    }

    /* Function to fill in the article data according to the group
     * selection */
    function fillInArticles(group) {
      while (articles.firstChild != null)
        articles.removeChild(articles.firstChild);

      for each (var article in group.data[group.value].__articles__) {
        var text = document.createTextNode(article);
        var item = document.createElement("li");
        item.appendChild(text);
        articles.appendChild(item);
      }
    }

    /* Initialization when the page has been loaded */
    function init() {
      group0 = document.getElementById("group0");
      group1 = document.getElementById("group1");
      group2 = document.getElementById("group2");

      articles = document.getElementById("articles");

      fillInGroups(group0, hierarchy);
    }
  ]]></script>
</head>
<body onload="init()">
  <h1>Article Catalog</h1>

  <h2>Group Selection</h2>
  <form action="javascript:alert('This%20is%20just%20a%20widget%20container!')">
    <select id="group0" size="1" onchange="fillInSubgroups(group1, group0)"/>
    <select id="group1" size="1" onchange="fillInSubgroups(group2, group1)"/>
    <select id="group2" size="1" onchange="fillInArticles(group2)"/>
  </form>

  <h2>Articles</h2>
  <ul id="articles"/>
</body>
</html>
EOD

__DATA__
42,Rhabarber,Quark,Quatsch
55,Rhabarber,Blubb,Schmarrn
27,Rhabarber,Quark,Stuss
38,Bananenbrei,Unfug,Kaese
67,Bananenbrei,Unsinn,Irgendwas


Wenn der Browser auf dem es laufen soll keinen ganz aktuellen JavaScript-Interpreter hat, muss man eventuell
Code: (dl )
for each (var article in group.data[group.value].__articles__) {

durch etwas wie
Code: (dl )
1
2
3
var array = group.data[group.value].__articles__;
for (var index in array) {
var article = array[index];

ersetzen.
When C++ is your hammer, every problem looks like your thumb.
mandawar
 2008-02-06 10:58
#105616 #105616
User since
2005-11-09
26 Artikel
BenutzerIn
[default_avatar]
cool, danke
ich denke das hilft mir schon ein ganzes Stück weiter :)
<< >> 10 Einträge, 1 Seite



View all threads created 2008-02-04 12:51.