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

CGI::Application: Vorgehensweise (Frage am Rande)



<< |< 1 2 >| >> 17 Einträge, 2 Seiten
pktm
 2004-05-18 12:22
#29238 #29238
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!
Ich bin gerade dabei mit CGI::Application ( http://search.cpan.org/modlist/World_Wide_Web/CGI ) ein CMS, bzw. ein Webautoring-Programm zu schreiben.
Da soll der Anwender die Möglichkeit haben lokale Webseiten (auf dem Server) einzubinden, welche aus der Datenbank und welche die er mittels Dreamwaever hochläd.
Wenn man jetzt kurz das Inrto von CGI::Application durchgelesen hat steht da, dass das Modul dazu da ist, lange if-else-Abfragen zu vermeiden.
Nun habe ich aber ein Problem mit der Parameterübergabe.
Und zwar gibt es den Parameter runmode, der angibt, welcher Teil meiner Apllication (siehe Doku, ist wirklich nicht viel) gerade ausgeführt werden soll.
Ich habe 3 Fälle zu unterscheiden:
1. lokale Datei, runmode=file; src=/pfad/zu/datei(von cgi-bin aus)
2. runmode=db; keyword=keywordFieldFromDB
3. runmode=mmdw; file=filename(pfad ergibt sich aus dreamveaver-eingener struktur)
Benutzerfreundlich wäre es , wenn der Benutzer die runmodes weglassen könnte und nur den Parameter (src|file|keyword) übergeben muss, der runmode ergibt sich ja daraus.
Das hat alerdings zur Folge, dass ich wieder 3 if's (uuhh :) ) in meinem Programm stehen habe. (vgl. hier vielleicht cgiapp_prerun)

Wären diese 3 If's programmier-moralisch verwerflicvh oder sollte die Benutzerfreundlichkeit immer im Vordergrund stehen?
Und um die Frage etwas aufzupeppen: es soll mehrere Plugins geben. Da benötigt dann jedes Plugin ein weiteres if.

Antworten?
Kritik, Anregungen?
mfg pktm
http://www.intergastro-service.de (mein erstes CMS :) )
ptk
 2004-05-18 12:50
#29239 #29239
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Ich kenne CGI::Application nun gar nicht, aber du kannst CGI-Parameter programmatisch setzen:
Code: (dl )
1
2
3
if    (param("src")) { param("runmode", "file") }
elsif (param("db")) { param("runmode", "db") }
...
Gast Gast
 2004-05-18 13:41
#29240 #29240
if-elsif-else Blöcke sind immer häßlich und unhandlich ...
als Ersatz geht sowas
Code: (dl )
1
2
3
4
5
6
7
    my $event = {
       'src'           =>  \&sub_1,
       'file'          =>  \&sub_2,
       'keyword'       =>  \&sub_3,
   };

   $event->{$param->{'action'}}->();    
pktm
 2004-05-18 14:12
#29241 #29241
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
So funktioniert das auch bei CGI::App.
Man definiert seine Methoden im Modul:
Code: (dl )
1
2
3
4
5
6
      $self->run_modes(
             'index' => 'get_index',
             'db' => 'getSiteFromDB',
             'file' => 'getSiteFromFile',
             'mmdw' => 'getSiteFromDreamweaver',
     );

Und führt sie dann im Script aus:
Code: (dl )
1
2
3
use CMS;
my $webapp = CMS->new();
$webapp->run();


Mein Problem ist im Moment nur, dass ich keinen Parameter für den Runmode (bei Dieter action) habe, sondern das was in diesem Parameter für den Runmode drin stehen sollte der Parameter ist.
Andernfalls müsste ich dem Benutzer anlasten alles doppelt zu schreiben.
Z.B. so:
[html]
<a href="cms.cgi?runmode=file&src=path/to/file">file</a>
[/html]
Wenn ich aber nach dem Übergebenen Parameter per Abfrage den richtigen Runmode einstelle (Runmode = Action), dann muss der benutzer nur eine Sache angeben.
Außerdem veringert sich das Risiko für Typos :)

Man müsste quasi den Runmode-Parameter automatisch mit dem entsprechend überrgebenen Keyword (src|file|db) füllen.
Geht das?
Vieklleicht wenn man die Konvention trifft, dass der erste Parametername der Runmode ist?
mfg pktm

Edit: Typo\n\n

<!--EDIT|pktm|1084875241-->
http://www.intergastro-service.de (mein erstes CMS :) )
Gast Gast
 2004-05-18 16:51
