Glossar Addon UPDATE (Jetzt für 4.2 & 4.3)

Alles über die Anwendung und Entwicklung von AddOns.

Glossar Addon UPDATE (Jetzt für 4.2 & 4.3)

Beitragvon Hirbod » 3. Nov 2010, 03:05

Hallo,

da ein Kunde von mir das Glossar-Addon benötigt hat, haben Ralph und ich uns hingesetzt, und das alte Glossar-Addon von Markus Staab noch mal geupdated. Es ist jetzt lauffähig mit Redaxo 4.2 und höher und nutzt nicht mehr das Addon-Framework, sondern rex_list und rex_form.

Das Addon zeichnet alle Wörter auch nur noch 1 mal pro Seite aus, d.h. wenn das Wort "test" im Glossar steht, und auf einer Seite das Wort test 10 mal vorkommt, wird es nur einmal ausgezeichnet.

Ich hoffe das Addon hilft euch.

Download unter: http://www.redaxo.de/180-0-addon-detail ... don_id=819


Feedback gerne gesehen.

Todo:
- Sprachen automatisch erkennen (wird aktuell in der install.sql angelegt)
- Validierung der Formularfelder (aktuell kann man auch leere Einträge anlegen)

Kleines Update gibts die Tage

Viel Spaß damit

http://www.redaxo.de/180-0-addon-detail ... don_id=819
Hirbod
 
Beiträge: 369
Registriert: 15. Jan 2008, 13:46

Re: Glossar Addon UPDATE (Jetzt für 4.2 & 4.3)

Beitragvon Phoenix H. » 11. Mai 2011, 09:52

Ich habe das Addon installiert, leider werden dort eigene Begriffe garnicht erkannt und mit dem <abbr> Tag übersetzt.
Ich find ein CMS gut.
Phoenix H.
 
Beiträge: 520
Registriert: 21. Sep 2006, 16:39

Re: Glossar Addon UPDATE (Jetzt für 4.2 & 4.3)

Beitragvon Phoenix H. » 17. Mai 2011, 10:19

Anybody?
Ich find ein CMS gut.
Phoenix H.
 
Beiträge: 520
Registriert: 21. Sep 2006, 16:39

Re: Glossar Addon UPDATE (Jetzt für 4.2 & 4.3)

Beitragvon Hirbod » 19. Mai 2011, 11:31

Stelle gleich ein Update bereit ;)

Edit:
Version 2.3 ist online und behebt ein paar Probleme :)
Hirbod
 
Beiträge: 369
Registriert: 15. Jan 2008, 13:46

Re: Glossar Addon UPDATE (Jetzt für 4.2 & 4.3)

Beitragvon Sloew » 25. Mai 2011, 12:23

Hi,

ich habe das Addon so weit ganz gut zum laufen gebracht. Aber bei mir werden leider links und Überschriften auch erkannt d.h. wenn ich auf eine Seite verlinke deren Name ein Schlüsselwort aus dem Glossar enthält wird dieses ersetzt und der Link funktioniert nicht mehr.

Ich habe schon in der function_replace.inc.php den "a" tag auf genommen habe aber das gefühl das die Zeilen (Zeile 22)
Code: Alles auswählen
if (preg_match_all('/(<ul class=\"accordion\">(.*?)<\/ul>)/s', $body, $mtchs)
or preg_match_all('/(<div class=\"fachbereich_title\">(.*?)<\/div>)/s', $body, $mtchs)
or preg_match_all('/(<div class=\"praxen_element\">(.*?)<\/div>)/s', $body, $mtchs)
or preg_match_all('/(<div class=\"fachbereich_children_wrapper\">(.*?)<\/div>)/s', $body, $mtchs)
or preg_match_all('/(<div class=\"glossar_result\">(.*?)<\/div>)/s', $body, $mtchs)
or preg_match_all('/(<span class=\"noglossar\">(.*?)<\/span>)/s', $body, $mtchs)
or preg_match_all('/(<body id=\"noglossar\">(.*?)<\/body>)/s', $body, $mtchs)
or preg_match_all('/(<div id=\"noglossar\">(.*?)<\/div>)/s', $body, $mtchs)
or preg_match_all('/(<li class="angebot_element" .*?>(.*?)<\/li>)/s', $body, $mtchs)
or preg_match_all('/(<h2.*?>(.*?)<\/h2>)/s', $body, $mtchs)
or preg_match_all('/(<h3.*?>(.*?)<\/h3>)/s', $body, $mtchs)
or preg_match_all('/(<a *?>(.*?)<\/a>)/s', $body, $mtchs)
or preg_match_all('/(<div class=\"noglossar\">(.*?)<\/div>)/s', $body, $mtchs))


