Dynamischer BBCode

In diesem Forum kann man Fragen zur Programmierung stellen, die bei der Entwicklung von Mods für phpBB 3.0.x oder dem Modifizieren des eigenen Forums auftauchen.
Forumsregeln
phpBB 3.0 hat das Ende seiner Lebenszeit überschritten
phpBB 3.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 3.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf die neuste phpBB-Version, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
Antworten
faraday
Mitglied
Beiträge: 291
Registriert: 22.03.2006 19:45
Wohnort: Wilhelmshaven

Dynamischer BBCode

Beitrag von faraday »

Moin,
ich weiß nicht genau, ob das hier das richtige Forum ist, aber ich versuch's mal. Und zwar möchte ich einen BBCode haben, dessen Funktionsweise durch dynamische Komponenten beeinflusst wird. Simpel ausgedrückt: Ich möchte durch einen BBCode einen Link einfügen, der sich je nach Einstellung ändern (Domain, Pfad etc.) kann.
Wie es aussieht muss ich dafür die bbcode.php und/oder message_parser.php ändern. Aber inwiefern? Weiß jemand, wie sich das bewerkstelligen lässt?

Gruß faraday
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Re: Dynamischer BBCode

Beitrag von Pyramide »

KB:knigge
faraday
Mitglied
Beiträge: 291
Registriert: 22.03.2006 19:45
Wohnort: Wilhelmshaven

Re: Dynamischer BBCode

Beitrag von faraday »

Okay danke. Bis hier hin genau das, was ich brauche. Allerdings verzweifel ich gerade daran, ein "=" einzufügen, wie es bei euch mit der KB geht. Wie habt ihr das dort gemacht?

P.S. ich fände es sogar besser, wenn das Ganze nicht über die Datenbank liefe, sondern im Quellcode implementiert ist, damit ich es nach belieben an- und abstellen kann und nicht irgend ein Trottel den BBCode im ACP versehentlich ändert.
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Re: Dynamischer BBCode

Beitrag von Pyramide »

faraday hat geschrieben:Allerdings verzweifel ich gerade daran, ein "=" einzufügen, wie es bei euch mit der KB geht. Wie habt ihr das dort gemacht?
Einfach über den BBCode-Editor eingegeben Der BBCode wurde noch nicht mal in der Datenbank modifiziert, sondern mit Bordmitteln realisiert:

Code: Alles auswählen

BBCode: [kb={IDENTIFIER}]{TEXT}[/kb]
HTML-Ersetzung: <a href="/kb/{IDENTIFIER}" class="postlink kb-link">{TEXT}</a>
faraday hat geschrieben:P.S. ich fände es sogar besser, wenn das Ganze nicht über die Datenbank liefe, sondern im Quellcode implementiert ist, damit ich es nach belieben an- und abstellen kann und nicht irgend ein Trottel den BBCode im ACP versehentlich ändert.
In deinem Forum haben irgendwelche Trottel Adminrechte? Vielleicht solltest du dann mal überdenken, nach welchen Kriterien du Teammitglieder aufnimmst ;-)

Wenn du es händisch machen willst, dann musst du die entsprechenden regulären Ausdrücke in die Funktion bbcode_second_pass() einbauen. Dann entfallen jedoch die Optimierungen von phpBB, d.h. dein regulärer Ausdruck wird immer ausgeführt, egal ob der BBCode überhaupt genutzt wird oder nicht.
KB:knigge
faraday
Mitglied
Beiträge: 291
Registriert: 22.03.2006 19:45
Wohnort: Wilhelmshaven

Re: Dynamischer BBCode

Beitrag von faraday »

Pyramide hat geschrieben:Einfach über den BBCode-Editor eingegeben Der BBCode wurde noch nicht mal in der Datenbank modifiziert, sondern mit Bordmitteln realisiert:

Code: Alles auswählen

BBCode: [kb={IDENTIFIER}]{TEXT}[/kb]
HTML-Ersetzung: <a href="/kb/{IDENTIFIER}" class="postlink kb-link">{TEXT}</a>
Das heißt also quasi zwei verschiedene BBCodes kreieren: einmal mit "=" und einmal ohne?
Pyramide hat geschrieben:In deinem Forum haben irgendwelche Trottel Adminrechte? Vielleicht solltest du dann mal überdenken, nach welchen Kriterien du Teammitglieder aufnimmst ;-)

