Schrift
[thread]121[/thread]

Drop down aus DB einlesen und zuordnen!?: Brauche Hilfe bei Syntax-Anpassung



<< >> 9 Einträge, 1 Seite
Lena85
 2003-12-23 02:20
#594 #594
User since
2003-12-23
9 Artikel
BenutzerIn
[default_avatar]
Ich habe folgendes Problem mit dem Syntax und kommen nicht weiter:
Zur Erkärung :
aus einer kleinen DB sollen die <select-Kriterien> für dropdown-Felder eingelesen werden.
Für eine Dropdown-Auswahl habe ich das (mit Hilfe) hinbekommen:
Mein Syntax:
aus der CGI
.....
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
sub subSelect() {my $data = $dict->{DB}->get("SELECT pos,id,awk FROM awk");

foreach( @{$data} ) {my $line ={id=>$_->{id}, awk=>$_->{awk}};
             $line->{ifSelected } = 1 if (defined($dict->{id}) and $_->{id} == $dict->{id});
push(@{$dict->{loopSelect}}, $line);
}
if (defined($dict->{id}) and $dict->{id} ne "") {
my $data = $dict->{DB}->get("SELECT awk FROM awk WHERE id=$dict->{id}");
while (my ($k, $v) = each(%{@{$data}[0]})) { $dict->{$k} = $v; }
}
return(1);
}

Für die template:
.......
Code: (dl )
1
2
3
4
5
<select name="id" onchange="go('select');" width="90" style="width:90;">
<option value=""></option>
<tmpl_loop loopSelect>
<option value="<tmpl_var id>" <tmpl_if ifSelected>selected="selected"</tmpl_if>><tmpl_var awk></option></tmpl_loop>
</select>

Die dazugehörige DB:
id    awk  (soll für a_US_w_AHL_k_RITERIUM stehen)
1    Inhalt1
2    Inhalt2
3    Inhalt3
usw.
Nun möchte ich 5 und mehr Dropdownfelder in die html (template) einbauen und habe mir folgende DB
ausgedacht :
Neue DB:
dropFeld  id  awk
1           1  Text1
1           2  Text2  für das 1. Dropdownfeld
2           1  Text3
2           2  Text4 für das 2. Dropdownfeld
3           1  Text 5
3           2  Text 6 für das 3. Dropdownfeld

Hat jemand eine Idee wie ich die CGI und die Template anpassen kann??

Vielen Dank
Lena
Code: (dl )
Strat
 2003-12-23 02:51
#595 #595
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
ich bin mir nicht sicher, ob ich dich richtig verstehe... du willst die ungeraden zeilen aus der datenbank auslesen (funktioniert) und die geraden zeilen des templates im template ausfuellen? wenn die geraden zeilen immer gleich sind:
[html]
<TMPL_LOOP loopSelect>
 <option value="<TMPL_VAR NAME=ID>"
   <TMPL_IF NAME=FSELECTED>selected="selected"</TMPL_IF>>
   <TMPL_VAR NAME=AWK ESCAPE=HTML>
 </option>
 <option value="irgendwas">irgendwas statisches</option>
</TMPL_LOOP>
[/html]
wenn jedoch das irgendwas auch noch dynamisch ist, kannst du im Template selbst hoechstens noch mit vielen <TMPL_IF...>'s arbeiten, und viele parameter setzen...

Ist es moeglich, die Arrayreferenz, die du $template->param("LOOPSELECT" => \@arrayRef) uebergibst, vorher noch zu bearbeiten?

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
my @array = ();
foreach my $i (0..$#$arrayRef) { # iteriere ueber den Index der Listenreferenz
 push (@array, $arrayRef->[$i]);

 # jetzt eine Hashreferen der neuen Zeile erzeugen:
 my $hashRef = {
   id => $i+1,
   ifselected => 0,
   awk => "2 Text ". (($i+1)*2) . " fuer das " . ($i+1) . ". Dropdownfeld",
 };
 push (@array, $hashRef); # und auch zu @array hinzufuegen
} # foreach

# @array als templateparameter uebergeben
$template->param(loopSelect => \@array);

Nebenbei: wenn du einem TMPL_VAR noch die Option ESCAPE=HTML mitgibst, werden da automatisch HTML-Sonderzeichen escaped, und du brauchst es nicht manuell (z.B. mit $cgi->escapeHTML($value) ) zu machen...\n\n

<!--EDIT|Strat|1072140809-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Lena85
 2003-12-23 13:06