nicht wirklich zur verwendung kommen.

Hoffe es kann jemand damit was anfangen
Liebe Grüße Slöw
Sloew
 
Beiträge: 5
Registriert: 1. Aug 2007, 15:02

Re: Glossar Addon UPDATE (Jetzt für 4.2 & 4.3)

Beitragvon frood » 27. Jul 2011, 11:16

Moin!
Mir geht es hier genauso, die ausgeschlossenen Tags werden recht willkürlich oder garnicht berücksichtigt.
Wenn ich <a>-Tags aufnehme
Code: Alles auswählen
preg_match_all('/(<a.*?>(.*?)<\/a>)/s', $body, $mtchs)

werden in der Navi sogar Begriffe innerhalb der URL (RealURL) "geglossart", was natürlich Fehler in der Ausgabe verursacht.

Ist es vielleicht irgendwie machbar, die Routine umzukehren, also nicht bestimmte Tags ausschliessen, sondern nur bestimmte Tags zuzulassen, wie z.B. <p>, <li> oder <div id="content">. Und dabei vielleicht <a>-Tags generell auszuschliessen?

Gruss, Marc

EDIT: Habe gerade festgestellt, dass die Probleme kommen, wenn ein Begriff mehrmals auf einer Seite erscheint, also z.B. im Text und in der Navi. Auch wenn hier beide Bereiche ausgeschlossen werden, funktioniert es immer nur für einen ....
frood
 
Beiträge: 86
Registriert: 7. Okt 2008, 14:17

Re: Glossar Addon UPDATE (Jetzt für 4.2 & 4.3)

Beitragvon Hirbod » 27. Jul 2011, 15:41

Hallo frood,

das ist Absicht. Das erste Glossar-Addon hat immer _alle Tags_ gekennzeichnet, auch wenn ein und dasselbe Wort auf einer Seite 5 mal vorgekommen ist. Das wurde geändert. Jedes Wort wird pro Seite nur ein einziges mal "geglossart". Die Routine kann man jedoch recht einfach ändern..

LG
Hirbod
Hirbod
 
Beiträge: 369
Registriert: 15. Jan 2008, 13:46

Re: Glossar Addon UPDATE (Jetzt für 4.2 & 4.3)

Beitragvon frood » 27. Jul 2011, 16:03

Hallo Hirbod,
ist
Hirbod hat geschrieben:das ist Absicht

das ist mir schon klar, ist ja auch sinvoll und gut. ich wollte nur sagen, dass das Problem mit der Nicht-Erkennung nur auftaucht, wenn eine Seite mehrere Glossar-Begriffe enthält. Es müssen nichtmal dieselben sein. Ein Beispiel:

Code: Alles auswählen
<div id="nav">
    <ul class="nav1"><li><a>---GLOSSARBEGRIFF_1---</a></li></ul>
    <ul class="nav1"><li><a>---GLOSSARBEGRIFF_2---</a></li></ul>
</div>

wenn ich jetzt beide ausschließe:
Code: Alles auswählen
        preg_match_all ('/(<ul class=\"nav1\">(.*?)<\/ul>)/s', $body, $mtchs) or
        preg_match_all ('/(<ul class=\"nav2\">(.*?)<\/ul>)/s', $body, $mtchs)

funktioniert der ausschluss nur für den ersten (nav1)!
frood
 
Beiträge: 86
Registriert: 7. Okt 2008, 14:17

Re: Glossar Addon UPDATE (Jetzt für 4.2 & 4.3)

Beitragvon frood » 28. Jul 2011, 12:44

So, jetzt hab ich es hinbekommen:
Das Array $mtchs wurde nicht korrekt gefüllt ( wegen if ... or ). Dadurch kam bei

Code: Alles auswählen
    foreach ($mtchs[2] as $key => $mtch)
    {
      $back_srch[$key] = '###SPACER###' . $key . '###';
      $back_rplc[$key] = $mtch;
      $body = str_replace($mtch, '###SPACER###' . $key . '###', $body);
    }

