[Résolu] Partage des variables entre templates

Bonjour à tous

ma question est relativement générale, mais je vais prendre un exemple pour l'expliciter.

il s'agit du module user_relationships.
ce module offre une page relationships/requests qui liste les demandes d'amis en cours

cette page est construite grâce à une fonction et un template:
la fonction est la suivante:

function template_preprocess_user_relationships_pending_requests(&$variables) {
  global $user;

  // readability
  $account  =& $variables['account'];

  $msg = $account->uid == $user->uid ? t('My pending relationships') : t("%username's pending relationships", array('%username' => $account->name));
  $variables['title'] = $msg;

  $variables['relationships_per_page'] = variable_get('user_relationships_relationships_per_page', 16);

  $variables['sections'] = array(
    'requester_id' => 'sent_requests',
    'requestee_id' => 'received_requests'
  );
  $pager_id = 0;
  foreach ($variables['sections'] as $column => $section) {
    $query = _user_relationships_generate_query(array($column => $account->uid, 'approved' => FALSE), array('include_user_info' => TRUE));

    if ($relationships_per_page = variable_get('user_relationships_relationships_per_page', 16)) {
      $result = pager_query($query['query'], $variables['relationships_per_page'], $pager_id++, $query['count'], $query['arguments']);
    }
    else {
      $result = db_query($query['query'], $query['arguments']);
    }

    while ($relationship = db_fetch_object($result)) {
      user_relationships_api_translate_user_info($relationship);
      $variables[$section][$relationship->rid] = $relationship;
    }
  }
}

et le template nommé user_relationships_pending_requests.tpl.php est

<?php
// $Id: user_relationships_pending_requests.tpl.php,v 1.1.2.9 2010/01/03 20:17:43 alexk Exp $
/**
* @file
* Page to manage sent and received relationship requests
*/

  $output = '';
 
$pager_id = 0;
 
$section_headings = array(
   
'sent_requests'     => t('Sent Requests'),
   
'received_requests' => t('Received Requests')
  );

  foreach ($sections as $column => $section) {
    if (!isset($
$section)) { continue; }
   
$rows = array();

    $rows[] = array(
      array(
'data' => $section_headings[$section], 'header' => TRUE, 'colspan' => 2)
    );

    foreach ($$section as $relationship) {
     
$links = array();
      if (
$section == 'sent_requests') {
       
$links[] = theme('user_relationships_pending_request_cancel_link', $account->uid, $relationship->rid);
      }
      else {
       
$links[] = theme('user_relationships_pending_request_approve_link',    $account->uid, $relationship->rid);
       
$links[] = theme('user_relationships_pending_request_disapprove_link', $account->uid, $relationship->rid);
      }
     
$links = implode(' | ', $links);

      if ($relationship->requester_id == $account->uid) {
       
$rows[]   = array(t('@rel_name to !requestee', array('@rel_name' => ur_tt("user_relationships:rtid:$relationship->rtid:name", $relationship->name), '!requestee' => theme('username', $relationship->requestee))), $links);
      }
      else {
       
$rows[]   = array(t('@rel_name from !requester', array('@rel_name' => ur_tt("user_relationships:rtid:$relationship->rtid:name", $relationship->name), '!requester' => theme('username', $relationship->requester))), $links);
      }
    }

    $output .=
     
theme('table', array(), $rows, array('class' => 'user-relationships-pending-listing-table')).
     
theme('pager', NULL, $relationships_per_page, $pager_id++);
  }

  if ($output == '') {
   
$output = t('No pending relationships found');
  }

  print $output;
?>

je voudrais afficher le contenu de ce template dans un autre (page.tpl.php pour ne pas le nommer). Ainsi les demandes d'amis sont présentes ailleurs que sur la page relationships/requests

pourriez vous me donner une méthode pour réaliser cette inclusion de tpl.php et son partage de variables svp?

merci!

Forum : 
Version de Drupal : 

Les fonctions de preprocess, de theme ainsi que les éventuels templates sont appelés par la fonction theme suivant les directives trouvées dans le hook_theme.

En l'occurence, la c'est la fonction theme('user_relationships_pending_requests_page') qu'il faudra appeler.

Par exemple:
Dans ton thème, dans le fichier template.php tu viens ajouter:

function MON_THEME_preprocess_page(&$variables) {
  $variables['ma_variable'] = theme('user_relationships_pending_requests_page');
}

Après vidage du caches, tu auras accès dans ton fichier page.tpl.php à une variable $ma_variable contenant ce que tu désires

ok merci
ça fonctionne

par contre, je n'arrive pas à afficher le bon résultat.

il semble qu'il faille faire passer d'autres variables.

exemple:

dans la page à l'adresse 'relationships/requests' (page par défaut du module) j'ai
- une demande d'ami reçue en attente (qq1 m'a demandé)
- une demande d'ami envoyée en attente (j'ai demandé à qq1)

par contre, dans page.tpl.php le résultat est différent
il mélange les demandes d'amis reçues et envoyées et n'affiche pas les bons users
par contre, la forme est globalement la bonne
"demandes envoyées" : avec lien pour annuler la demande
"demandes reçues" : avec liens pour accepter ou refuser les demandes

peut être qu'il faut faire passer des variables en argument lorsqu'on appelle theme('user_relationships_pending_requests')

qu'est ce que tu en pense?

j'ai finalement trouvé
il fallait ajouter un argument à la fonction!

le résultat correct est donc:

<?php
function nmr_preprocess(&$variables, $hook) {
   global
$user;  
   switch (
$hook) {
       case
'page':
        
$variables['pending_requests']    = theme('user_relationships_pending_requests', $user);
       break;
}
}
?>