Page 1 sur 2

Smart Links

Posté: 30 août 2026 08:21
par admin
Voici le zip de l'extension Smart Links qui affiche le titre du sujet au lieu de l'URL interne et qui ouvre les liens distants dans un nouvel onglet. Aucun souci avec le fonctionnement de cette extension. A la prévisualisation du sujet le titre du sujet ne s'affiche pas, c'est l'URL interne qui est affichée. Une fois le message publié l'URL interne est remplacée par le titre du sujet. J'aimerais pouvoir lire le titre du sujet de l'URL interne à la prévisualisation.

Smart Links

Posté: 30 août 2026 08:26
par admin
Depuis la 1.0.0, il y a effectivement peu de changements fonctionnels, mais il y en a un important dans listener.php.

Modifications fonctionnelles

Dans event/listener.php, j'ai ajouté un nouvel événement phpBB :

Code: Tout sélectionner

'core.posting_modify_template_vars' => 'edit_preview',
Cet événement permet d'intervenir sur l'écran de rédaction/prévisualisation. phpBB documente bien cet événement comme permettant de modifier les variables du template de l'écran de publication.

J'ai ensuite ajouté la fonction :

public function edit_preview($event)

Elle :
  1. vérifie que $event['preview'] est actif ;
  2. récupère le message_parser ;
  3. reformate le message avec format_display() ;
  4. récupère ainsi le HTML réellement généré pour la prévisualisation ;
  5. passe ce HTML dans replace_links() ;
  6. réinjecte le résultat dans PREVIEW_MESSAGE.
L'objectif est donc bien de faire :

Prévisualisation :

Le dossier config



Titre du sujet

sans modifier le contenu de la zone de saisie.

Autre petite modification

J'ai légèrement amélioré la regex de replace_links() :

1.0.0 :

href="..."

1.0.1 :

href="..."

ou

href='...'

Donc elle accepte maintenant les deux types de guillemets autour de href.

Voici le fichier listener.php

Code: Tout sélectionner

<?php
/**
 *
 * @package phpBB Extension - Smart Links
 * @copyright (c) 2026 Fred Rimbert
 * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
 *
 */

namespace caforum\smartlinks\event;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class listener implements EventSubscriberInterface
{
    /** @var \phpbb\db\driver\driver_interface */
    protected $db;

    /** @var \phpbb\template\template */
    protected $template;

    public function __construct(
        \phpbb\db\driver\driver_interface $db,
        \phpbb\template\template $template
    )
    {
        $this->db = $db;
        $this->template = $template;
    }

    public static function getSubscribedEvents()
    {
        return [
            'core.viewtopic_modify_post_row' => 'edit_postrow',
            'core.posting_modify_template_vars' => 'edit_preview',
        ];
    }

    /**
     * Returns the topic title from a topic_id or a post_id.
     */
    protected function get_topic_title($id, $type = 't')
    {
        if ($type === 'p')
        {
            $sql = 'SELECT t.topic_title
                FROM ' . POSTS_TABLE . ' p
                INNER JOIN ' . TOPICS_TABLE . ' t
                    ON t.topic_id = p.topic_id
                WHERE p.post_id = ' . (int) $id;
        }
        else
        {
            $sql = 'SELECT topic_title
                FROM ' . TOPICS_TABLE . '
                WHERE topic_id = ' . (int) $id;
        }

        $result = $this->db->sql_query($sql);
        $row = $this->db->sql_fetchrow($result);
        $this->db->sql_freeresult($result);

        return ($row) ? $row['topic_title'] : '';
    }

    /**
     * Replaces internal phpBB link text with the corresponding topic title.
     * The HTML is already rendered here, so this works for both published
     * posts and the formatted preview.
     */
    protected function replace_links($message)
    {
        $pattern = '#<a([^>]+href=(?:"|\')([^"\']*viewtopic\.php\?[^"\']*)(?:"|\')[^>]*)>(.*?)</a>#is';

        return preg_replace_callback($pattern, function ($matches)
        {
            $url = html_entity_decode($matches[2], ENT_QUOTES);
            $title = '';

            if (preg_match('/(?:\?|&)t=(\d+)/', $url, $m))
            {
                $title = $this->get_topic_title((int) $m[1], 't');
            }
            elseif (preg_match('/(?:\?|&)p=(\d+)/', $url, $m))
            {
                $title = $this->get_topic_title((int) $m[1], 'p');
            }

            if (!$title)
            {
                return $matches[0];
            }

            return '<a' . $matches[1] . '>' . htmlspecialchars($title, ENT_QUOTES, 'UTF-8') . '</a>';
        }, $message);
    }

    /**
     * Replace internal link text in the formatted posting preview.
     *
     * The normal posting page keeps MESSAGE as BBCode for the textarea.
     * The actual preview is stored separately in PREVIEW_MESSAGE, so it must
     * be modified directly without touching MESSAGE.
     */
    public function edit_preview($event)
    {
        if (!$event['preview'])
        {
            return;
        }

        $message_parser = $event['message_parser'];

        $preview_message = $message_parser->format_display(
            $event['post_data']['enable_bbcode'],
            $event['post_data']['enable_urls'],
            $event['post_data']['enable_smilies'],
            false
        );

        $this->template->assign_var('PREVIEW_MESSAGE', $this->replace_links($preview_message));
    }

    public function edit_postrow($event)
    {
        $post_row = $event['post_row'];

        if (!empty($post_row['MESSAGE']))
        {
            $post_row['MESSAGE'] = $this->replace_links($post_row['MESSAGE']);
        }

        if (!empty($post_row['SIGNATURE']))
        {
            $post_row['SIGNATURE'] = $this->replace_links($post_row['SIGNATURE']);
        }

        $event['post_row'] = $post_row;
    }
}


