Kurt D.: Script bitte ansehen und auf Fehler aufmerksam machen!

Hallo Leute,

lang, lang ist's her...
Ich hab da mal ein Script geschrieben und würde nun gerne wissen, ob die PHP-Kenner unter euch da noch Verbesserungswürdiges entdecken können.
<code><?php
$info_box_contents = array();
$info_box_contents[] = array('text' => BOX_HEADING_INFORMATION);

new infoBoxHeading($info_box_contents, false, false);

$info_box_contents = array();
$info_box_name = array( FILENAME_MANUFACTURERS,
                         FILENAME_RETURN,
                         FILENAME_SHIPPING,
                         FILENAME_CONDITIONS,
                         FILENAME_RG,
                         FILENAME_IMPRESS,
                         FILENAME_PRIVACY,
                         FILENAME_CONTACT_US,
                         FILENAME_PDF_CATALOGUE,
                         FILENAME_FAQ );

$info_box_text = array( BOX_INFORMATION_MANUFACTURERS,
                         BOX_INFORMATION_RETURN,
                         BOX_INFORMATION_SHIPPING,
                         BOX_INFORMATION_CONDITIONS,
                         BOX_INFORMATION_RG,
                         BOX_INFORMATION_IMPRESS,
                         BOX_INFORMATION_PRIVACY,
                         BOX_INFORMATION_CONTACT,
                         BOX_INFORMATION_PDF_CATALOGUE,
                         BOX_INFORMATION_FAQ );
$n = count($info_box_name);
$sitepath = parse_url($_SERVER['PHP_SELF']);
for ($i=0; $i<$n; $i++) {
     if (in_array(DIR_WS_HTTP_CATALOG . $info_box_name[$i],$sitepath)) {
        $file_name = tep_image(DIR_WS_IMAGES . 'pointer_blue.gif', '') . '<span class="errorText"><b>' . $info_box_text[$i] .'</b></span>';
     } else {
        $file_name = '<a href="' . tep_href_link($info_box_name[$i]) . '">' . tep_image(DIR_WS_IMAGES . 'pointer_blue_light.gif', '') . $info_box_text[$i] . '</a>';
     }
     if ($i<$n-1) {
        $file_name .= '<br>';
     }
     $info_box_string = $info_box_string . $file_name;
}
$info_box_contents[] = array('text' => $info_box_string);
new infoBox($info_box_contents);
?>
           </td>
         </tr>
<!-- information_eof //--></code>
Das ursprüngliche Scrit erstellte einfach ein Array, ohne auf den aktuellen Pfad und seine Anzeige Rücksicht zu nehmen, d.h., es wurden alle Links immer normal dargestellt, ob nun eine Seite aus der Box aufgerufen wurde, oder nicht.
Das wollte ich dahingehend ändern, daß der aktuell angezeigte Link nun rot, fett und nicht verlinkt dargestellt wird.
Funktionieren tut es, nur wollte ich interessehalber gerne wissen, ob in euen Augen der Aufbau und Ablauf logisch und einfach genug ist.
Einige unter euch werden sich bestimmt noch an mich und meine ersten Gehversuche mit PHP erinnern können, recht viel weiter bin ich aus chronischem Zeitmangel auch jetzt noch nicht. ;)
new infoBoxHeading() und new infoBox() sind ausgelagerte Funktionen, die aus den übergebenen Arrays dann die Box zusammenbauen.

Gruß

