2010-10-26 20 views
0

J'ai une page qui affiche des données. La source des données ne sont pas des noeuds Drupal, donc Vues est sans moi d'utiliser:Partage de données avec des blocs

function mymodule_main_page($arg1, $arg2, $arg3) { 
    $results = call_remote_api_and_get_lots_of_results($arg1, $arg2, $arg3); 
    return theme('mymodule_page', $results, $arg1, $arg2, $arg3); 
} 

Mon module affiche également un bloc. Le but du bloc est de résumer les résultats qui ont été retournés dans le contenu de la page (par exemple: Nombre de résultats: X, Nombre de pages: Y, etc.)

/** 
* Implementation of hook_block(). 
*/ 
function mymodule_block($op = 'list', $delta = 0, $edit = array()) { 
    switch ($op) { 
    case 'view': 
     if ($delta == 0) { 
     $block['subject'] = t('Results summary'); 
     $block['content'] = theme('mymodule_results_summary'); 
     } 
     break; 
    } 
} 

Je dois éviter de générer à nouveau les résultats. Quel est le meilleur moyen pour mon bloc d'accéder à l'objet de résultat renvoyé dans la fonction qui a dessiné la page principale? Vars globales ou statiques? Existe-t-il un module qui tente déjà de résoudre ce problème?

+0

Est-ce que * call_remote_api_and_get_lots_of_results * est le vrai nom de votre fonction? –

+0

non, juste fait pour cette question :) – rcourtna

Répondre

0

En plus du système de cache que ya.teck mentionne, un moyen plus simple est de mettre en cache le bloc entier pendant x minutes, heures, jours. Drupal a un système de cache intégré pour tous les blocs. Vous pouvez voir quelques-uns des paramètres à admin/settings/performance

Mise à jour:
La façon dont les deux noyau et drupal contrib est d'utiliser une variable statique d'un tableau ou la variable réelle et stocker l'y soulever des objets lourds. Un exemple pourrait être node_load, qui stocke tous les nœuds chargés dans un tableau de sorte que chaque nœud n'a besoin d'être chargé qu'une seule fois lors de chaque requête.

+0

Merci, mais je ne suis pas intéressé par la mise en cache des blocs. Je suis intéressé par le partage de données avec mon bloc. – rcourtna

+0

@rcourtna Je vois ce que vous demandiez de mettre à jour ma réponse. – googletorp

0

Vous pouvez stocker vos données par système de cache drupal. Voir les fonctions cache_set et cache_get pour plus d'informations.

+0

Merci. Une chose que je n'aime pas à propos de cette solution est le trafic de base de données supplémentaire. Pour dessiner une page, j'ai besoin à la fois d'écrire et de lire dans les tables de cache. Cela ressemble à quelque chose qui devrait être seulement en mémoire puisque les données doivent seulement exister pour la demande de page en cours. – rcourtna

+0

Dans ce cas, ce n'est pas approprié. Vous pouvez créer un cache par requête par * static var dans la fonction call_remote_api_and_get_lots_of_results *. –

+0

Ok, c'est ce que je vais faire. J'ai cherché un module qui pourrait fournir une API qui vise à résoudre ce problème de manière généralisée, mais l'utilisation de vars statiques est assez simple. – rcourtna

1

Très bonne solution et flexible utilise les fonctions de base drupal cache_set et cache_get comme ya.teck mentionné mais étend sa fonctionnalité avec le module cacherouter. Vous pouvez spécifier des moteurs de stockage de cache et utiliser memcache ou de la mémoire partagée pour votre cache. Il n'utilise pas de base de données pour stocker des données et très rapidement.

+0

module très intéressant ... Je vais jouer avec. – rcourtna