Re: @CB oder Sander do_all Fehlermeldung - baseportal Forum - Web-Anwendungen einfach, schnell, leistungsfähig!
baseportal
English - Deutsch "Es gibt keine dummen Fragen - jeder hat einmal angefangen"

 baseportal-ForumDie aktuellsten 10, 30, 50, 100 Einträge anzeigen.  

 
 Ausgewählter Eintrag: Zur Liste 
    Beitrag von hempelr (1976 Beiträge) am Montag, 27.Januar.2003, 09:12.
    Re: @CB oder Sander do_all Fehlermeldung

      Hallo, Christoph,
      danke für die Antwort.

      Kurz (eher lang ;-) warum ich das wie brauchen könnte:

      Ich habe ein Hauptscript, in dem eine Nutzer-Zugangskontrolle gemacht wird. Die Nutzer bekommen unterschiedliche Rechte auf unterschiedliche Datenbanken . Dazu ist in der Nutzerdatenbank für jede DB ein Option-Feld mit dem Namen der DB (kann beliebig erweitert werden, wenn neue DBs dazukommen). Es gibt es eine weitere "Code-DB", die in einer Art Relation (Handgemacht) mit den Rechte-Feldern aus der Nutzer-DB steht; da sind dann Felder mit dem Code der jeweils zugehörigen Ausgaben und Aktionen (bspw. ein Formular zur Neuanlage oder zum Ändern von Datensätzen je nach gewählter Akion; Ausgabeliste der nutzereigenen Datensätze mit Link zum Ändern und Löschen generieren) für die zughörige referenzierte DB drin.
      Es wird im Hauptscript überprüft, ob es die Datenbank(en), für die der Nutzer Rechte hat überhaupt schon gibt und dann aus der Struktur der Nutzerdb (also den Option-Feldnamen) die Links zur Bearbeitung gebaut und die zugehörige Subroutine aus der Code-DB referenziert und mittels eval eingefügt; Datensätze hinzufügen, ändern und löschen werden im Hauptscript dann einfach per Abfrage des Aktions-Parameters anhand der übergebenen Referenz auf die DB vorgenommen.
      Hier mal das Stück Code aus dem Hauptscript, das den "Knackpunkt" darstellt:
      ---- schnipp ----
      ################################################################
      # -------- Formular-Subroutinen aus db generieren ------- #
      #################################################################
      $a_debug.= "${ \('-'x5) } <b>Subroutinen dynamisch aufbauen</b> ${ \('-'x5) }<br>";
      if ($use)
      {# -------- Aktionen in Datenbanken je nach $act ------- #
            my $db_name = substr($use, 2);
            if ($act eq "n")
               {
               put undef ,"$db_name";
               $act = "n"; # $act auf n stellen, damit wieder Eingabeformular aus Sub angezeigt wird
               $a_actiontext = "Datensatz hizugefügt...";
               }
               elsif ($act eq "c" && $dsn ne "")
               {
               mod "Id==!$dsn", undef, "$db_name";
               $act = "n"; # $act auf n stellen, damit wieder Eingabeformular aus Sub angezeigt wird
               $a_actiontext = "Datensatz geändert...";
               }
               elsif ($act eq "d" && $dsn ne "")
               {
               del "Id==!$dsn", "$db_name";
               $act = "n"; # $act auf n stellen, damit wieder Eingabeformular aus Sub angezeigt wird
               $a_actiontext = "Datensatz gelöscht...";
               }
      # -------- Ende Aktionen in Datenbank $use ja nach $act ------- #
         $a_debug.="\$use nicht leer -> Subs aus DB-Feld holen<br>";
         get "", "$db_sub"; # Daten aus dbnames holen
         while (get_next($db_sub))
         {
         if ($code1 ne "") # wenn feld v. code f. Formular z. entspr. DB nicht leer
            {
            $a_debug.="Quelltext f. Sub $recht_nutzer holen (db-feld code1 mit Inhalt)<br>";
            eval "sub $recht_nutzer { $code1 }";
            }
         }
      }else
      {
      $a_debug.="\$use leer -> subs nicht aufgebaut<br>";
      }
      # ........ Beginn Fehler bei nicht deklarierten SUBS abfangen ........ #
      sub AUTOLOAD
      {my $sub=substr($AUTOLOAD, rindex($AUTOLOAD, ":")+1);
      my $recht_nutzer = ucfirst(substr($sub,2));
      $anz_subfehler=<<EOF;
      <font color=red><p class=norm><b>Sorry - Eingabe noch nicht möglich - wir arbeiten daran!</b><br>
      Arbeitsblatt für $recht_nutzer noch nicht fertiggestellt!<br>
      <span class=klein>(Fehlender Teil $sub)</span></p></font>
      <span class=klein><span align=right>[ <a href=$_link&$z_link1>ZURÜCK</a> ]</span></span>
      EOF
      }
      
      .....
      und dann weiter unten im Hauptscript:
      .....
         if ($use)
         {$a_debug.= "${ \('-'x5) } <b>Sub $use aufgerufen</b> ${ \('-'x5) }<br>";
         @subrueck = &{$use};
         $anz_mitteltext2.= $subrueck[0];
         $a_debug.= $subrueck[1].$subrueck[2];
         undef (@subrueck);
         $a_debug.= "${ \('-'x5) } <b>Sub beendet</b> ${ \('-'x5) }<br>";
         }else
         {$anz_mitteltext2=<<EOF;
           ...was anderes....
      

      Alle Ausgaben, die auf der Website kommen, schreibe ich generell zunächst in Vars die in Abhängigkeit der gewählten Aktion unterschiedlich belegt werden. Dann am Ende des Hauptscripts wird die HTML-Ausgabe einfach aus den "Bausteinen" nach "Lego-Manier" zusammengebaut - so kann man die Anwendung beliebig weiterverwenden und an jedes Site-Layout anpassen.

      Ein out-Befehl ist also immer nur am Ende notwendig; die gesamte HTML-Seite wird dort zusammengebaut, u.a. auch wieder mittels Subs (die meisten aber "hart" in nem Standard-Include-Templat eingebaut) mit variablen Inhalten bspw. für Kopfteil, Titel, speziellem Content, evtl. notwendige Java-Scripte, versch. Fußteile etc.

      Da ich "einfach nur" für manche DB's die Vorteile der bp-internen Formular- und Listenasgabe nutzen wollte (do_all ist dafür ja optimal), wäre eine Ausgabeumleitung von do_all richtig effektiv.

      Vielleicht kann ich Haralds Lösungsvorschlag ja nutzen (der funzt erst mal prinzipiell) - nur ist das mit dem "harten" Einbau der Sub(refernzen) so´n Ding, da es ja schon in nem dynamisch referenzierten eval-Block gebraucht wird (Refernz in ner Referenz auf ne Referenz???? - da wirds dann langsam unübersichtlich). Ist im Moment bischen schwer zu verstehem für mich....
      Hoffe, ich hab mich halbwegs verständlich ausgedrückt - ist gar nicht so einfach komplexe Abläufe simpel zu erklären.....
      CU
      Ruben


    Antworten

 Alle Einträge zum Thema: Zur Liste 
    Beitrag von hempelr (1976 Beiträge) am Sonntag, 26.Januar.2003, 10:27.
    @CB oder Sander do_all Fehlermeldung

      Hallo,
      nachdem das Forum von unschönen Themen voll war nun wieder was zum Eigentlichen:
      Ich krieg einfach das do_all in ner Sub (die per eval im Hauptscript erzeugt wird) zum Laufen (s. meine zwei vorherigen Fragen dazu: http://www.baseportal.de/baseportal/baseportal/forum&wcheck=1&Pos=7130 und http://www.baseportal.de/baseportal/baseportal/forum&wcheck=1&Pos=7129 )
      Das mit dem Subblock im eval kann ich mir noch vorstellen, daß es zu einem Fehler kommt und wahrscheinlich nicht umschiffbar ist, es sei denn, ich nehm die Sub "hart" in das Hauptscript.

      Das allergrößte Problem bereitet mir aber, daß do_all sich ums Verrecken nicht dazu überreden läßt, sein Ergebnis ausschließlich in ne Variable zu speichern. Es wird immer an der Position ausgegeben, wo es steht und dann noch mal, wo die Variable dann ausgegeben wird.
      Hier mal der komplette Templatecode:
      <perl>
      out "<font color=red>Ausgabe mittels out am Templateanfang (erste Zeile nach <perl>) wird in Sub nicht wiederholt und kommt trotzdem als Ausgabe nochmal?????</font>";
      $ausgabe=<<EOF;
      <table border=1 bordercolor=blue cellpadding=2 cellspacing=0><tr><td colspan=2>Titel der Tabelle</td></tr>
      <td width=25% align=left valign=top bgcolor=limegreen>Schmale<br>Spalte</td>
      <td width=75% align=center>Hier soll die Datenausgabe kommen:<br>(Aufruf der Sub mit verketteter Einleitung in Variable \$ausgabe)
      EOF
      $ausgabe.= &_doall("w_news");
      $ausgabe.=<<EOF;
      </td><tr></table>
      EOF
      # Ausgabe der HTML-Seite #
      out<<EOF;
      <html><head>
      <title>Test für do_all</title>
      <body>
      <table width=350 align=center border=1 bordercolor=red><tr><td align=center>Hier folgt die Eigentliche Ausgabetabelle</td></tr></table>
      $ausgabe
      $anz_daten
      </body></html>
      EOF
      #  Subdefinition #
      sub _doall()
      {my $a_daten=<<EOF;
      <table border=1 bordercolor=darkviolett width=400><tr><td bgcolor=lightcyan>Nun die DB-Ausgabe<br>
      EOF
      $a_daten.=do_all "db=$_[0]";
      $a_daten.=<<EOF;
      </td</tr><table>
      EOF
      return($a_daten);}
      </perl>
      und die URL zum Ansehn (kann nichts kaputt gehen) http://dabadu.de/baseportal/workout/doalltest
      

      Eigentlich sollte die Ausgabe der Datenbank nur einmal erfolgen und zwar in der Tabelle mit der lightzyan-farbigen Border; sie kommt aber halt nochmal an der Stelle, wo das do_all aufgerufen wird.....
      Ein Tipp wäre sehr hilfreich; auch wenns negativ ist....
      Ruben

     Antworten

    Beitrag von Sander (8133 Beiträge) am Sonntag, 26.Januar.2003, 15:39.
    Re: @CB oder Sander do_all Fehlermeldung

      in do_all steht doch bestimmt print/out drin, also wirds dort auch ausgegeben. kann man bestimmt nicht umleiten/abfangen
      oder hab ich was falsch verstanden?

      Sander

     Antworten

    Beitrag von hempelr (1976 Beiträge) am Sonntag, 26.Januar.2003, 16:53.
    Re: @CB oder Sander do_all Fehlermeldung

      Naja - was im do_all steht weiß nur Christoph - ich meine ja die bp-Methode do_all, die als BP-Perl-Erweiterung da ist....
      Mhm, müßte Christoph mal was dazu sagen....
      Danke
      Ruben

     Antworten

    Beitrag von Christoph Bergmann (8110 Beiträge) am Sonntag, 26.Januar.2003, 19:47.
    Re: @CB oder Sander do_all Fehlermeldung

      Sander hat (natürlich ;-) ) prinzipiell schon recht: do_all ist ja eine normale Routine und die schmeisst Ihre Ausgaben mit "out" raus, wo es halt ansteht - so wie jeder Code in einem bp-Template auch...

      Zu der Frage mit dem Ausgabe-Umbiegen:

      Es gibt eine globale Variable in der die Ausgaben gesammelt werden - die könnte man z.b. zwischenspeichern und bei Bedarf leeren. Das Problem ist aber, dass man da im normalen bp (die Lizenzversionen schon) nicht richtig rankommt, da gehen ziemlich verzwickte Sachen mit den Perl-Namespaces ab - schade, dass Andreas Jurenda nich hier is, das is sein Fachgebiet, der wüsste dazu sicher mehr zu sagen (Auch zu den Geschichten die da wg. dem eval abgehen).

      So ganz klar ist mir bei Deinem Code aber nicht, was Du _eigentlich_ machen willst - vielleicht kann man das ganze mit dem In-einer-Variablen-speichern umgehen...? Erklär mal genauer, wieso Du das brauchst...

     Antworten

    Beitrag von hempelr (1976 Beiträge) am Montag, 27.Januar.2003, 09:12.
    Re: @CB oder Sander do_all Fehlermeldung

      Hallo, Christoph,
      danke für die Antwort.

      Kurz (eher lang ;-) warum ich das wie brauchen könnte:

      Ich habe ein Hauptscript, in dem eine Nutzer-Zugangskontrolle gemacht wird. Die Nutzer bekommen unterschiedliche Rechte auf unterschiedliche Datenbanken . Dazu ist in der Nutzerdatenbank für jede DB ein Option-Feld mit dem Namen der DB (kann beliebig erweitert werden, wenn neue DBs dazukommen). Es gibt es eine weitere "Code-DB", die in einer Art Relation (Handgemacht) mit den Rechte-Feldern aus der Nutzer-DB steht; da sind dann Felder mit dem Code der jeweils zugehörigen Ausgaben und Aktionen (bspw. ein Formular zur Neuanlage oder zum Ändern von Datensätzen je nach gewählter Akion; Ausgabeliste der nutzereigenen Datensätze mit Link zum Ändern und Löschen generieren) für die zughörige referenzierte DB drin.
      Es wird im Hauptscript überprüft, ob es die Datenbank(en), für die der Nutzer Rechte hat überhaupt schon gibt und dann aus der Struktur der Nutzerdb (also den Option-Feldnamen) die Links zur Bearbeitung gebaut und die zugehörige Subroutine aus der Code-DB referenziert und mittels eval eingefügt; Datensätze hinzufügen, ändern und löschen werden im Hauptscript dann einfach per Abfrage des Aktions-Parameters anhand der übergebenen Referenz auf die DB vorgenommen.
      Hier mal das Stück Code aus dem Hauptscript, das den "Knackpunkt" darstellt:
      ---- schnipp ----
      ################################################################
      # -------- Formular-Subroutinen aus db generieren ------- #
      #################################################################
      $a_debug.= "${ \('-'x5) } <b>Subroutinen dynamisch aufbauen</b> ${ \('-'x5) }<br>";
      if ($use)
      {# -------- Aktionen in Datenbanken je nach $act ------- #
            my $db_name = substr($use, 2);
            if ($act eq "n")
               {
               put undef ,"$db_name";
               $act = "n"; # $act auf n stellen, damit wieder Eingabeformular aus Sub angezeigt wird
               $a_actiontext = "Datensatz hizugefügt...";
               }
               elsif ($act eq "c" && $dsn ne "")
               {
               mod "Id==!$dsn", undef, "$db_name";
               $act = "n"; # $act auf n stellen, damit wieder Eingabeformular aus Sub angezeigt wird
               $a_actiontext = "Datensatz geändert...";
               }
               elsif ($act eq "d" && $dsn ne "")
               {
               del "Id==!$dsn", "$db_name";
               $act = "n"; # $act auf n stellen, damit wieder Eingabeformular aus Sub angezeigt wird
               $a_actiontext = "Datensatz gelöscht...";
               }
      # -------- Ende Aktionen in Datenbank $use ja nach $act ------- #
         $a_debug.="\$use nicht leer -> Subs aus DB-Feld holen<br>";
         get "", "$db_sub"; # Daten aus dbnames holen
         while (get_next($db_sub))
         {
         if ($code1 ne "") # wenn feld v. code f. Formular z. entspr. DB nicht leer
            {
            $a_debug.="Quelltext f. Sub $recht_nutzer holen (db-feld code1 mit Inhalt)<br>";
            eval "sub $recht_nutzer { $code1 }";
            }
         }
      }else
      {
      $a_debug.="\$use leer -> subs nicht aufgebaut<br>";
      }
      # ........ Beginn Fehler bei nicht deklarierten SUBS abfangen ........ #
      sub AUTOLOAD
      {my $sub=substr($AUTOLOAD, rindex($AUTOLOAD, ":")+1);
      my $recht_nutzer = ucfirst(substr($sub,2));
      $anz_subfehler=<<EOF;
      <font color=red><p class=norm><b>Sorry - Eingabe noch nicht möglich - wir arbeiten daran!</b><br>
      Arbeitsblatt für $recht_nutzer noch nicht fertiggestellt!<br>
      <span class=klein>(Fehlender Teil $sub)</span></p></font>
      <span class=klein><span align=right>[ <a href=$_link&$z_link1>ZURÜCK</a> ]</span></span>
      EOF
      }
      
      .....
      und dann weiter unten im Hauptscript:
      .....
         if ($use)
         {$a_debug.= "${ \('-'x5) } <b>Sub $use aufgerufen</b> ${ \('-'x5) }<br>";
         @subrueck = &{$use};
         $anz_mitteltext2.= $subrueck[0];
         $a_debug.= $subrueck[1].$subrueck[2];
         undef (@subrueck);
         $a_debug.= "${ \('-'x5) } <b>Sub beendet</b> ${ \('-'x5) }<br>";
         }else
         {$anz_mitteltext2=<<EOF;
           ...was anderes....
      

      Alle Ausgaben, die auf der Website kommen, schreibe ich generell zunächst in Vars die in Abhängigkeit der gewählten Aktion unterschiedlich belegt werden. Dann am Ende des Hauptscripts wird die HTML-Ausgabe einfach aus den "Bausteinen" nach "Lego-Manier" zusammengebaut - so kann man die Anwendung beliebig weiterverwenden und an jedes Site-Layout anpassen.

      Ein out-Befehl ist also immer nur am Ende notwendig; die gesamte HTML-Seite wird dort zusammengebaut, u.a. auch wieder mittels Subs (die meisten aber "hart" in nem Standard-Include-Templat eingebaut) mit variablen Inhalten bspw. für Kopfteil, Titel, speziellem Content, evtl. notwendige Java-Scripte, versch. Fußteile etc.

      Da ich "einfach nur" für manche DB's die Vorteile der bp-internen Formular- und Listenasgabe nutzen wollte (do_all ist dafür ja optimal), wäre eine Ausgabeumleitung von do_all richtig effektiv.

      Vielleicht kann ich Haralds Lösungsvorschlag ja nutzen (der funzt erst mal prinzipiell) - nur ist das mit dem "harten" Einbau der Sub(refernzen) so´n Ding, da es ja schon in nem dynamisch referenzierten eval-Block gebraucht wird (Refernz in ner Referenz auf ne Referenz???? - da wirds dann langsam unübersichtlich). Ist im Moment bischen schwer zu verstehem für mich....
      Hoffe, ich hab mich halbwegs verständlich ausgedrückt - ist gar nicht so einfach komplexe Abläufe simpel zu erklären.....
      CU
      Ruben

     Antworten

    Beitrag von H.Fehde (724 Beiträge) am Sonntag, 26.Januar.2003, 17:34. WWW: bei123.de
    Re: @CB oder Sander do_all Fehlermeldung

      Vielleicht hilft Dir ja sowas weiter - so ähnlich, als wenn man die Subroutine hart einbaut.

      <perl>
      out <<EOF;
      <table width=350 align=center border=1 bordercolor=red><tr><td align=center>Hier folgt die Eigentliche Ausgabetabelle</td></tr></table>
      <table border=1 bordercolor=darkviolett width=400><tr><td bgcolor=lightcyan>Nun die DB-Ausgabe<br>
      EOF
      $do_all=&_doall("db=w_news");
      eval $do_all;
      out <<EOF;
      </td</tr><table>
      EOF
      

      sub _doall
      {
      $do="";
      eval {$do="do_all '$_[0]'"};
      return($do);
      }
      </perl>
      

      ;-) Harald

     Antworten

    Beitrag von hempelr (1976 Beiträge) am Montag, 27.Januar.2003, 07:45.
    Re: @CB oder Sander do_all Fehlermeldung

      Hallo, Harald,
      das ist ein interessanter Weg, der offensichtlich das Problem lösen kann - Danke!
      Muß mir das erst mal noch genau durch den Kopf gehen lassen und richtig verstehen, aber es funktioniert.

      Der Hintergrund ist "einfach" der, daß ich mir nicht die Mühe machen will, komplette eigene Eingabeformulare und Ausgaben zu basteln, sondern halt die schöne einfachen bp-interne Bearbeitungsmöglichkeit von DB-Inhalten je nach Rechtevergabe dynamisch zur Ausgabe bringen will. Das eval deshalb, weil je nachdem, ob eine Datenbank und Nutzerrechte darauf vorhanden sind, die zugehörige Sub zur Bearbeitung dynamisch generiert wird (besser ausgeführt; der Inhalt steht in nem DB-Feld einer art "globalen" Datenbank) und ist im Hauptscript referenziert.
      Na dann, mal sehn, ob ichs so hinkriege, wie ich wollte
      CU
      Ruben

     Antworten

    Beitrag von H.Fehde (724 Beiträge) am Montag, 27.Januar.2003, 12:54.
    Re: Variante do_all

      Hallo Ruben,

      ich machs bei vielen meiner Anwendungen genauso bis hin zu der Möglichkeit, ganze Subroutinen in Config-Datein zu speichern und erst beim Programmlauf abarbeiten zu lassen - da gibst clevere Möglichkeiten.

      Nach Deiner Beschreibung denke ich mir, daß die folgende Variante vielleicht noch besser geignet ist, da man dabei den ganzen do_all-Tag übergeben kann.
      ....
      $do_all=&_doall("do_all 'db=Datei Name==xyz sort=-abc','sid=0101010','key=input'");#--------- z.B.
      eval $do_all;
      
      ....
      Die Sub sieht dannn so aus:

      sub _doall
      {
      $do="";
      eval {$do="@_"};
      return($do);
      }
      

      Gruß Harald

     Antworten

    Beitrag von hempelr (1976 Beiträge) am Montag, 27.Januar.2003, 17:08.
    Danke - probiers mal zu verstehen - war Re: Variante do_all (NT)


     Antworten

    Beitrag von hempelr (1976 Beiträge) am Dienstag, 4.Februar.2003, 17:34.
    Danke - war Re: Variante do_all

      Hallo, Harald,
      danke für den Tipp, das war ein richtig guter.
      Hat zwar bald nen ganzen Tag gedauert, bis ichs halbwegs begriffen habe, aber nun bin ich soweit, daß es mal eingebaut wird.
      Vielleicht krieg ichs so hin, daß es dann wirklich ziemlich "universell" zu verwenden geht.
      Dein Ansatz und die Realisierung sind echt stark - fast genauso zu nutzen, wie ich das wollte (irgendwie geht das Interpolieren in ner EOF-Ausgabe nicht wie gewünscht, aber das läßt sich umgehen)

      Nochmal Danke
      Ruben

     Antworten


     
 Liste der Einträge von 40950 bis 41100:Einklappen Zur Eingabe 
Neueste Einträge << 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | Neuere Einträge < Zur Eingabe  > Ältere Einträge | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 >> Älteste Einträge


Zurück zur Homepage

© baseportal.de. Alle Rechte vorbehalten. Nutzungsbedingungen



powered in 0.10s by baseportal.de
Erstellen Sie Ihre eigene Web-Datenbank - kostenlos!