immer nur ein Treffer raus. (Wenn man in der function die Wiederherstellung des Body auskommentiert sieht man im Frontend, dass nur einer der definierten Ausschlussbereiche durch den spacer ersetzt wird).

So funktioniert der Ausschluß:

Code: Alles auswählen
  // Bereiche ersetzen, in denen keine Glossarersetzungen durchgefuehrt werden sollen
  $back_srch = array ();
  $back_rplc = array ();
  $mtchs = array ();

   preg_match_all ('/(<ul class=\"nav1\">(.*?)<\/ul>)/s', $body, $mtchs[0] ) ;
   preg_match_all ('/(<ul class=\"nav2\">(.*?)<\/ul>)/s', $body, $mtchs[1] ) ;
   preg_match_all ('/(<p id=\"topline\">(.*?)<\/p>)/s', $body, $mtchs[2] ) ;       
   preg_match_all('/(<h1.*?>(.*?)<\/h1>)/s', $body, $mtchs[3] ) ; 
   preg_match_all('/(<h2.*?>(.*?)<\/h2>)/s', $body, $mtchs[4] ) ; 
   preg_match_all ('/(<ul class=\"accordion\">(.*?)<\/ul>)/s', $body, $mtchs[5] ) ;

    for ($key=0; $key < count($mtchs); $key++)
    {
      $back_srch[$key] = '###SPACER###' . $key . '###';
      $back_rplc[$key] = $mtchs[$key][0][0];
      $body = str_replace($mtchs[$key][0][0], '###SPACER###' . $key . '###', $body);
    }

Einige kleine Anregungen:

1. Glossareinträge als normale Artikel über ein neues Modul "Glossar-Eintrag" anlegen und über die Modul-ID ausgelesen. So läßt sich das komplette Glossar zusätzlich als formatierte, sortierbare Liste ausgeben (ca. Zeile 40):

Code: Alles auswählen
$sql->setQuery('SELECT * FROM rex_article_slice WHERE modultyp_id = ###_MODUL-ID_###  AND clang = '.$REX['CUR_CLANG'].' ORDER BY id DESC');

Die Glossarliste selbst habe ich mittels Abfrage der Cat-ID über <body id="noglossar"> ausgeschlossen, damit hier nicht im Glossar "geglossart" wird. :lol:

