Catégories
PHP

Autolinker : un helper CakePHP

CakePHP dispose d’une fonction autolink au sein de son helper Text, mais celle ci reste très limitée (elle détecte une url dans un texte et la transforme en lien). Je vais donc vous proposer un petit helper qui va vous permettre de remplacer automatiquement dans vos textes, de simples mots par des liens avec une belle ancre. Il vous faudra juste comme pré-requis pour ce tuto, savoir comment définir une variable pour l’ensemble des vues dans CakePHP.

Avant de paster du code comme un gros bourrin, je vais vous expliquer les « contraintes » de ce helper.

  • Il ne doit pas linker sur la page courante
  • On peut définir le nombre maximum de remplacement à effectuer dans un texte pour l’intégralité des mots
    avec un seul remplacement par mot

Maintenant que vous savez tout, je peux paster du code comme un gros bourrin 😉

Définition des correspondances anchor/link

– Dans mon fichier {app}/views/app.php je déclare mon tableau de correspondances

<?php
class AppView extends View
{
	public $array_autolinker	=	array(
	42 => array(
	'anchortext' => 'http://www.example.com',
	'super anchortext' => 'http://www.example.com/rulz',
	'anchortext qui pue' => 'http://www.example.com/sux'),
        84 => array(
        'ancre' => 'http://www.site1.com',
        'ancre2' => 'http://www.site2.com'
        'ancre 3' => 'http://www.site3.com'
        )
	);
}
?>

Les Keys du array_autolinker correspondent aux ID des pages/rubriques/produits auxquelles se referrent les liens (donc pour résumé, la ou je ne veux pas effectuer de remplacement).
Les Keys de la seconde dimension de mon tableau correspondent aux mots que je souhaite remplacer (qui deviendront par la suite mes ancres) et les values sont bien sur les urls de destination.
Passons maintenant au helper.

Le Helper Autolinker

Ici on va entrer dans le vif du sujet. Des lignes de code parlant mieux qu’un mec qui sait pas parler, voici le helper.
– {app}/views/helpers/autolinker.php

<?php
class AutolinkerHelper extends Helper
{
 
	/**
	 * Ajoute automatiquement des liens dans les textes
	 *
	 * @param string $text
	 * @param tableau de correspondance ancre/lien array $array_autolink
	 * @param id courant (a exclure) integer $id
	 * @param nombre de remplacement total dans le texte integer $limit
	 * @return string avec les liens inseres
	 */
	function replace($text, $array_autolink, $id, $limit)
	{
		$replacements = 0;
 
		foreach ($array_autolink as $k=>$v)
		{
			if ($k != $id)
			{
 
				foreach ($array_autolink[$k] as $anchor=>$url)
				{
					if (strpos($text, $anchor))
					{
						$text = preg_replace('/ '.$anchor.'\b([ \.\,])/', ' '.$anchor.'$1', $text, 1, $count);
						$replacements += $count;
						if ($replacements == $limit)
						break;
					}
				}
			}
		}
		return $text;
	}
}
?>

Tout est prêt, il ne nous reste plus qu’a l’utiliser dans nos vues.

Utilisation du helper dans les vues

En fonction de l’utilisation que vous ferez de cet helper, soit vous l’appelez dans votre app_controller.php soit uniquement dans les controllers qui se serviront de ce helper.
Note :
Vous pouvez également posséder une table avec les correspondances anchor/link (dans certain cas ça s’avère indispensable), il vous suffira alors par le biais du RequesteHandler de récupérer un tableau préformaté comme celui que l’on utilise dans cet exemple.

Pour l’utiliser dans les vues, je préfère toujours utiliser la version texte du content que je récupère afin d’éviter toute surprise au niveau de l’output. Ce qui donne :

<?php
// La variable $final_text est le texte sur lequel vous souhaitez effectuer le remplacement.
$text2show	= html_entity_decode($final_text, ENT_COMPAT, "UTF-8");
 
// $this->autolinker a été défini au début de cet article dans {app}/views/app.php
// $this->passedArgs[0] correspond à l'id que je souhaite exclure du remplacement
// 5 c'est le nombre de lien max que je souhaite insérer dans mon texte
e($autolinker->replace($text2show, $this->array_autolinker, $this->passedArgs[0], 5));
?>

D’après ce qui est ressorti du barcampBH qui se tenait à Toulouse, il est préférable de ne pas utiliser QUE des ancres optimisée pour votre stratégie de linking. Pour cela, couplez ce helper à la méthode autoLinkUrls du helper Text (c’est un helper du core de cakePHP).

8 réponses sur « Autolinker : un helper CakePHP »

Sympa ce tutorial. Ce framework est vraiment puissant ! Je vais de ce pas tester.

@512banque:
Si c’est pas pour changer les pneus 242 pouces d’un monster truck, c’est que j’ai rien compris 😉

Super ce petit script addon pour Cake-PHP. Je n’ai pas le temps de tester ça aujourd’hui mais je vais l’intégrer cette semaine je pense à mon Framework! CakePHP est vraiment le framework de référence pour les dev PHP

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *