Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]723[/thread]

Lösch Button

Leser: 1


<< |< 1 2 3 4 ... 7 >| >> 61 Einträge, 7 Seiten
haijp
 2006-05-09 12:24
#7488 #7488
User since
2006-04-11
14 Artikel
BenutzerIn
[default_avatar]
Hiho da bin ich mal wieder mit meiner "LinkIt" seite :P und zwar wollte ich jetzt das der vor jedem Link einen Löschbutton mit ausgibt und natürlich beim klicken also onlick den dahinter stehen Link löscht also in dem File wo er sie vorher reingeschrieben hat natürlich auch und auf der seite nach aktualisierung. Find halt nur überall so buttons zum resetten des Formulars aber wie man das antsellt was ich will keinen plan bitte um hilfe mit erklärung dann würde ich euch knutschen damit ich den code auch verstehe ^^

Das programm bis jetzt...

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
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
#!/usr/bin/perl

use strict;        
use warnings;          
use CGI qw( :all );    
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);         

# Initialisierung
##################

my $cgi         = new CGI;              
my %params      = $cgi->Vars();            
my $file         = '/SAN/content/cgi-bin/links';    
my $save_error   = "";             
my $i = 0;               
my $k = 0;                   

# Link speichern
#################

if ( defined $params{write} && $params{write} eq "true" ) { #
  $params{text} =~ s/\r\n/<br>/sg;

  if (! -f $file ) {
     &create_linklist;
  }
  else {
     if ( $params{url} =~ /^http:\/\/.*$/ ) {
        open ( D, '>>', $file ) or die "Could not save data. $!";
        print D "#" x80, "\nLINK: $params{url}\nTEXT: $params{text}\n";
        close D;
     }
     else {
        $save_error  = "<p>Bitte geben Sie den kompletten URL an, sonst kann ";
        $save_error .= "Ihr Link nicht gespeichert werden.<br /> Beispiel: ";
        $save_error .= "http://ihr.neuer.link.com/</p>";
     }
  }
}

# Links laden
##############

my ( @data, @links, @texts );