2. Statt über den title-Tag die Erklärung über einen Tooltip ausgeben (z.B. über dieses Script: http://www.walterzorn.de/tooltip/tooltip.htm. So kann man die Erklärung schön formatieren und auch mit Bildern versehen. Dazu muss die Varialbe $replaceformat geändert werden (ca. ab Zeile 57) ...

Code: Alles auswählen
  $replaceformat = '<' . $replacetag . ' class=\"abbr\"  onmouseover=\"Tip(\'&lt;div class=&quot;gl_tooltip&quot;&gt;%desc%&lt;/div&gt;\')\" onmouseout=\"UnTip()\">%short%</' . $replacetag . '>';

... und natürlich müssen auch die Einzelteile in der folgenden for-Schleife der neuen Tabelle angepasst werden (die Beschreibung muss zusätzlich von Sonderzeichen bereinigt werden):

Code: Alles auswählen
    $language = htmlspecialchars($sql->getValue('clang'));
    $shortcut = htmlspecialchars($sql->getValue('value1'));
    $description = $sql->getValue('value2');
       $description = str_replace('<br />','',$description);
       $description = str_replace('/','&#47;',$description);
       $description = str_replace('"','&quot;',$description);
       $description = preg_replace("/\r|\n/s", "", $description);

Jetzt wäre noch interessant zu erreichen, dass ein Begriff beim ersten Auftauchen erklärt wird, und nicht beim letzten .... also weiter gehts!

Gruss, Marc

Edit: Bei $description fehlte noch der str_replace für Anführungszeichen .... ist ergänzt.
frood
 
Beiträge: 86
Registriert: 7. Okt 2008, 14:17

Re: Glossar Addon UPDATE (Jetzt für 4.2 & 4.3)

Beitragvon frood » 28. Jul 2011, 18:47

Noch eine Frage an den Entwickler: Wozu dient diese Zeile (Zeile 78):

Code: Alles auswählen
$search .= 'i';

Diese hatte bei mir den Effekt, dass Startseiten mit einem Glossar-Begriff als Kat-Name gar nicht angezeigt wurden ... warum auch immer. ( ... hat mich Stunden gekostet herauszufinden, dass diese Zeile schuld ist ... )
Wozu war die gedacht und welchen Effekt hatte $casesense (ist ja inzwischen auskommentiert) ?

Ansonsten läuft es jetzt rund! Ein schönes Addon! (Lob muss ja auch mal sein!)

Gruss, Marc
frood
 
Beiträge: 86
Registriert: 7. Okt 2008, 14:17

Re: Glossar Addon UPDATE (Jetzt für 4.2 & 4.3)

Beitragvon frood » 29. Jul 2011, 09:53

Hallo Hirbod,
ich habe Probleme zu erreichen, dass bei mehrfachem Vorkommen eines Begriffs der erste "geglossart" wird und nicht der letzte. Hast Du einen Tipp für mich? Oder irgend jemand sonst?

Gruss
Marc
frood
 
Beiträge: 86
Registriert: 7. Okt 2008, 14:17

Re: Glossar Addon UPDATE (Jetzt für 4.2 & 4.3)

Beitragvon Hirbod » 9. Aug 2011, 17:15

Hi frood,

verstehe die Problematik. Diesen Case hatte ich bisher nicht... Zumindest hat sich noch keine beschwert. Hab gerade keine Zeit in den Code zu schauen, aber die Worte werden doch vorher in ein array gespeichert, oder irre ich mich? (habs echt vergessen :D)

Wenns so is, wäre das Problem eigentlich schnell mit nem array_reverse (http://php.net/manual/de/function.array-reverse.php) erledigt. Außer ich hab gerade nen Gedankenfehler.

Ich schaus mir später noch mal an.

LG
Hirbod

EDIT:

foreach ($mtchs[2] as $key => $mtch)
{
$back_srch[$key] = '###SPACER###' . $key . '###';
$back_rplc[$key] = $mtch;
$body = str_replace($mtch, '###SPACER###' . $key . '###', $body);
}


sieht zumindest so aus ;). Kehr das Array mal um, dann gehts wohl. Is dirty, aber sollte schnell umzusetzen sein :)

LG
Hirbod
Hirbod
 
Beiträge: 369
Registriert: 15. Jan 2008, 13:46

Re: Glossar Addon UPDATE (Jetzt für 4.2 & 4.3)

Beitragvon frood » 10. Aug 2011, 12:17

... da hast Du mich wohl mißverstanden. Mit Deinem Script kehre ich ja nur die Reihenvolge beim Ausschluss bestimmter Bereiche um, was ja letztendlich auf dasselbe Ergebnis hinauslaufen dürfte....
Was ich erreichen will, ist Folgendes:

Anstatt:


Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.

... hätte ich gerne:

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.

... wobei das fette Lorem ipsum der Glossar-Begriff ist.
Es soll also das erste Auftauchen im Inhalt "geglossart" werden!

Gruss, Marc
frood
 
Beiträge: 86
Registriert: 7. Okt 2008, 14:17

Re: Glossar Addon UPDATE (Jetzt für 4.2 & 4.3)

Beitragvon Hirbod » 10. Aug 2011, 17:37

Hi,

verstehe.. Dafür müsste ich jedoch mal ne ruhige Minute haben. Wäre auch ganz nett, wenn man sowas über das AddOn später mal einstellen könnte, weil verkehrt wäre das nicht. Wird auch öfter benutzt wie es scheint. Deine eingebrachten Änderungen sind auch sinnvoll, könnte man eventuell implementieren.

LG
Hirbod
Hirbod
 
Beiträge: 369
Registriert: 15. Jan 2008, 13:46

Re: Glossar Addon UPDATE (Jetzt für 4.2 & 4.3)

Beitragvon frood » 11. Aug 2011, 10:38

