Felix Riesterer: Icon austauschen

Beitrag lesen

Lieber Bernd,

es geht Dir offensichtlich um eine URL-sensitive Bebilderung/Icon-Auswahl. Daher würde ich ähnlich wie @Rolf B eine Funktion benutzen, aber nicht nur innerhalb der <li>, sondern für die gesamte Liste.

Desweiteren würde ich dafür überhaupt keine img-Elemente verwenden (Du vergisst bei ihnen jedes Mal das zwingend erforderliche alt-Attribut!), sondern nur Klassennamen vergeben, die mithilfe von passenden Gestaltungsregeln mit CSS dann die Icons verpasst bekommen:

<ul id="next">
  <li><a href="step-01.php">Grundinformationen</a></li>
  <li><a class="current" href="step-02.php">Rechnungsdetails</a></li>
  <li><a href="step-03.php">Ansprechpartner</a></li>
  <li><a href="step-04.php">Sonstiges</a></li>
</ul>

Damit das mit PHP erreicht werden kann, bietet sich etwas in dieser Art an:

function create_navi_list () {
  $html = '';
  $pages = array(
    'Grundinformationen',
    'Rechnungsdetails',
    'Ansprechpartner',
    'Sonstiges'
  );

  for ($i = 0; $i < count($pages); $i++) {
    $step = sprintf('step-%02d.php', $i +1);

    $html .= sprintf(
      '<li><a %1$Shref="%2$s">%3$s</a></li>',
      ($_SERVER['PHP_SELF'] == $step ? 'class="current" ' : ''),
      $step,
      $pages[$i]
    );
  }

  return sprintf('<ul id="next">1$s</ul>', $html);
}

In Deinem CSS-Code steht dann etwas in dieser Art:

#next a {
  background: url(img/icons/next.png) left center no-repeat;
  padding-left: 1em;
}

#next a.current {
  background-image: url(img/icons/next-green.png);
}

oder mache ich es wieder viel zu kompliziert?

Wie ich finde, machst Du es noch nicht kompliziert genug. Warum verwendest Du PHP-Scriptdateien mit den Namen "step-0n.php"? Warum verwendest Du nicht nur eine, in der die Logik für alle Schritte enthalten ist? Und wenn Du mehrere Dateien haben willst, um z.B. besseren Überblick zu behalten, warum werden die dann nicht von einem zusätzlichen Script verwaltet, das dann "weiß", was die jeweiligen Scripte leisten, um die Variable $pages in meinem Beispiel automatisch zu befüllen?

Man kann ein PHP-Script so aufrufen: /path/to/my/script.php.
Das geht aber auch auf diese Art: /path/to/my/script.php/und/noch/Quatsch/mit/Soße,
wobei der Zusatz "/und/noch/Quatsch/mit/Soße" nicht stört. Das kann man sich zunutze machen und in einem PHP-Script auswerten. Deine Links könnten so aussehen:

  • /index.php/info
  • /index.php/details
  • /index.php/contact
  • /index.php/more

Was bisher Deine Scripte "step-01.php" usw. waren, sind nun passende include-Anweisungen:

// reduce "/path/to/index.php/step-01" to "step-01"
$step = preg_replace('~.*/~', '', $_SERVER['REQUEST_URI']);

if (is_file(__DIR__."/$step.php")) {
  include(__DIR__."/$step.php");
}

Ein grundsätzlich blöder Nachteil ist, dass man ja die einzelnen PHP-Scripte noch immer direkt aufrufen kann, anstatt über das zentrale Script "index.php". Da wäre es dann tatsächlich besser, wenn die einzelnen Scripte in "index.php" integriert wären. Das geht, indem man das, was in einer externen Script-Datei stand, in eine jeweilige Funktion packt:

function info () {
  $html = "";

  ...

  return $html;
}

function details () {
  $html = "";

  ...

  return $html;
}

function contact () {
  ...
}

function more () {
  ...
}

// don't allow any other functions!
$allowed = array('info', 'details', 'contact', 'more');

// default HTML code
$html = file_get_contents(__DIR__.'/start.html');

// what is requested?
$page = preg_replace('~.*/index\.php/~', '', $_SERVER['REQUEST_URI']);

if (in_array($page, $allowed)) {
  $html = {$page}();
}

echo $html;

Vielleicht ist ja etwas für Dich dabei, von dem Du findest, dass es Dir das Leben leichter macht?

Liebe Grüße,

Felix Riesterer.