Smart Links

Posté: 01 sept. 2026 19:12
par admin
Mise à jour en version 1.0.2

Notes de version
  • Ajout de la compatibilité avec les URL réécrites par l’extension User Friendly URLs de Stoker.
  • Les liens internes utilisant une URL réécrite affichent désormais correctement le titre du sujet.
  • Prise en charge des liens vers une page précise d’un sujet avec conservation de l’ancre (`#p...`).
  • Les URL internes phpBB classiques continuent de fonctionner comme auparavant.
  • Aucun changement dans le fonctionnement des liens externes.

Smart Links

Posté: 01 sept. 2026 19:14
par admin
First post update - version 1.0.2

Release Notes
  • Added compatibility with URLs rewritten by Stoker's User Friendly URLs extension.
  • Internal links using rewritten URLs now correctly display the topic title.
  • Added support for links to a specific page of a topic while preserving the anchor (`#p...`).
  • Standard phpBB internal URLs continue to work as before.
  • No changes to the behavior of external links.

Smart Links

Posté: 02 sept. 2026 19:31
par admin
Mise a jour en version 1.0.3

Notes de version
  • Ajout de la prise en charge des liens internes vers les forums (viewforum.php?f=...).
  • Les liens vers les forums affichent désormais le nom du forum à la place de l’URL.
  • Correction de l’affichage des caractères spéciaux dans les noms de sujets et de forums, notamment le caractère &.

Smart Links

Posté: 02 sept. 2026 19:32
par admin
First post update - version 1.0.3

Release Notes
  • Added support for internal links to forums (`viewforum.php?f=...`).
  • Forum links now display the forum name instead of the URL.
  • Fixed the display of special characters in topic and forum names, particularly the `&` character.

Smart Links

Posté: 03 sept. 2026 16:04
par admin
Mise à jour en version 1.0.4

Notes de version
  • Correction du traitement des liens BBCode avec un texte personnalisé ....
  • Les textes personnalisés sont désormais conservés et ne sont plus remplacés par le titre du sujet ou le nom du forum.
  • Les liens internes sans texte personnalisé continuent d’afficher automatiquement le titre du sujet ou le nom du forum.
  • Amélioration de la détection des URL réécrites par l’extension URL Rewrite de Stoker.
  • Les liens vers les sujets et les forums utilisant des URL réécrites continuent d’afficher correctement leur titre.
  • Les ancres vers une publication spécifique #p... sont conservées.
  • Le comportement des liens externes reste inchangé.

Smart Links

Posté: 03 sept. 2026 16:22
par admin
Merci pour ton retour et pour l’idée. 👍

Pour Smart Links, j’ai volontairement choisi une approche différente : l’extension ne modifie pas le contenu du message enregistré en base de données. Elle détecte les liens internes au moment de l’affichage et remplace uniquement le texte affiché par le titre du sujet ou le nom du forum.

Cela permet de conserver le comportement natif de phpBB et d’éviter d’introduire un format de stockage spécifique à l’extension. En cas de désinstallation de Smart Links, aucun contenu stocké par phpBB n’a besoin d’être converti ou restauré.

Je fais également la distinction entre une URL utilisée seule et un lien avec un texte personnalisé. Par exemple :

https://example.com/viewtopic.php?t=123456

peut être affiché avec le titre du sujet, tandis que :

Voir le sujet

conserve « Voir le sujet » comme texte du lien.

Je pense que cette approche est plus sûre pour une extension destinée à être utilisée sur différents forums phpBB, notamment avec le système de re-parsing et lors de la suppression de l’extension.

Ton idée concernant la détection des liens vers des forums privés et des pièces jointes dans les messages privés est également intéressante. C’est cependant une fonctionnalité distincte qui nécessiterait une gestion plus poussée des permissions phpBB. Je pourrais éventuellement l’envisager séparément dans une future évolution.

Smart Links

Posté: 03 sept. 2026 16:45
par admin
First post update - version 1.0.4

Release Notes
  • Fixed the handling of BBCode links with custom text

    Code: Tout sélectionner

    [url=...]...[/url]
    .
  • Custom text is now preserved and is no longer replaced with the topic title or forum name.
  • Internal links without custom text continue to automatically display the topic title or forum name.
  • Improved detection of URLs rewritten by Stoker’s User Friendly URLs extension.
  • Links to topics and forums using rewritten URLs continue to display their titles correctly.
  • Anchors pointing to a specific post #p... are preserved.
  • The behavior of external links remains unchanged.

Smart Links

Posté: 03 sept. 2026 16:50
par admin
For Smart Links, I deliberately chose a different approach: the extension does not modify the message content stored in the database. It detects internal links when the message is displayed and only replaces the displayed text with the topic title or forum name.
This allows the native phpBB behavior to be preserved and avoids introducing an extension-specific storage format. If Smart Links is uninstalled, no content stored by phpBB needs to be converted or restored.
I also distinguish between a URL used on its own and a link with custom text. For example:

https://example.com/viewtopic.php?t=123456

can be displayed using the topic title, while:

View topic

keeps “View topic” as the link text.

I think this approach is safer for an extension intended to be used on different phpBB forums, particularly with the re-parsing system and when removing the extension.
Your idea about detecting links to private forums and attachments in private messages is also interesting. However, this is a separate feature that would require more advanced handling of phpBB permissions. I may consider it separately as a future enhancement.