Skip to content

@perusio /gist:4217487
Created

Embed URL

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Update function for Drupal 6 that is much more efficient than node_load
/**
* 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;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.