#596 #596
User since
2003-12-23
9 Artikel
BenutzerIn
[default_avatar]
Hallo,
erst einmal vielen Dank für die prompte Antwort. Das wird für mich ein "perliges" Fest ;)
Um mein Syntax-Problem klarer zu machen :
In meinem Datenbeispiel habe ich 3 verschiedene Droddon-Felder aufgeführt. Die Variable dazu ist die "dropdown " aus der Datei-->
1
1 für das 1. Feld
2
2 für das 2. Feld
usw.
Die id soll für die Nummer der Selektauswahl stehen, awk-Kriterium für den Selekt-Text.
In meinem angeführten Beispiel hatte ich zunächst in der Datenbank nur die id und awk für exakt ein Dropdown-Feld.
Ich habe dann die Datenbank um den Posten "dropdown" als Zeiger für das jeweilige Feld erweitert und möchte nun mehrere Felder in die Template einbauen mit in der Datenbank hinterlegten Selektkriterien+Text
Lena
Lena85
 2003-12-23 13:09
#597 #597
User since
2003-12-23
9 Artikel
BenutzerIn
[default_avatar]
Zusatz : Ich kann die CGI und template beliebig erweitern!!
Strat
 2003-12-23 18:59
#598 #598
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
du moechtest mehrere <select>'s haben, und dort die auswahlkriterien abhaengig davon machen, was in der db-spalte dropdown steht?
Code: (dl )
1
2
3
4
5
6
7
<TMPL_LOOP NAME=SELECTS>
 <TMPL_LOOP NAME=SUBSELECTS>
   <select name="bla">
     <option value="<TMPL_VAR NAME=ID>"><TMPL_VAR NAME=AWK></select>
   </select>
 </TMPL_LOOP>
</TMPL_LOOP>

Dann brauchst du folgende Datenstruktur:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$data = [
 { # select 1
   subselects => [ # daten1
     { id => 1, awk => 'irgendwas' },
     { id => 2, awk => 'irgendwas' },
     { id => 3, awk => 'irgendwas' },
   ],
 },
 { # select 2
   subselects => [ # daten2
     { id => 1, awk => 'irgendwas' },
     { id => 2, awk => 'irgendwas' },
     { id => 3, awk => 'irgendwas' },
   ],
 },
];

also fuer jedes TMPL_LOOP eine Arrayreferenz, und diese Arrayreferenz muss Hashreferenzen haben. wenn der Wert einer Hashreferenz jedoch mit einer TMPL_LOOP subselects bearbeitet werden soll, muss der Wert von subselects eine Arrayreferenz sein, die fuer jede auswahlmoeglichkeit einen Hashreferenz { id => ..., awk => ... } hat.

war das jetzt irgendwie verstaendlich?\n\n

<!--EDIT|Strat|1072198800-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Lena85
 2003-12-23 21:51