Wenn du es händisch machen willst, dann musst du die entsprechenden regulären Ausdrücke in die Funktion bbcode_second_pass() einbauen. Dann entfallen jedoch die Optimierungen von phpBB, d.h. dein regulärer Ausdruck wird immer ausgeführt, egal ob der BBCode überhaupt genutzt wird oder nicht.
Nein, nein. Das wär's noch. :D Ich hab' nichtmal ein Forum (noch nicht). Aber ich bin im Begriff einen Mod zu schreiben. Und wenn jemand, der keine Ahnung davon hat, plötzlich die Einstellung ändert...schwups - alles putt. Für meine Zwecke ist das natürlich ausreichend - aber für'n Mod sollte man die Programmierung so oberflächlich und dynamisch wie möglich machen (finde ich).^^
faraday
Mitglied
Beiträge: 291
Registriert: 22.03.2006 19:45
Wohnort: Wilhelmshaven

Re: Dynamischer BBCode

Beitrag von faraday »

Für die Nachwelt und diejenigen, die Verbesserungsvorschläge haben einmal, wie ich vorgegangen bin:
includes/message_parser.php geöffnet

Code: Alles auswählen

'email'            => array('bbcode_id' => 10,    'regexp' => array('#\[email=?(.*?)?\](.*?)\[/email\]#ise' => "\$this->validate_email('\$1', '\$2')")), 
gesucht und danach eingefügt:

Code: Alles auswählen

'wiki'            => array('bbcode_id' => 99,    'regexp' => array('#\[wiki(=([a-zA-Z0-9-+.,_:]+))?\](.*)\[/wiki\]#iUe' => "\$this->bbcode_wiki('\$2', '\$3')")), 

Code: Alles auswählen

    /**
    * Validate url
    *
    * @param string $var1 optional url parameter for url bbcode: [url(=$var1)]$var2[/url]
    * @param string $var2 url bbcode content: [url(=$var1)]$var2[/url]
    */
    function validate_url($var1, $var2) 
gesucht und davor eingefügt:

Code: Alles auswählen

    /**
    * bbcode_wiki
    */
  function bbcode_wiki($var1, $var2)
  {
    global $config;

    $id = ($var1) ? $var1 : $var2;
    $id = trim($id);

    if(!$config['wiki_bbcode_enabled'] || !$id)
    {
      return '[wiki' . (($var1) ? '=' . $var1 : '') . ']' . $var2 . '[/wiki]';
    }
    $this->parsed_items['wiki']++;
    
        return ($var1) ? '[wiki=' . $this->bbcode_specialchars($id) . ':' . $this->bbcode_uid . ']' . $var2 . '[/wiki:' . $this->bbcode_uid . ']' : '[wiki:' . $this->bbcode_uid . ']' . $this->bbcode_specialchars($id) . '[/wiki:' . $this->bbcode_uid . ']';
  } 
dann includes/bbcode.php geöffnet und

Code: Alles auswählen

                default:
                    if (isset($rowset[$bbcode_id]))
                    { 
gesucht und davor eingefügt:

Code: Alles auswählen

                case 99:
          global $phpbb_root_path, $phpEx, $config;
          
          include($phpbb_root_path . 'includes/functions_wiki.' . $phpEx);

                  $this->bbcode_cache[$bbcode_id] = array(
                      'preg' => array(
                          '#\[wiki:$uid\]((.*?))\[/wiki:$uid\]#se'            => "\wiki_second_pass_replace('\$1')",
                          '#\[wiki=([^\[]+?):$uid\](.*?)\[/wiki:$uid\]#se'    => "\wiki_second_pass_replace('\$1','\$2')",
                      )
                  );
        break; 
und in includes/functions_wiki.php nun die Funktion wiki_second_pass_replace() eingefügt:

Code: Alles auswählen

function wiki_second_pass_replace($var1, $var2='')
{
  global $config, $user;

  if(defined('CORRECT_WIKI_PATH') && $config['wiki_bbcode_enabled'] && $config['wikimod_activate'])
  {
    list($id, $hash) = explode('#',$var1,2);
    
    $id    = cleanID($id);
    $desc  = ($var2) ? $var2 : $id;
    $title = $id;
    $link  = wl($id,null,null,null,true);
    $link .= ($hash) ? '#' . $hash : '';
    
    if(useHeading('content') && p_get_first_heading($id))
    {
      $title = p_get_first_heading($id);
      
      if(!$var2)  $desc = $title;
    }
    
    if(page_exists($id))
    {
      $style = 'style="color: #090 !important"';
    }
    else
    {
      $style = 'style="color: #f30 !important"';
    }

    return '<a ' . $style . ' href="' . $link . '" title="' . $title . '">' . $desc . '</a>';
  }
  
  return "[wiki" . (($var2) ? "=" . $var1 : '') . "]" . (($var2) ? $var2 : $var1) . "[/wiki]";
} 
Vielleicht ist das Ganze ja zu umständlich. Ich lasse mich gerne belehren (vielleicht Methoden zur Klasse bbcode hinzufügen über functions_wiki.php?). Aber ich denke, dass diese Methode Funktionalität und Dynamik gewährleistet.

Gruß faraday
Antworten

Zurück zu „[3.0.x] Mod Bastelstube“