public
Last active

Update function for Drupal 6 that is much more efficient than node_load

  • Download Gist
gistfile1.php
PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
/**
* Récupère la valeur liée à un champ CCK spécifique d'un node, sans avoir à
* charger le node dans son ensemble.
*
* @author defr
*
* @param int $nid
* L'identifiant du node
* @param string $field_name
* Le nom du champ dont on souhaite récuperer la valeur
*
* @return mixed
* La valeur du champ CCK, telle qu'elle se trouverait dans le node
* si ce dernier avait été intégrallement chargé.
*/
function aef_utilities_node_content_field_load($nid, $field_name){
static $nodes = array();
 
if (!isset($nodes[$nid]) || !isset($nodes[$nid]->$field_name)){
$node = db_fetch_object(db_query("SELECT nid, vid, type FROM {node} WHERE nid = %d", $nid));
$type = $node->type;
 
$type_def = content_types($type);
$field_types = _content_field_types();
// On vérifie que le champ fait bien partie de ceux qui sont définis suri
// ce type de contenu.
if (isset($type_def['fields'][$field_name])) {
// On récupère les informations sur la façon dont le champ est stocké
// en base via l'API de CCK.
$field_value = array();
$columns = array();
$field = $type_def['fields'][$field_name];
$db = content_database_info($field);
$schema = drupal_get_schema($db['table']);
foreach (array_keys($field['columns']) as $col_name) {
$columns[$col_name] = $field_name.'_'.$col_name;
}
// Si on a toutes les informations necessaires sur le nom des champs à
// récupèrer ainsi que leur emplacement en base de données, alors, on
// lance la requête SQL pour récupérer tout ça.
if (!empty($columns)) {
$values = db_query('SELECT %s FROM {%s} WHERE vid = %d ORDER BY '
.
(isset($schema['fields']['delta']) ? 'delta, ' : '')
.
'vid', implode(', ', $columns), $db['table'], $node->vid);
while($value = db_fetch_object($values)){
$items = array();
foreach($columns as $col_id => $col_name){
$items[$col_id] = $value->$col_name;
}
 
$field_value[] = $items;
}
}
 
// Maintenant que l'on a obtenu les informations stockées en base,
// et pour s'assurer d'être compatible avec l'ensemble des modules CCK,
// on vérifie si le module fournissant le type de champ implémente
// hook_field, et si c'est le cas, on l'invoque avec l'opération
// 'load' pour lui permettre de compléter et/ou transformer les
// informations que l'on a obtenu depuis la base.
$function = $field_types[$field['type']]['module'].'_field';
if (function_exists($function)) {
if (!empty($field_value)) {
foreach ($field_value as $key => $value) {
$items = array($field_name => $value);
$additions = $function('load', $node, $field, $items, NULL, NULL);
if (!empty($items[$field_name]) && is_array($additions[$field_name])) {
$items = array_merge($items[$field_name], $additions[$field_name]);
}
elseif (is_array($additions)) {
$items = $additions[$field_name];
}
$field_value[$key] = $items[$field_name];
}
}
else {
$items = array();
$additions = $function('load', $node, $field, $items, NULL, NULL);
if(!empty($items)) {
$items = array_merge($items, $additions);
}
else {
$items = $additions;
}
$field_value = $items[$field_name];
}
}
 
$nodes[$nid]->$field_name = $field_value;
}
}
 
return $nodes[$nid]->$field_name;
}

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.