#29242 #29242
Wie wär's dann damit?
Code: (dl )
1
2
3
4
5
6
7
   my $event = {
      'src'           =>  \&sub_1(q|attrib_1|),
      'file'          =>  \&sub_2(q|attrib_2|),
      'keyword'       =>  \&sub_3(q|attrib_3|),
  };

  $event->{$param->{'Runmode'}->()};    
ptk
 2004-05-18 16:53
#29243 #29243
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=Dieter,18.May.2004, 14:51]Wie wär's dann damit?
Code: (dl )
1
2
3
4
5
6
7
   my $event = {
'src' => \&sub_1(q|attrib_1|),
'file' => \&sub_2(q|attrib_2|),
'keyword' => \&sub_3(q|attrib_3|),
};

$event->{$param->{'Runmode'}->()};
[/quote]
Richtig geht es so:
Code: (dl )
1
2
3
4
5
   my $event = {
'src' => sub { sub_1(q|attrib_1|) },
'file' => sub { sub_2(q|attrib_2|) },
'keyword' => sub { sub_3(q|attrib_3|) },
};
Gast Gast
 2004-05-18 17:29
#29244 #29244
@ptk:
Kommt drauf an ... ;)
aber so wie Du das geschrieben hast ist das natürlich die in der Weiterverarbeitung, verständlichste Notation.
ptk
 2004-05-18 18:09
#29245 #29245
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Nein, deine Loesung ist falsch. Die Subroutinen werden damit schon beim Aufbauen des Hashs aufgerufen. Versuch mal:
Code: (dl )
1
2
3
4
5
6
sub sub_1 { die }
my $event = {
'src' => \&sub_1(q|attrib_1|),
'file' => \&sub_2(q|attrib_2|),
'keyword' => \&sub_3(q|attrib_3|),
};

Ohne das irgendetwas aufgerufen wird, stirbt das Skript.
pktm
 2004-05-18 18:19
#29246 #29246
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
[quote=Dieter,18.05.2004, 14:51]Wie wär's dann damit?
Code: (dl )
1
2
3
4
5
6
7
   my $event = {
      'src'           =>  \&sub_1(q|attrib_1|),
      'file'          =>  \&sub_2(q|attrib_2|),
      'keyword'       =>  \&sub_3(q|attrib_3|),
  };

  $event->{$param->{'Runmode'}->()};    
[/quote]
Wenn ich das Ding benutzerfreundlichen machen will habe ich doch keinen Parameter Runmode zur Verfügung.
Je nach Aufruf habe ich einen der 3 Parameter file oder src oder db.
Keinen Action-Parameter, sondern nur die 3 da oben.
Das ist ja die Frage, ob man das irgendwie ohne If's hinbekommt.
Wenn ich den Parameter runmode habe brauche ich keinen Hash mehr, der ist ja durch die Runmode-Definition des CGI::Application-Objektes bereits gegeben (siehe mein obiges Beispiel sowie das Beispiel in der Doku).
mfg pktm

EDIT:
kleines praktisches Beispiel:
Für eure sowie die Standard-Variante in CGI::App. sieht der Link so aus:
cms.cgi?runmode=file;src=path/th/file
Damit sich der Benutzer den Parameter runmode ersparen kann soll der Link aber so aussehen:
cms.cgi?src=path/to/file\n\n

<!--EDIT|pktm|1084890256-->
http://www.intergastro-service.de (mein erstes CMS :) )
Gast Gast
 2004-05-18 18:25
#29247 #29247
[quote=ptk,18.05.2004, 16:09]Nein, deine Loesung ist falsch. Die Subroutinen werden damit schon beim Aufbauen des Hashs aufgerufen.
Ohne das irgendetwas aufgerufen wird, stirbt das Skript.[/quote]
Beim Aufbau des Hash wird natürlich keine der enthaltenen Subroutinen aufgerufen da diese als Referenz im Value des Hash vorliegen und von daher unter keinen Umständen aufgerufen werden können.

my $sub = \&irgend_was;

kann nur mit
&$sub;
oder:
$sub->();
aufgerufen werden.

Gleiches gilt dann auch für den Hash-Aufbau.

Ich verwende ich diese Art von 'cases' (die es ja in Perl nicht gibt) in allen meinen Programmen und es läuft tatsächlich einwandfrei :)
<< |< 1 2 >| >> 17 Einträge, 2 Seiten



View all threads created 2004-05-18 12:22.