#599 #599
User since
2003-12-23
9 Artikel
BenutzerIn
[default_avatar]
Hallo Strat,
ich glaube, ich rede an Dir vorbei:(
Also, ich möchte (eigentlich muss für ein Praktikum) in einer html-template ca. 10 dropdownfelder einbauen und die Select-id und den Text für die id aus einer kleinen SQL-datei ziehen wg. der besserern Pflegbarkeit.
Das funktioniert in meinem geposteten 1. Beispiel sehr gut für exakt ein Feld.
Dann habe ich die SQL um ein Datensatz "dropdown" erweitert und wollte mit dieser Zahl das dazugehörige dropdown-Formular kennzeichnen.
Die SQL nochmal
Dropdown(feldnr) ID    awk
1                       1     Uwe
1                       2     Klaus
1                       3     Otto -> Datensatz für das 1. DropDown

2                       1      Bärbel
2                       2      Gerd
2                       3      USW: -> Datensatz für das 2. Dropdown etc.

Ich kann mir die Datensätze schon mit z.B. Komodo anzeigen lassen.
Weiß aber nicht, wie ich dropdown 1=1=1 als ein Feld behandeln muss und über
<tmpl_loop loopSelect (VON1 wg.Dropdown aus SQL 1=1=1)>  definieren muss??
Das nächste Dropdown müste ja als
<tmpl_loop loopSelect (VON2 wg.Dropdown aus SQL 2=2=2)>  definiert werden usw.
Hast Du eine Idee, wie ich die Schleifen für die Definition in der CGI schreiben kann?
Tschuldige, bin noch Perl-Anfängererin und dazu blond     :blush:
Ansonsten liebe Weihnachtsgrüsse an Dich
Lena
Strat
 2003-12-23 23:47
#600 #600
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Blond bin ich selbst, und da will ich auch nichts dagegen tun. gegen das Perl-Anfaenger kann man aber was tun. Auf meiner Homepage unter http://www.fabiani.net/ habe ich unter Tips&Tricks eine Einfuehrung in Perl gestellt (als pdf), die ich gerne fuer Perl-Einfuehrungskurse (so 3-4 Tage) verwende.

du hast eine datenbanktabelle, die folgendermaszen aussieht:
dropdown | id | awk
in "dropdown" steht drinnen, in welches selectfeld "id" und "awk" reinkommen?

die anzahl der select's ist variabel und nur abhaengig von den werten in dropdown?

in was fuer einer Art von Datenbank liegen die Daten? und mit welchem Perl-Modul liest du sie aus?
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Lena85
 2003-12-24 00:05
#601 #601
User since
2003-12-23
9 Artikel
BenutzerIn
[default_avatar]
Jaaa, genau so soll es sein!!:)
Die Datenbank lese ich mit ODBC aus. Zur Zeit habe ich eine einfach AccessDB. Später,
wenn das Praktikumsprojekt fertig ist, soll eine MSSql verwendet werden.
Dann habe ich noch HTML:Template installiert. Das läuft auch so weit.
Mit Komodo kann ich auch die Variablen lesen. In ( @{$data} finde ich für
->[0]
    {akw}  Uwe
    {id} 1
    {dropdown} 1
u.s.w
Nur sehe ich im Augenblick den Wald vor lauter Weihnachtsbäumen nicht mehr.
Hast Du denn eine Idee??
Lena
Strat
 2003-12-24 01:16
#602 #602
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
super; dann koennte der Code in etwa folgendermaszen lauten:
Code: (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
#! /usr/bin/perl
use warnings;
use strict;
use DBI;
use CGI;
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);

my $dsn = "....""
my ($user, $password) = ('user', 'password');

my $cgi = CGI->new();

my $dbh = DBI->connect("dbi::ODBC:$dsn", $user, password);
unless ($dbh) {
die "Error in connect: ", $DBI->errstr, "\n";
} # unless

my $statement = qq~SELECT dropdown, id, akw, isselected FROM tabellenname
ORDER BY dropdown, id~;

my $sth = $dbh->prepare($statement);
unless ($sth) {
die "Error in preparing SQL: ", $dbh->errstr, "\n";
} # unless

$sth->execute() or die "Error in executing SQL: ", $dbh->errstr, "\n";

my @selects = ();
my $lastDropdown = '':
while (my $line = $sth->fetchrow_hashref()) {
my $dropdown = $line->{dropdown};
delete($line->{dropdown};

# in die unterliste hinzufuegen, wenn diese dropdown schon
# mal vorkam
if ($dropdown eq $lastDropDown) {
push (@{ $selects[-1]->{subselect} }, $line);
} # if

# sonst naechstes select (fuege neues element der hauptliste hinzu
else {
push (@selects, { subselect => [ $line ], dropdown => $dropdown } );
} # else
} # while
$sth->finish();

# neues template erzeugen
my $template = HTML::Template->new(
filename => '.....',

# cached die templates => schneller, aber nicht notwendig
shared_cache => 1,
)
or die "Error: couldn't read new Template: $!\n";

# template fuellen
$template->param(SELECT => $selects);
# eventuell weitere parameter ...

# html-header ausgeben
print $cgi->header(-type => 'text/html');
print $template->output();

Habe den Code nicht getestet, aber so ungefaehr koennte er funktionieren. Bei CGI solltest du jedoch vielleicht das Programm mit die(...) beenden, sondern vielleicht zu einer Fehlerseite umleiten...


Das Template dazu:
[html]
....
<!-- TMPL_UNLESS NAME=SELECT -->
<!-- TMPL_LOOP NAME=SELECT -->

<select name="<!-- TMPL_VAR NAME=DROPDOWN -->">
<!-- TMPL_LOOP NAME=SUBSELECT -->
<option value="<!-- TMPL_VAR NAME=ID ESCAPE=HTML -->" <!--TMPL_IF NAME=ISSELECTED -->selected="selected"</TMPL_IF>>
<TMPL_VAR NAME=AKW ESCAPE=HTML -->
</option>
<!-- /TMPL_LOOP -->
</select>

<!-- /TMPL_LOOP -->
<!-- TMPL_ELSE -->
<p>Keine Daten vorhanden</p>
<!-- /TMPL_UNLESS -->
...
[/html]

Dir auch frohe Weihnachten
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 9 Einträge, 1 Seite



View all threads created 2003-12-23 02:20.