Kurt

  1. Hi!

    [...]

      
    
    >  $n = count($info_box_name);  
    >  $sitepath = parse_url($_SERVER['PHP_SELF']);  
    >  for ($i=0; $i<$n; $i++) {  
    >      if (in_array(DIR_WS_HTTP_CATALOG . $info_box_name[$i],$sitepath)) {  
    >         $file_name = tep_image(DIR_WS_IMAGES . 'pointer_blue.gif', '') . '<span class="errorText"><b>' . $info_box_text[$i] .'</b></span>';  
    >      } else {  
    >         $file_name = '<a href="' . tep_href_link($info_box_name[$i]) . '">' . tep_image(DIR_WS_IMAGES . 'pointer_blue_light.gif', '') . $info_box_text[$i] . '</a>';  
    >      }  
    >      if ($i<$n-1) {  
    >         $file_name .= '<br>';  
    >      }  
    >      $info_box_string = $info_box_string . $file_name;  
    >  }  
    >  $info_box_contents[] = array('text' => $info_box_string);  
    >  new infoBox($info_box_contents);  
    > ?>  
    
    

    Ohne jetzt mal tiefer in den Code eingestiegen zu sein, würde ich anstatt der for-Schleife das foreach-Konstrukt verwenden, da diese im Vergleich zu for explizit für das Durchlaufen von Arrays konzipiert und demnach auch schneller ist.

    Grüße,
    Fabian St.

    --
    ---------------------
    fabi@erde ~# whatis spam
    spam: nothing appropriate
    ---------------------
    Selfcode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:( ss:) de:> js:| ch:? mo:) zu:)
    1. Hallo Fabian,

      $n = count($info_box_name);
      $sitepath = parse_url($_SERVER['PHP_SELF']);
      for ($i=0; $i<$n; $i++) {
           if (in_array(DIR_WS_HTTP_CATALOG . $info_box_name[$i],$sitepath)) {
              $file_name = tep_image(DIR_WS_IMAGES . 'pointer_blue.gif', '') . '<span class="errorText"><b>' . $info_box_text[$i] .'</b></span>';
           } else {
              $file_name = '<a href="' . tep_href_link($info_box_name[$i]) . '">' . tep_image(DIR_WS_IMAGES . 'pointer_blue_light.gif', '') . $info_box_text[$i] . '</a>';
           }
           if ($i<$n-1) {
              $file_name .= '<br>';
           }
           $info_box_string = $info_box_string . $file_name;
      }
      $info_box_contents[] = array('text' => $info_box_string);
      new infoBox($info_box_contents);
      ?>

      
      >   
      > Ohne jetzt mal tiefer in den Code eingestiegen zu sein, würde ich anstatt der for-Schleife das [foreach-Konstrukt](http://de.php.net/foreach) verwenden, da diese im Vergleich zu for explizit für das Durchlaufen von Arrays konzipiert und demnach auch schneller ist.  
        
      Das glaub ich dir aufs Wort, allerdings bin ich nicht durchgestiegen, wie ich damit 2 Arrays gleichzeitig durchlaufen sollte.  
      Ich brauche ja bei jedem Teilstring jeweils den expliziten Wert[$i] aus jedem der beiden Arrays und wie ich das mit foreach realisieren könnte, ist mir ein wenig schleierhaft.  
      Im ersten Array ist der Seitenname, im zweiten der Seitentitel gespeichert, woraus dann der Link(oder nicht Link) zusammengebaut wird.  
      Die If-Else- Verzweigungen lassen sich sicherlich auch in einer foreach-Schleife realisieren, aber wie ich die relevanten Werte aus beiden Arrays dort unterbringen sollte, ist mir schleierhaft.  
        
      Gruß  
        
      Kurt  
        
      
      
      1. Hallo Kurt,

        Das glaub ich dir aufs Wort, allerdings bin ich nicht durchgestiegen, wie ich damit 2 Arrays gleichzeitig durchlaufen sollte.

        Beispiel für zwei numerische Arrays:

          
        $eins = array('Bananen',Kirschen.');  
        $zwei = array('Ich esse','und');  
          
        foreach ($zwei as $index => $string) {  
         echo $string.$eins[$index];  
        }  
        # Ausgabe: Ich esse Bananen und Kirschen.  
          
        
        

        Gruß
        Alexander Brock

        --
        SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:? ss:| de:> js:( ch:| sh:( mo:} zu:}
        http://againsttcpa.com
        1. Hi,

          $eins = array('Bananen',Kirschen.');
          $zwei = array('Ich esse','und');

          foreach ($zwei as $index => $string) {
          echo $string.$eins[$index];
          }

          Ausgabe: Ich esse Bananen und Kirschen.

            
          also hier fällt mir sofort ein fehler auf, wenn auch nicht explicit verlangt. Müsste wohl eher:  
          ~~~php
            
          $eins = array('Bananen', 'Kirschen');  
          $zwei = array('Ich esse', 'und');  
            
          foreach ($zwei as $index => $string) {  
            echo $string.$eins[$index];  
          }  
          # Ausgabe: Ich esse Bananen und Kirschen.  
          
          
        2. Hallo Kurt,

          Das glaub ich dir aufs Wort, allerdings bin ich nicht durchgestiegen, wie ich damit 2 Arrays gleichzeitig durchlaufen sollte.

          Beispiel für zwei numerische Arrays:

          $eins = array('Bananen',Kirschen.');
          $zwei = array('Ich esse','und');

          foreach ($zwei as $index => $string) {
          echo $string.$eins[$index];
          }

          Ausgabe: Ich esse Bananen und Kirschen.

            
          Öhm ja, du hast natürlich recht, mit ein wenig nachdenken hätte ich da auch selbst draufkommen können. ;)  
          Aber manchmal ist es einfach so, daß man den Wald vor lauter Bäumen nicht sieht, besonders als Großstädter... \*g\*  
          Dann mach ich mich mal dran, das Ganze umzubauen, vielen Dank euch allen!  
            
          Gruß  
            
          Kurt  
          
          
  2. echo $begrüßung;

    new infoBoxHeading() und new infoBox() sind ausgelagerte Funktionen, die aus den übergebenen Arrays dann die Box zusammenbauen.

    Wenn es Funktionen wären, würde man sie ohne new aufrufen. Mir scheint stattdessen, dass es sich hierbei um eine wenig sinnvolle Verwendung von Klassen handelt.

    Außerdem ist dein Script nicht ein bisschen kommentiert. Gute Kommentare beschreiben, was der Autor im Sinn hatte. Dann kann man auch beurteilen, inwieweit das Programmteil den Intentionen des Autors nahekommt.

    Das ursprüngliche Scrit erstellte einfach ein Array, ohne auf den aktuellen Pfad und seine Anzeige Rücksicht zu nehmen, d.h., es wurden alle Links immer normal dargestellt, ob nun eine Seite aus der Box aufgerufen wurde, oder nicht.
    Das wollte ich dahingehend ändern, daß der aktuell angezeigte Link nun rot, fett und nicht verlinkt dargestellt wird.

    Ein Script macht genau das, was der Autor hingeschrieben hat. Da sich das von dem was bezweckt war unterscheiden kann, muss man als inhaltlicher Korrekturleser wissen, was gewünscht war.
    Diese Erklärung ist wenig hilfreich. Wessen aktueller Pfad ist gemeint? Was hat es mt der Box auf sich? Was verstehst du unter "aktueller Link"?

    Du verwendest Buchstabenfolgen, die man als Funktionen und Konstanten deuten kann. Ohne die Deklaration, kann man im Grunde nur raten, was sich beispielsweise hinter tep_image oder DIR_WS_IMAGES verbirgt. Und das ist zur Beurteilung der Funktionsweise nicht sinnvoll.

    echo "$verabschiedung $name";

    1. Hi,

      Was verstehst du unter "aktueller Link"?

      ich nimm mal an er meint a:active

      MfG

    2. new infoBoxHeading() und new infoBox() sind ausgelagerte Funktionen, die aus den übergebenen Arrays dann die Box zusammenbauen.

      Wenn es Funktionen wären, würde man sie ohne new aufrufen. Mir scheint stattdessen, dass es sich hierbei um eine wenig sinnvolle Verwendung von Klassen handelt.

      JA, hast natürlich recht, es sind Klassen.

      Außerdem ist dein Script nicht ein bisschen kommentiert. Gute Kommentare beschreiben, was der Autor im Sinn hatte. Dann kann man auch beurteilen, inwieweit das Programmteil den Intentionen des Autors nahekommt.

      Das ursprüngliche Scrit erstellte einfach ein Array, ohne auf den aktuellen Pfad und seine Anzeige Rücksicht zu nehmen, d.h., es wurden alle Links immer normal dargestellt, ob nun eine Seite aus der Box aufgerufen wurde, oder nicht.
      Das wollte ich dahingehend ändern, daß der aktuell angezeigte Link nun rot, fett und nicht verlinkt dargestellt wird.

      Ein Script macht genau das, was der Autor hingeschrieben hat. Da sich das von dem was bezweckt war unterscheiden kann, muss man als inhaltlicher Korrekturleser wissen, was gewünscht war.
      Diese Erklärung ist wenig hilfreich. Wessen aktueller Pfad ist gemeint? Was hat es mt der Box auf sich? Was verstehst du unter "aktueller Link"?

      Öhm ja, also, mithilfe des Scriptes wurde aus den definierten Konstanten(sämtliche großgeschriebenen Wörter) eine Navigationsbox zusammengebaut.
      dies geschah einfach durch
      $info_box_contents[] = array('text' => Konstante1 .
                                             Konstante2 .
                                             usw.

      Meine Intention war es nun, daß, wenn ein Link in dieser Box angeklickt wird, dieser rot, fett und nicht verlinkt ausgegeben wird, da die Seite ja aktuell angezeigt wird. Also so eine Art Hinweis in der Navigation, "du bist gerade auf dieser Seite..."
      Da konnte ich mit obigem Array natürlich nix anfangen und habe deshalb die Schleife gebaut, die mir aus den beiden Arrays $info_box_name(pfad) und $info_box_text(Linktext) und dem Wert aus $sitepath die Navigation richtig zusammensetzt. Ist $info_box_name im Array $sitepath vorhanden, dann wird kein Link ausgegeben sondern nur der Linktext, dafür aber rot und fett. anschließend wird noch ein weicher Umbruch angehängt, aber nur, wenn es nicht der letzte Wert aus dem Array ist. Dazu dient die Bedingung if ($i<$n-1).

      Du verwendest Buchstabenfolgen, die man als Funktionen und Konstanten deuten kann. Ohne die Deklaration, kann man im Grunde nur raten, was sich beispielsweise hinter tep_image oder DIR_WS_IMAGES verbirgt. Und das ist zur Beurteilung der Funktionsweise nicht sinnvoll.

      tep_image ist z.B. eine Funktion, genauso wie tep_href_link usw.
      Die Verwendung der Buchstabenfolge "tep_" deutet in dem System immer auf eine Funktion hin, aber ich habe lange gebraucht, zu erkennen, wo ich bei was nachsehen muß, da die Scripte aus zig Einzelteilen bestehen und immer wieder auf externe Scripte verwiesen wird.
      DIR_WS_IMAGES ist eine Konstante.

      Ob die Verwendung von Klassen in diesem Zusammenhang sinnvoll ist, kann ich wirklich nicht beurteilen, dazu fehlt mir ein Riesen Berg an Wissen und Erfahrung. Das ganze stammt aus einem Shopsystem von osCommerce, da ist es für mich schon schwierig genug, einzelne Funktionen nach meinen Wünschen zu überarbeiten, verlange also nicht von mir, zu verstehen, was und wozu das alles mit Klassen realisiert wurde.
      Ich empfinde es für mich als Leistung, daß ich zumindest schon mal so weit bin, die Scripte nach meinen Wünschen anzupassen, alles andere wäre wirklich zu hoch gegriffen.

      Gruß

      Kurt

  3. <?php  
      $info_box_contents = array();  
      $info_box_contents[] = array('text' => BOX_HEADING_INFORMATION);  
      
      new infoBoxHeading($info_box_contents, false, false);  
      
      $info_box_contents = array();  
      $info_box_name = array( FILENAME_MANUFACTURERS,  
                              FILENAME_RETURN,  
                              FILENAME_SHIPPING,  
                              FILENAME_CONDITIONS,  
                              FILENAME_RG,  
                              FILENAME_IMPRESS,  
                              FILENAME_PRIVACY,  
                              FILENAME_CONTACT_US,  
                              FILENAME_PDF_CATALOGUE,  
                              FILENAME_FAQ );  
      
      $info_box_text = array( BOX_INFORMATION_MANUFACTURERS,  
                              BOX_INFORMATION_RETURN,  
                              BOX_INFORMATION_SHIPPING,  
                              BOX_INFORMATION_CONDITIONS,  
                              BOX_INFORMATION_RG,  
                              BOX_INFORMATION_IMPRESS,  
                              BOX_INFORMATION_PRIVACY,  
                              BOX_INFORMATION_CONTACT,  
                              BOX_INFORMATION_PDF_CATALOGUE,  
                              BOX_INFORMATION_FAQ );  
      $num = count($info_box_name);  
      $sitepath = parse_url($_SERVER['PHP_SELF']);  
      foreach ($info_box_name as $index => $value) {  
              if (in_array(DIR_WS_HTTP_CATALOG . $value,$sitepath)) {  
                 $file_name = tep_image(DIR_WS_IMAGES . 'pointer_blue.gif', '') . '<span class="errorText"><b>' . $info_box_text[$index] .'</b></span>';  
              } else {  
                 $file_name = '<a href="' . tep_href_link($value) . '">' . tep_image(DIR_WS_IMAGES . 'pointer_blue_light.gif', '') . $info_box_text[$index] . '</a>';  
              }  
              if ($index<$num-1) {  
                 $file_name .= '<br>';  
              }  
              $info_box_string = $info_box_string . $file_name;  
      }  
      $info_box_contents[] = array('text' => $info_box_string);  
      new infoBox($info_box_contents);  
     ?>  
                </td>  
              </tr>  
     <!-- information_eof //-->
    

    und funktioniert perfekt!

    Danke

    Kurt