Afficher un bloc Drupal sur une page externe à Drupal

écrit par Aymeric

Blocs Drupal

Quand vous utilisez Drupal sur un serveur et que vous souhaitez insérer un bloc Drupal sur un autre site, vous pouvez le faire via l'un des scripts ci-dessous pour par exemple récupérer le contenu d'un menu Drupal.
Le premier script va nous permettre de charger des éléments propres à Drupal en provenance de la base de données (blocs, noeuds par exemple) et de les écrire dans un include que l'on pourra charger via php par la suite (on peut lancer la régénération de l'include via un cron touts les jours).
Le deuxième script va aller chercher (en http://) un morceau de code directement sur le site Drupal pour l'intégrer dans un include.

Pour cet exemple, j'ai pris le cas d'un forum qui n'est pas sous Drupal et qui doit intégrer le menu de navigation du site Drupal avec lequel il est lié (menu susceptible de changer régulièrement), Drupal et le forum étant sur deux sous-domaines du même domaine.

1) Le site sur lequel on veut faire l'include se trouve sur le même serveur que Drupal:

J'ai modifié une partie du script trouvé ici: http://drupal.org/node/166409

<php?
//On force le sous domaine dans le cas d'une installation de Drupal 
//en multi-sites
$_SERVER['HTTP_HOST'] = 'monsitedrupal.mondomaine.com';
//on prépare l'include dans lequel on va écrire le code
$monmenuhtml=  fopen("/var/www/forum/include/menu_top.php", 'w');
// On se positionne dans le répertoire de Drupal
$drupal_path = "/var/www/drupal";
// $drupal_path étant votre répertoire d'installation de Drupal
$cdir = getcwd();
chdir($drupal_path);
// On inclus le fichier nécessaire à la connexion
include('includes/bootstrap.inc');
// On se connecte à Drupal et à la base de données
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
chdir($cdir);
// On invoque un bloc spécifique afin d'en récupérer son contenu:
$blockmenuhautout = module_invoke('block', 'block', 'view', 32);
$blockmenuhaut=$blockmenuhautout['content'];
// "32" correspond à l'ID du bloc
//(champ bid de la table blocks de la base MYSQL de Drupal)
//on modifie le chemin des liens du menu en rajoutant
//le bon sous-domaine
$blockmenuhaut=str_replace('href="/', 'href="http://monsitedrupal.mondomaine.com/',$blockmenuhautout);
fputs ($monmenuhtml, $blockmenuhautout);
fclose ($monmenuhtml);
?>

Il ne reste plus qu'à charger l' include /var/www/forum/include/menu_top.php dans notre template de forum.

2) Le site sur lequel on veut faire l'include se trouve sur un autre serveur que Drupal:

L'idée est de récupérer une partie de code HTML de la page http://monsitedrupal.mondomaine.com/ via CURL (menu dans notre cas), partie que l'on aura préalablement entouré de commentaires HTML afin de pouvoir identifier le bout de code souhaitée. J'ai ajouté une petite subtilité dans le code en supposant qu'on allait directement écrire le menu dans un fichier contenant déjà d'autres éléments.

Ce script ne fonctionne donc pas uniquement pour Drupal mais pour toute personne souhaitant récupérer du code HTML isolé quelque part en vue de l'intégrer ailleurs

<?php// recuperation du bloc menu sur la homepage du site sous Drupal
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"http://monsitedrupal.mondomaine.com/");
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
$result=curl_exec ($ch);
curl_close ($ch);

//On définit le schéma recherchée
$regext = '/<!--menublocdebut-->(.*?)<!--menublocfin-->/s';

//on récupère la chaîne de caractères qui nous intéresse
//pour la placer dans une variable $menu_haut
preg_match($regext, $result, $match);
$menu_haut=str_replace('href="/', 'href="http://monsitedrupal.mondomaine.com',$match[0]);

//on fait une petite sauvegarde du dernier include généré, au cas où...
$tmp=file_get_contents('/var/www/forum/include/menu_top.php');
file_put_contents('/var/www/forum/include/menu_top_backup.php', $tmp);

//on place le contenu de l'include dans une variable
$contenudufichier= file_get_contents('/var/www/forum/include/menu_top.php');

//on décrit un schéma pour isoler la partie de code que l'on souhaite remplacer
$regint = '/<!--menublocdebut-->(.*?)<!--menublocfin-->/s';

//on remplace l'ancien menu de navigation par le nouveau précédemment
//placé dans la variable $menu_haut
$contenudufichier= preg_replace($regint, $menu_haut, $contenudufichier);

//On écrit le résultat dans l'include contenant le menu et d'autres éléments
file_put_contents('/var/www/forum/include/menu_top.php', $contentfile);
?>

Il y a d'autres méthodes, peut être plus simples ou plus propres mais je suis partie là dessus, et ça fonctionne. N'hésitez pas à me laisser vos avis (ou commentaires si jamais vous rencontriez des problèmes de mise en place)!

écrit dans Drupal par Aymeric | Commentaires fermés sur Afficher un bloc Drupal sur une page externe à Drupal

Les commentaires sont fermés.