Problem bei dynamischer Vergabe von img und div ids

metalhead

Grünschnabel
Hi Leute,
ich stehe im Moment wieder einmal vor einem kleinen Problem.

Ich habe die Parserklasse vom Woltlab board um eine Funktion erweitert, mit der es möglich ist, in einem Beitrag Fertigkeiten zu posten.
D.h. man schreibt z.B. ":ichbineinefertigkeit:" und die Funktion ersetzt diesen Ausdruck durch ein Bild und fügt einen div-Layer hinzu, der eingeblendet wird, wenn man mit der Maus über das Bild fährt.

Die Position des div-Layers wird dabei extern über ein javascript berechnet.

Hier der Quelltext:
PHP:
  function getskills() {
    global $db;
    
    $global_img_dir = "http://www.aventurische-recken.de/images/skill_pics/";

    $query_skills  = "SELECT skill_db.*,skill_arten.saBezeichnung ";
    $query_skills .= "FROM skill_db,skill_arten ";
    $query_skills .= "WHERE skill_db.skillart=skill_arten.id";

    $result = $db->unbuffered_query($query_skills);
    $i = 1;
    
    while ($row = $db->fetch_array($result)) {

      $row['skillpicname'] = $global_img_dir.$row['skillpicname'];

      //Skill==Elite?
      if ($row['elite'] == 1) $bg_color = "background-color:#6B6226;";
      else $bg_color = "background-color:#000000;";

      //Skill Details Teil 1
      $msg  = "<div id=\"skill".$row['id']."_".$i."\" style=\"position: absolute; top: 2px; left:64px;filter:alpha(opacity=93);-moz-opacity:0.93;opacity:0.93;visibility:hidden;".$bg_color."\" width=\"440\">";
      $msg .= "  <table border=0 cellpadding=\"10px\" cellspacing=\"0\" width=\"440\">";
      $msg .= "    <tr>";
      $msg .= "      <td class=\"table_image\" width=\"40\"><img src=\"".$row['skillpicname']."\"></td>";
      $msg .= "      <td class=\"skill_text\">";
      $msg .= "        <span class=\"skill_name\">".$row['skillname'];
      $msg .= "        </span>";
      $msg .= "        <ul class=\"skill_requirements\">";

      //Was wird benötigt? Adrenalin/Energie/Energieregeneration/Wirkungszeit/Wiederaufladezeit
      if ($row['adrenalin']!= 0)           $msg .= "<li><span class=\"skill_infos\">".$row['adrenalin']."</span><img src=\"".$global_img_dir."adrenalin.gif\" class=\"skill_interface\" /></li>";
      if ($row['wiederaufladezeit']!= 0)   $msg .= "<li><span class=\"skill_infos\">".$row['wiederaufladezeit']."</span><img src=\"".$global_img_dir."wiederaufladezeit.gif\" class=\"skill_interface\" /></li>";
      if ($row['wirkungszeit']!= 0)        $msg .= "<li><span class=\"skill_infos\">".$row['wirkungszeit']."</span><img src=\"".$global_img_dir."casttime.gif\" class=\"skill_interface\" /></li>";
      if ($row['energie']!= 0)             $msg .= "<li><span class=\"skill_infos\">".$row['energie']."</span><img src=\"".$global_img_dir."energie.gif\" class=\"skill_interface\" /></li>";
      if ($row['energieregeneration']!= 0) $msg .= "<li><span class=\"skill_infos\">".$row['energieregeneration']."</span><img src=\"".$global_img_dir."ereg.gif\" class=\"skill_interface\" /></li>";

      //Skill Details Teil 2
      $msg .= "        </ul>";
      $msg .= "        <span class=\"skill_desc\">".$row['skillbeschreibung']."<br />( Attribut: ".$row['saBezeichnung']." )</span>";
      $msg .= "      </td>";
      $msg .= "    </tr>";
      $msg .= "  </table>";
      $msg .= "</div>";

      //Anzuzeigendes Bild
      $msg .= "<img onmouseover =\"dragStart('skill".$row['id']."_".$i."','".$row['id']."pic".$i."');\" ";
      $msg .= "onmouseout=\"dragEnd  ('skill".$row['id']."_".$i."');\" ";
      $msg .= "id=\"".$row['id']."pic".$i."\" ";
      $msg .= "src=\"".$row['skillpicname']."\" border=\"0\" alt=\"".$row['skillname']."\">";

      //deutsch
      $this->skill_search[] = "/".$this->preg_quote($row['skillcode'])."/";
      $this->skill_replace[] = $this->breakChar . "{".$this->hash."_".$row['id']."}" . $this->breakChar;

      $this->skill_search2[] = "/{".$this->hash."_".$row['id']."}/";
      $this->skill_replace2[] = $msg;

      //englisch
      $this->eskill_search[] = "/".$this->preg_quote($row['eskillcode'])."/";
      $this->eskill_replace[] = $this->breakChar . "{".$this->hash."_".$row['id']."}" . $this->breakChar;

      $this->eskill_search2[] = "/{".$this->hash."_".$row['id']."}/";
      $this->eskill_replace2[] = $msg;

      $i++;
    }

    $this->done['skills'] = 1;
  }

Soweit so gut, es funktioniert einwandfrei.

ABER: Sobald in einem Thread mehrmals ein und derselbe Ausdruck verwendet wird, erscheint der zugehörige div-Layer immer nur beim ersten Ausdruck.

z.B.:
1. Post: blablablabla :ichbineinefertigkeit: blabla
2. Post: blablabla
3. Post: blabla :ichbineinefertigkeit:

Wenn man mit der Maus über das erscheinende Bild aus Post 3 fährt, wird der div-Layer nicht an der Position vom Bild aus Post 3 angezeigt, sondern an der Position vom Bild aus Post 1.

--> Das Problem ist also, dass meine Funktion alle Daten aus der Datenbank in einem Array speichert und somit nur ein Mal die ids der div-Layer und images festgesetzt werden. Beim ersetzen bekommt also jedes gleiche Bild sowie der zugehörige Layer die gleiche ID.

Hier noch der Quellcode zur Erzeugung des Caches:
PHP:
// cache skills
if ($allowsmilies == 1) {
      if($this->done['skills'] != 1) $this->getskills();

      $post = preg_replace($this->skill_search, $this->skill_replace, $post);
      $post = preg_replace($this->eskill_search, $this->eskill_replace, $post);
}

und der eigentliche replace:
PHP:
// replace skills
if ($allowsmilies == 1) $post = preg_replace($this->skill_search2, $this->skill_replace2, $post);
if ($allowsmilies == 1) $post = preg_replace($this->eskill_search2, $this->eskill_replace2, $post);

Wie könnte ich also, sobald ein Ausdruck mehrfach genutzt wird die id vom div- und img-tag einzigartig machen, damit die Positionierung des Layers richtig funktioniert?

Vielleicht finden wir ja zusammen eine Lösung.
Schonmal Danke im voraus.

Wenn ihr weitere Fragen habt, stellt sie einfach.

Liebe Grüße
metalhead
 
Hallo ich habe mir jetzt dein Kram nicht besonders angeguckt aber es geht doch darum eine eindeutige id dem div-layer zu geben ? Da bietet es sich an die aktuelle id aus der while schleife(db-id) zu verwenden ;)
 
Zurück