Seite 1 von 1

Dynamischer BBCode

Verfasst: 16.07.2010 20:08
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

Re: Dynamischer BBCode

Verfasst: 16.07.2010 21:40
von Pyramide

Re: Dynamischer BBCode

Verfasst: 17.07.2010 19:31
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.

Re: Dynamischer BBCode

Verfasst: 17.07.2010 20:22
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.

Re: Dynamischer BBCode

Verfasst: 17.07.2010 20:39
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).^^

Re: Dynamischer BBCode

Verfasst: 18.07.2010 01:25
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