if (! -f $file ) {
  &create_linklist;
}
else {
  open ( F, '<', $file ) || die "Could not open $file. $!";
  @data = grep { /^[^#]/ } <F>;
close F;
  $i = $k = 0;
  foreach ( @data ) {
       chomp ( $_ );
       if ( $_ =~ /^LINK:\s/ ) {
               $_ =~ s/^LINK:\s//;
               $links[$i] = $_;
               $i++;
       }
       else {
               $_ =~ s/^TEXT:\s//;
               $texts[$k] = $_;
               $k++;
       }
  }
}

# Dokument ausgeben
####################

my $author = "Andre Hornig";

print $cgi->header(),
$cgi->start_html(
  -title   => "Linkit - Eine kleine Favoritenliste.",
  -bgcolor => "#99ccff",
  'Linkit'
),
$cgi->h1('Linkit'),
$cgi->p({-style => 'color:red'}, "Verfasst von: ", $cgi->i($author)),
$cgi->hr({-noshade => undef, -size => '1'}),

$cgi->p('Eine kleine Favoritenliste');

$i = 0;
foreach ( @links ) {
  print $cgi->p(
                       {-style => "margin:5px;"}, $i+1, ") ", $cgi->a( {-href => $_}, $texts[$i] )
               );
  $i++;
}

print << "EOF";
<h1>Neuen Link eintragen</h1>
$save_error
<form action="" method="post">
  <p>
     Link:<br />
     <input type="text" name="url" size="40" maxlength="40" />
  </p>
  <p>
     Beschreibung:<br />
     <textarea rows="5" cols="50" name="text"></textarea>
     <input type=hidden name="write" value="true" />
  </p>
  <p><input type="submit" value="Absenden" /></p>
</form>
EOF

$cgi->end_html();
\n\n

<!--EDIT|haijp|1147163237-->
Antworten mit Zitat
renee
 2006-05-09 12:39
#7489 #7489
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das muss ein Formular sein, mit einem Hidden-Field mit der Aktion und der Button muss das dann abschicken...

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
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
126
127
128
129
#!/usr/bin/perl

use strict;
use warnings;
use CGI qw( :all );
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
use Tie::File;

# Initialisierung
##################

my $cgi = new CGI;
my %params = $cgi->Vars();
my $file = '/SAN/content/cgi-bin/links';
my $save_error = "";
my $i = 0;
my $k = 0;

# Link speichern
#################

if ( defined $params{write} && $params{write} eq "true" ) { #
$params{text} =~ s/\r\n/<br>/sg;

if (! -f $file ) {
&create_linklist;
}
else {
if ( $params{url} =~ /^http:\/\/.*$/ ) {
open ( D, '>>', $file ) or die "Could not save data. $!";
print D "#" x80, "\nLINK: $params{url}\nTEXT: $params{text}\n";
close D;
}
else {
$save_error = "<p>Bitte geben Sie den kompletten URL an, sonst kann ";
$save_error .= "Ihr Link nicht gespeichert werden.<br /> Beispiel: ";
$save_error .= "http://ihr.neuer.link.com/</p>";
}
}
}
elsif(defined $params{action} and $params{action} eq 'delete'){
delete_link($params{link});
}

# Links laden
##############

my ( @data, @links, @texts );

if (! -f $file ) {
&create_linklist;
}
else {
open ( F, '<', $file ) || die "Could not open $file. $!";
@data = grep { /^[^#]/ } <F>;
close F;
$i = $k = 0;
foreach ( @data ) {
chomp ( $_ );
if ( $_ =~ /^LINK:\s/ ) {
$_ =~ s/^LINK:\s//;
$links[$i] = $_;
$i++;
}
else {
$_ =~ s/^TEXT:\s//;
$texts[$k] = $_;
$k++;
}
}
}

# Dokument ausgeben
####################

my $author = "Andre Hornig";

print $cgi->header(),
$cgi->start_html(
-title => "Linkit - Eine kleine Favoritenliste.",
-bgcolor => "#99ccff",
'Linkit'
),
$cgi->h1('Linkit'),
$cgi->p({-style => 'color:red'}, "Verfasst von: ", $cgi->i($author)),
$cgi->hr({-noshade => undef, -size => '1'}),

$cgi->p('Eine kleine Favoritenliste');

$i = 0;
foreach ( @links ) {
print qq~<form action="./linkit.pl" method="post">
<input type="hidden" name="action" value="delete">
<input type="hidden" name="link" value="$texts[$i]">
<input type="submit" value="löschen">
</form>
~;
print $cgi->p(
{-style => "margin:5px;"}, $i+1, ") ", $cgi->a( {-href => $_}, $texts[$i] )
);
$i++;
}

print << "EOF";
<h1>Neuen Link eintragen</h1>
$save_error
<form action="" method="post">
<p>
Link:<br />
<input type="text" name="url" size="40" maxlength="40" />
</p>
<p>
Beschreibung:<br />
<textarea rows="5" cols="50" name="text"></textarea>
<input type=hidden name="write" value="true" />
</p>
<p><input type="submit" value="Absenden" /></p>
</form>
EOF

$cgi->end_html();

sub delete_link{
my ($link_text) = @_;
tie my @array,'Tie::File',$file or die $!;
my ($index) = grep{$array[$_] =~ /TEXT:\s$link_text/}(0..scalar(@array)-1);
@array[$index-2..$index] = ('') x 3;
untie @array;
}
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/
Antworten mit Zitat
renee
 2006-05-09 12:41
#7490 #7490
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich würde mir mal an Deiner Stelle CPAN:HTML::Template oder CPAN:HTML::Template::Compiled anschauen. Da bekommst Du schönere Seiten hin und Dein Perl-Code wird nicht duch den ganzen HTML-Quelltext zu unübersichtlich...
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/
Antworten mit Zitat
haijp
 2006-05-09 14:40
#7491 #7491
User since
2006-04-11
14 Artikel
BenutzerIn
[default_avatar]
hmm wenn ich es in der console mit perl durchlaufe kommt nix nur wenn ich auf der seite nen löschen button betätige kommt danach seite kann nicht bla bla bla ^^
Antworten mit Zitat
renee
 2006-05-09 16:15
#7492 #7492
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Hast Du beim "action"-Attribut auch den richtigen Skriptnamen eingetragen??
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/
Antworten mit Zitat
master
 2006-05-09 16:55
#7493 #7493
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
@haijp  (und renee)

Versuch das Layout/GUI von Code zu trennen. Sowas wie oben ist kein gutes Design, das bringt nur Probleme.
GUI - Verarbeitung - Datenhaltung

Sind 3 verschiedene Dinge ( 3 Schichtenmodell ).
z. B. mit: (HTML - Perl - DB)  

Ein gutes Beispiel sind auch templates.
Kurz - es soll so wenig HTML-code wie möglich in Perl-code stehen..

Eine Sprache die mit dem 3 Schichtenmodell bricht ist z. B. PHP, mit der äusserst dummen Möglichkeit die Codes zu mixen.
Code: (dl )
1
2
3
4
5
<?phpcode?>
html-code
<?phpcode?>
html-code
<?phpcode?>


den selben Unsinn in Perl:

Code: (dl )
1
2
3
4
5
6
7
perlcode
print 'html_code';
perlcode
print 'html_code';
perlcode
print 'html_code';
perlcode


Leider gibt es viele die so "basteln", am ende stehen alle an, wenn man eine "kleine" Änderung am Design machen will.


Zudem:
"laden/speichern/verarbeitung" gehört in ein eigenes Skript.
"Anzeige" in ein anderes. Wenn du es mixt, gibts irgendwann ärger.

Mach einfach ein "speichern.pl" "laden.pl" "anzeige.pl"
wenn du alles dann zusammenfasst siehts dann ca so aus:

Code: (dl )
1
2
3
4
if ($modus eq 'laden') {do 'laden.pl';}
if ($modus eq 'speichern') {do 'speichern.pl';}

do 'anzeigen.pl';

Wichtig ist:
1. anzeige und verarbeitung trennen.
2. perl + html trennen, soweit es geht.\n\n

<!--EDIT|master|1147179643-->
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
Antworten mit Zitat
renee
 2006-05-09 18:27
#7494 #7494
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Deswegen habe ich ja zu CPAN:HTML::Template geraten...
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/
Antworten mit Zitat
master
 2006-05-09 19:21
#7495 #7495
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
@renee

Gut so :-)

Ich habe mir CPAN:HTML::Template
kurz angesehen, für einfache Sachen reicht es aus.

der author schreibt:
Quote
If you're a fanatic about valid HTML and would like your templates to conform to valid HTML syntax, you may optionally type template tags in the form of HTML comments.


ev. Sollte ich auch das nutzen, statt selber zu parsen.
Habe eine sehr ausgereifte methode entwickelt.


ps. kannst Du mir mir ev sagen, wie ich folgendes tun kann?

1. Syntax ändern... so dass z. B. statt
Code: (dl )
 <img src="<--TMPL_VAR IMAGE_SRC-->">

schreiben kann:
Code: (dl )
 <img src="TMPL_VAR IMAGE_SRC">


Also "ohne HTML kommentar" so das es html-konformer text ist, falls ich es möchte

2. In einen eigenen Loop spirngen
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
z. B.
<TMPL_LOOP NAME=EMPLOYEE_INFO>
Name: <TMPL_VAR NAME=NAME> <br>
Job: <TMPL_VAR NAME=JOB> <p>
</TMPL_LOOP>



$template->param(EMPLOYEE_INFO => [
{ name => 'Sam', job => 'programmer' },
{ name => 'Steve', job => 'soda jerk' },
]
);


hierbei ist man zu sehr einggeengt:


Ich will folgendes in der art:
Code: (dl )
1
2
3
4
5
6
7
8
$template->sub(EMPLOYEE_INFO => &mein_loop($loopinhalt) );

sub meinloop
{
hier will ich nun den Code Zwischen dem
"<TMPL_LOOP NAME=EMPLOYEE_INFO>" und "</TMPL_LOOP>"
- Tag bearbeiten und ändern... dann zurück schreiben.
}


ps. meinloop brauche ich, da dort alles gemanaget werden soll.
bzw. der Code modifiziert und dann dem $template zurückgegeben werden.

Wenn das nicht möglich ist, kannn ich das modul nicht nutzen.

Oder auch simpler erklärt

Gib mir den Templatecode zwischen
Code: (dl )
1
2
3
<TMPL_LOOP NAME=EMPLOYEE_INFO>
___ CODE ___
</TMPL_LOOP>


Ich bearbeite, ihn und gebe ihn dann an der entsprechenden Stelle zurück.

Wenn ich z.B. unzählige funktionen, berechnungen, bei jedem loop durchlauf machen will.. oder einfach ein for(1..1000){}
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
Antworten mit Zitat
pq
 2006-05-10 14:20
#7496 #7496
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=master,09.05.2006, 17:21]Ich will folgendes in der art:
Code: (dl )
1
2
3
4
5
6
7
8
$template->sub(EMPLOYEE_INFO => &mein_loop($loopinhalt) );
 
sub meinloop
{
hier will ich nun den Code Zwischen dem
"<TMPL_LOOP NAME=EMPLOYEE_INFO>" und "</TMPL_LOOP>"
- Tag bearbeiten und ändern... dann zurück schreiben.
}
[/quote]
dann musst du eine subref übergeben. das erlaubt HTML::Template.
oder ich verstehe nicht, was du meinst.

edit: du willst den template-code on-the-fly ändern? ich würde mal
sagen, wen du das musst, dann ist dein design grundlegend
verkehrt. ich bin mir sicher, dass man das auch so lösen kann.\n\n

<!--EDIT|pq|1147258567-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Antworten mit Zitat
master
 2006-05-10 16:40
#7497 #7497
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
@pq

Naja das Problem ist eben, das ich "alles" machen muss.
Es geht hier um weit mehr als nur ein Standardtemplate.


Momentan habe ich es (ohne Modul) so gelöst.
Damit Du weisst was ich meine. Hier der "Code" meines Systems:

HTML-Vorlage
Code: (dl )
1
2
3
<--!Loop-->
<b>Name Alter</b><br>
<--!Loop-->


Nun wird nach Loop gesplittet und Wert ersetzt.
Ich habe aber die volle Kontrolle, wie oft der Wert dargestellt werden soll. z. B. so

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$code = mein template htmlcode, bzw. die stelle aus loop

#splitten. ($head, $loop, $foot)
$code = $head;

for $i (1..20)
{
print $loop_code;
# Jetzt sehr viel damit machen
# hier müssen gewisse Variabeln ersetzt werden, oder dynamische änderungen, berechnungen

$code = $code.$loop_code;
}
$code = $code. $foot;

print $code; #oder in File


Vorallem soll der $loop nur ausgegeben werden wenn
ein inhalt existiert...

Ich möchte ganz klar "NICHT" die Template-IF abfrage nutzen.
möglichst nur Loop und Variable. Die Abfragen müssen in Perl sein.

Zudem muss ich ja auch HTML-Teile ein oder ausblenden können. Z.b. so das der Loop gar nicht angezeigt wird beim Fall X, oder Fall Y.. und das muss in Perl sein,
Templates-IF kommt nicht in Frage, sowas ist schlecht. Nicht so wie beim Coldfusion!
Nur "ersetzungen und loops" rest als perlcode.
Mein Template soll reiner HTML sein. Die einzige Ausnahme ist der <!--TMPL_LOOP--> Kommentar. Die Variablen will ich nicht via <!--TMPL_Var name=""-->
sondern auf die Art ansprechen "TMPL_"+Variablenname

Grund:
Code: (dl )
1
2
3
4
<TMPL_VAR NAME=NAME> = nicht html konform
alternative:
<!--TMPL_VAR NAME=NAME--> = Unsichtbar in den Editoren!
TMPL_Varname = immer sichtbar (wird als text interpretiert)



Darum muss ich
1. Syntax ändern können
2. Vollzugriff auf alle funktionen vom Loop.
(um im notfall "on the fly" den code zu modifizieren und dem templateobjekt zurückgeben)

----
Ausserdem brauche ich den Zugriff auf den vollen Code der ausgegeben werden soll.. ohne ihn auszugeben!
Code: (dl )
$code = $template->Ganzer_CODE();


Schliesslich will ich den Code ja z.b. abspeichern, statt ausgeben.

-----

Ist nicht einfach zu erklären. Kannst Du mir ev. Lösungen zeigen? Besonders bezüglich des Loops und der Syntax.

ps. Die "Sichtbare syntax" brauche ich um das template in Editoren zu ändern... Dort muss ich dann sehen, wo welche Variable steht. oder bei Formularfeldern als "Value" ohne das das HTML-Konzept durcheinander gerät. Es muss alles interpretierbar sein.
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
Antworten mit Zitat
<< |< 1 2 3 4 ... 7 >| >> 61 Einträge, 7 Seiten



View all threads created 2006-05-09 12:24.