Ich hab noch ein Problem gefunden:
Bei meiner Modifikation
Code: Alles auswählen
      // Bereiche ersetzen, in denen keine Glossarersetzungen durchgefuehrt werden sollen
      $back_srch = array ();
      $back_rplc = array ();
      $mtchs = array ();

       preg_match_all ('/(<ul class=\"nav1\">(.*?)<\/ul>)/s', $body, $mtchs[0] ) ;
       preg_match_all ('/(<ul class=\"nav2\">(.*?)<\/ul>)/s', $body, $mtchs[1] ) ;
       preg_match_all ('/(<p id=\"topline\">(.*?)<\/p>)/s', $body, $mtchs[2] ) ;       
       preg_match_all('/(<h1.*?>(.*?)<\/h1>)/s', $body, $mtchs[3] ) ;
       preg_match_all('/(<h2.*?>(.*?)<\/h2>)/s', $body, $mtchs[4] ) ;
       preg_match_all ('/(<ul class=\"accordion\">(.*?)<\/ul>)/s', $body, $mtchs[5] ) ;

        for ($key=0; $key < count($mtchs); $key++)
        {
          $back_srch[$key] = '###SPACER###' . $key . '###';
          $back_rplc[$key] = $mtchs[$key][0][0];
          $body = str_replace($mtchs[$key][0][0], '###SPACER###' . $key . '###', $body);
        }

... wurden zwar alle ausgeschlossenen Bereiche durch Spacer ersetzt, aber jeweils nur einmal! Das fiel erstmal nicht auf, weil die meisten Bereiche nur einmal vorkommen ( z.B. <ul class="nav1"> oder <h1>). Anders sieht es aus bei Links. Diese sind ja oft mehrmals zu finden, also muss nicht nur der $key durchlaufen werden, sondern zu jedem $key auch jedes Vorkommen im body. Also muss der o.g. Bereich nochmals ersetzt werden durch:

Code: Alles auswählen
  // Bereiche ersetzen, in denen keine Glossarersetzungen durchgefuehrt werden sollen
  $back_srch = array ();
  $back_rplc = array ();
  $mtchs = array ();

   preg_match_all ('/(<ul class=\"nav1\">(.*?)<\/ul>)/s', $body, $mtchs[0] ) ;
   preg_match_all ('/(<ul class=\"nav2\">(.*?)<\/ul>)/s', $body, $mtchs[1] ) ;
   preg_match_all ('/(<ul class=\"nav3\">(.*?)<\/ul>)/s', $body, $mtchs[2] ) ;
   preg_match_all ('/(<p id=\"topline\".*?\/p>)/s', $body, $mtchs[3] ) ;     
   preg_match_all ('/(<ul class=\"accordion\">(.*?)<\/ul>)/s', $body, $mtchs[4] ) ;   
   preg_match_all('/(<h1.*?\/h1>)/s', $body, $mtchs[5] ) ; 
   preg_match_all('/(<h2.*?\/h2>)/s', $body, $mtchs[6] ) ; 
   preg_match_all ('/(<a.*?\/a>)/s', $body, $mtchs[7] ) ;
   preg_match_all ('/(<img.*?\/>)/s', $body, $mtchs[8] ) ;     
   preg_match_all ('/(<script.*?\/script>)/s', $body, $mtchs[9] ) ;

   //Spacer-Zaehlwerk auf 0
   $spacerkey=0;     
   
   for ($key=0; $key < count($mtchs); $key++) // fuer alle ausgeschlossenden Strings ...
   {
      for ($key2=0; $key2 < count($mtchs[$key][0]); $key2++) // ... und jeweils alle Fundorte
      {            
        $back_srch[$spacerkey] = '###SPACER###' . $spacerkey . '###';
        $back_rplc[$spacerkey] = $mtchs[$key][0][$key2];
        $body = str_replace($mtchs[$key][0][$key2], '###SPACER###' . $spacerkey . '###', $body);
              
        //Spacer-Zaehlwerk einen hoch
        $spacerkey++;
      }   
   }

Welche Bereiche ausgeschlossen werden sollen, kann natürlich jeder selbst definieren.
Was mir allerdings wichtig erscheint ist, dass man bei Links nicht nur den Bereich zwischen <a> und </a>, sondern alles zwischen <a und /a> ausschliesst, damit nicht innerhalb der href oder des title "geglossart" wird, was sofort Ausgabefehler verursacht! Ähnliches gilt für img, und natürlich nicht die Javascripts vergessen und evtl. oject-Tags, wenn verwendet.

Gruss, Marc (Nervensäge vom Amt :mrgreen: )
frood
 
Beiträge: 86
Registriert: 7. Okt 2008, 14:17

Nächste

Zurück zu AddOns [R4]

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast